- •Тверской государственный технический университет
- •Создание пользовательских компонент.
- •1. Теоретическая часть.
- •1.1. Общая архитектура компонент.
- •1.2. Основные принципы создания элементов управления
- •1.2.1. Наследование от существующих элементов управления
- •1.2.2. Создание составных элементов управления
- •Как создать составной элемент управления
- •1.2.3. Создание формируемых элементов управления
- •Как создать формируемый элемент управления
- •1.3. Отладка элементов управления
- •1.3.1. Отладка компонентов в режиме разработки.
- •1.3.2. Отладка элемента управления в проекте Windows Forms
- •1.3.3. Отладка элемента управления в проекте библиотеки классов или элементов управления
- •1.4. Добавление элементов управления на панель Toolbox.
- •1.5. Назначение значка элементу управления
- •2.1.2. Программная реализация компоненты.
- •2.1.3. Добавление информации о свойствах.
- •2.1.4. Реакция на изменение свойства.
- •2.1.5. Добавление событий.
- •2.2. Создание 2-го нестандартного элемента управления
- •2.2.1. Описание элемента управления
- •2.2.2. Создание проекта
- •2.2.3. Программная реализация элемента управления.
- •2.2.4. Настройка компонента Timer
- •2.2.5. Тестирование элемента управления
- •2.3. Создание собственного элемента пользовательского интерфейса.
- •3. Задание на лабораторную работу
- •4. Содержание отчета по лабораторной работе
- •Литература:
2.1.2. Программная реализация компоненты.
Для того, чтобы сделать в новой компоненте градиентную заливку добавим в нее два свойства StartColor и EndColor, которые будут соответствовать цветам начала и завершения градиента, и переопределим метод OnPaint(), внутри которого будем рисовать градиентную заливку (листинг 5.1). По умолчанию заливка будет переходить от ярко-зеленого (Light Green) к темно-синему (Dark Blue) цвету. Результат показан на рис.5.3.
Класс GradientLabel станет нашим базовым проектом, с помощью которого мы будем изучать средства времени разработки.
//Листинг 5.1. Класс GradientLabel.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Data;
using System.Text;
using System.Windows.Forms;
namespace MyControl
{
public partial class GradientLabel : Label
{
private Color startColor = Color.LightGreen;
private Color endColor = Color.DarkBlue;
public GradientLabel(){ InitializeComponent(); }
public Color StartColor
{
get{ return startColor; }
set{ startColor = value; }
}
public Color EndColor
{
get{ return endColor; }
set{ endColor = value; }
}
protected override void OnPaint(PaintEventArgs pe)
{
Base.OnPaint(pe); // Вызываем базовый метод OnPaint()
Color c1 = Color.FromArgb(100, startColor);
Color c2 = Color.FromArgb(100, endColor);
Brush b = new LinearGradientBrush(ClientRectangle, c1, c2, 10);
pe.Graphics.FillRectangle(b, ClientRectangle);
b.Dispose();
}
}
}
2.1.3. Добавление информации о свойствах.
Откроем окно свойств нашего компонента (например, с помощью меню Property по щелчку правой кнопки мыши). Как видно из рис.5.4 , два наших новых свойства видны в списке, но, к сожалению, совершенно не информативны.
Рис.5.4. Пока новые свойства не информативны.
Добавить информацию о свойствах позволяют специальные атрибуты Category и Description.
Атрибут Category определяет название категории, к которой относится свойство. Если он не указан, то свойство считается относящимся к категории Misc. Для объединения свойств по категориям надо нажать самую левую кнопку в окне редактора свойств.
Атрибут Description позволяет задать некоторое строковое описание, которое будет давать представление о свойстве и его назначении.
Пример описания информации о свойствах показан в листинге 5.2, а результат – в окне свойств с информацией на рис.5.5.
Рис.5.5. Теперь свойство имеет текстовое описание и категорию "Gradient".
Листинг 5.2. Добавление информации о свойствах.
[Category("Gradient"), Description("Цвет начала заливки")]
public Color StartColor
{
get{ return startColor; }
set{ startColor = value; }
}
[Category("Gradient"), Description("Цвет завершения заливки")]
public Color EndColor
{
get{ return endColor; }
set{ endColor = value; }
}
2.1.4. Реакция на изменение свойства.
Легко было заметить, что изменение значений наших свойств startColor и endColor на виде самой компоненты сказывается совсем не сразу. Точнее оно отображается при любой вынужденной перерисовке компоненты, например, при смене выделенной компоненты. Это происходит потому, что никто не сообщает компоненте о том, что нужно перерисовать саму себя.
Небольшое изменение программного кода решает этот вопрос (листинг 5.3). Теперь при изменении значения свойства мы сразу видим на форме и результат этого изменения, поскольку метод Invalidate() заставляет компоненту перерисовать себя. Но при этом метод Paint() не вызывается напрямую, поскольку это было бы некорректно по отношению к Windows, поскольку заставляет компоненту перерисовываться независимо от того, нужно ли это операционной системе или нет. Метод Invalidate() более "нежен" в этом отношении – компонента будет перерисовываться тогда, когда у операционной системы дойдет до нее время.
Листинг 5.3. Добавление информации о свойствах в классе GradientLabel.
[Category("Gradient"), Description("Цвет начала заливки"), DefaultValue(typeof(Color),
"LightGreen")]
public Color StartColor
{
get{ return startColor; }
set{ startColor = value; OnChangeProperties(); }
}
[Category("Gradient"), Description("Цвет завершения заливки"), DefaultValue(typeof(Color),
"DarkBlue")]
public Color EndColor
{
get{ return endColor; }
set{ endColor = value; OnChangeProperties(); }
}
// Перерисовать себя при изменении свойств
private void OnChangeProperties(){ Invalidate(); }