using System; using System.Collections; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Data; using System.Windows.Forms; namespace StrangeControls { // Summary description for RoundButton. // Хотя класс RoundButton и объявляется на основе базового // класса Button, внешнее представление его // объектов-представителей реализуется в переопределяемом // методе OnPaint с использованием класса ImageList. public class RoundButton : Button { ImageList imgList; // Внешнее представление элемента управления меняется // в зависимости от состояния элемента. Это состояние // зависит от конкретных событий, происходящих с элементом // управления. // Индекс, который используется при изменении внешнего // представления элемента управления. // Внешний вид элемента управления определяется значением // переменной indexB, которая меняет значение в рамках // переопределяемых обработчиков событий. // Функциональность данного элемента управления задана // в классе формы, в виде стандартных (непереопределяемых) обработчиков. int indexB; public RoundButton():base() { indexB = 0; imgList = new ImageList(); imgList.Images.Add(Image.FromFile(@"jpg0.jpg")); imgList.Images.Add(Image.FromFile(@"jpg1.jpg")); imgList.Images.Add(Image.FromFile(@"jpg2.jpg")); imgList.Images.Add(Image.FromFile(@"jpg3.jpg")); this.ImageList=imgList; } // Код, управляющий изменением внешнего вида элемента. // Сюда передается управление в результате выполнения метода // Refresh(). protected override void OnPaint(PaintEventArgs e) { GraphicsPath gp = new GraphicsPath(); gp.AddEllipse(10,10,50,50); Region reg = new Region(gp); // Свойству Region присваивается новое значение – новый регион! this.Region = reg; e.Graphics.DrawImage(ImageList.Images[indexB],10,10,50,50); } protected override void OnClick(EventArgs e) { indexB = 0; this.Refresh(); base.OnClick (e); } protected override void OnMouseDown(MouseEventArgs e) { indexB = 1; this.Refresh(); base.OnMouseDown (e); } protected override void OnGotFocus(EventArgs e) { indexB = 0; this.Refresh(); base.OnGotFocus (e); } protected override void OnLostFocus(EventArgs e) { indexB = 0; this.Refresh(); base.OnLostFocus(e); } protected override void OnMouseEnter(EventArgs e) { indexB = 2; this.Refresh(); base.OnMouseEnter (e); } protected override void OnMouseLeave(EventArgs e) { indexB = 3; this.Refresh(); base.OnMouseLeave (e); } private void InitializeComponent() { // // RoundButton // } } } |
Листинг 17.5. |
Закрыть окно |