Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лр3_Компоненты.doc
Скачиваний:
3
Добавлен:
01.09.2019
Размер:
761.86 Кб
Скачать

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(); }