* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна!
Создание элемента управления
8 февраля 2009
Сейчас вы создадите нестандартный элемент управления PrettyClock. Он относится к формируемым элементам управления, поскольку вы объяви- те его на основе класса Control, самостоятельно напишете код, отвечаю- щий за визуализацию этого элемента управления, и откроете доступ к свойствам, управляющим его обликом. В завершение вы добавите таймер, чтобы наши часы могли служить по прямому назначению.
*• Создание проекта 1. В меню File выберите команду New\Project — откроется диалоговое окно New Project. 2. В окне New Project выберите шаблон Windows Application, назовите новый про- ект ControlTest.vb (или ControlTest.cs) и щелкните ОК. 3. В меню Project выберите команду Add New Item — откроется одноименное диа- логовое окно. 4. В диалоговом окне Add New Item выберите Custom Control, назовите новый эле- мент управления соответственно PrettyClock.vb или (PrettyClock.cs) и щелкните Open — к проекту будет добавлен новый нестандартный элемент управления. 5. В окне Solution Explorer щелкните правой кнопкой элемент управления Pretty- Clock и выберите из контекстного меню команду View Code — откроется окно Code. Обратите внимание, что метод OnPaint переопределен и содержит вместо реализации заглушку и комментарий, указывающий, что сюда нужно добавить код, выполняющий визуализацию. Теперь пора писать код. Наш элемент управления будет отображать текущее вре- мя в прямоугольной области экрана. Для его прорисовки применяется метод Linear- GradieniBrush, поддерживающий интересные графические эффекты. Вы также реа- лизуете у своего элемента управления свойства, позволяющие разработчикам уп- равлять его обликом Е период выполнения. 1. В окне редактора кода поместите в начало кода следующие операторы, импор- тирующие пространства имен Sysfem. Drawing и System.Drawing. Drawing2D: Visual Basic .NET Imports System. Drawing Imports System. Drawing. Drawing2D Visual C# // В С# опеэатор "using System. Drawing; ' добавлен по умолчанию using System. Drawing. Drawing2D; 2. Добавьте свойства, хранящие описание цвета. Оно, вместе со свойством Fore- Color, унаследованным от базового класса, предназначено для создания объекта LinearGradient Brush, визуализирующего нестандартный элемент управления. Вот примерный код этого свойства: Visual Basic .NET Объявить закрытую переменную для хранения значения Color. Private rriForeColorTwo As Color Это реализация свойства. Public Property ForeColorTwo() As Color Get Return mForeColorTwo End Get Set(ByVal Value As Color) mForeColorTwo - Value End Set End Property Visual C# // Объявить закрытую переменную для хранения значения Color, orivate Color mForeColorTwo; // Это реализация свойства. public Color ForeColorTwo { g - { return mForeColorTwo; ; set { mForeColorTwo = value; 3. Добавьте свойство Angle типа Single (float) для хранения значения угла, необхо- димого методу LinearGradient Brush. Поскольку его значение выражается в граду- сах, потребуется код, проверяющий, что введенное значение не меньше 0 и не больше 360. Вот код этого свойства: Visual Basic .NET Private mAngle As Single Public Property Angle{) As Single Get Return mAngle End Get Set(8yVal Value As Single) ' Такая схема устанавливает минимальное значение при попытке ' ввести слишком большее значение и наоборот. Это обеспечивает 1 непрерывное приращение значения свойства. If Value > 360 then mAngle = О Elself Value < 0 then TiAngle = 360 Else mAngle = Value End If End Set End Property Visual C# private float mAngle; public float Angle { get ! return rnAngle; } set ! // Такая схема устанавливает минимальное значение при попытке // ввести слишком большее значение и наоборот. Это обеспечивает // непрерывное приращение значения свойства, if (value > 360) mAngle = 0; else if (value < 0) mAngle = 360; else mAngle = value; > : 4. Добавьте в метод OnPaint код, создающий объект LinearGradient Brush и отобра- жающий текущее время с помощью объекта Font. Для создания объекта Linear- GradientBrush вам потребуются свойства Size, ForeColom ForeColorTwo, которые можно использовать так: Visual Basic .NET Создать представляющий элемент управления прямоугольник, заданный точкой верхнего левого угла и свойством Size. Dim ControlRectangle As New Rectangle(New PointfO, 0), Me.Size) Создать новый объект LinearGradientBrush, определяющий переход между цветами ForeColor и ForeColorTwo с учетом заданного угла, Dim myBrusn As New LinearGradientBrush(ControlRectangle, ForeColor, ForeColorTwo, Angle) Создать объект GraphicsPath, хранящий отображаемый текст, Dim myPath As New GraphicsPathO Записать в объект GraphicsPath строку, представляющую текущее время. TiyPath. AddSt ring (Now. ToLongTimeSt ring ()r Font. FontFamily, Font.Style, Font.Size, New PointfO. 0). StringFormat.GenericDefault) Показать Graphics, pe.Graphics.FillPath(my6rush, myPath) Visual C# // Создать представляющий элемент управления прямоугольник, заданный // точкой верхнего левого угла и свойством Size. Rectangle ControlRectangle = new Rectangle(new PointfO, 0), this.Size); // Создать новый объект LinearGradientBrush, определяющий переход // между цветами ForeColor и ForeColorTwo с учетом заданного угла. LinearGradientBrush myBrush = new LinearGradientBrush(ControlRectangle, ForeColor, ForeColorTwo, Angle); // Создать объект GraphicsPath, хранящий отображаемый текст. GraphicsPath myPath = new GraphicsPathO; // Записать в объект GrapnicsPath строку, представляющую текущее врем?'. myPath.AddString(System.DateTime.Now.ToLongTimeString(), Font.FontFamily, (int)Font.Style, Font.Size, new PointfO, 0), StringFormat.GenericDefault); // Показать Graphics, pe.Graphics.FillPath(myBrush, myPath); Теперь поместите код для создания нового пера из объекта LinearGradientBrush. Прорисуйте этим пером прямоугольник, представляющий область элемента управления. Для этого потребуется следующий код: Visual Basic .NET 1 Создать из объекта myBrush перо толщиной 8 пикселов Dim myPen As New Pen(my8riish, 8) и нарисовать им прямоугольник, совпадающий с областью элемента управления, ре.Graphics,DrawRectangle(rnyPen, ControlRectangle) Visual C# // Создато из объекта myBrush перо толщиной 8 пикселов Реп myPen = new Pen(myBrush, 8); // и нарисовать им прямоугольник, совпадающий с областью элемента управления. pe.Graphics.DrawRectangle(myPen, ControlRectangle): 6. Выберите в меню File команду Save All, чтобы сохранить проект. Сейчас вы добавите в конструктор код, инициализирующий свойства элемента управления. Кроме того, вы добавите компонент Timer и код для ежесекундной пе- рерисовки часов и отображения интересного графического эффекта. ^ Настройка компонента Timer 1. В окне Solution Explorer щелкните правой кнопкой компонент PrettyClock к вы- берите из контекстного меню команду View Designer — откроется окно дизайнера. 2. Перетащите компонент Timer с вкладки Windows Forms панели Toolbox на по- верхность формы. 3. В окне Properties установите свойства Interval в 1000, а свойство Enabled ~ в true. 4. Дважды щелкните компонент Тшегв окне дизайнера, чтобы открыть обработ- чик событий Timer.Tick, и добавьте к нему следующий код: Visual Basic .NET Этот кода изменяет вид графического эффекта при изменении значения Tick. Angle += 10 Перерисовать элемент управления. Me.Refresh() Visual C# // Этот кода изменяет вид графического зффекта при изменении значения Tick. Angle +- 10; // Перерисовать элемент управления. this.Refresh(); 5. В Visual C# необходимо добавить к конструктору элемента управления вызов метода fnitializeComponent, инициализирующего свойства этого элемента управ- ления: Visual C# public PrettyClockO { InitializeComponentO; } 6. Сохраните проект, выбрав команду Save All в меню File.