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.
Закрыть окно