Отрисовка элементов управления Windows Forms
Визуализации — это процесс создания визуального представления на экране пользователя. Windows Forms используется GDI (новая Windows графическая библиотека) для подготовки к просмотру. Управляемые классы, предоставляющие доступ к GDI в System.Drawing пространства имен и его подпространства имен.
Следующие элементы участвуют в отрисовке элемента управления.
Рисования функциональных возможностях, предоставляемых базовым классом System.Windows.Forms.Control.
Основные GDI графической библиотеки.
Геометрия области рисования.
Процедура освобождения графических ресурсов.
Функции рисования, обеспечиваемые элементом управления
Базовый класс Control предоставляет функциональные возможности рисования посредством его Paint событий. Элемент управления вызывает Paint событие при каждой попытке обновления его отображения. Дополнительные сведения о событиях в .NET Framework, см. в разделе обработка и вызов событий.
Класс данных события для Paint событий, PaintEventArgs, содержащий данные, необходимые для рисования элемента управления — дескриптора графический объект и объект прямоугольник, представляющий область для рисования. Эти объекты отображаются в полужирным шрифтом в следующем фрагменте кода.
Public Class PaintEventArgs
Inherits EventArgs
Implements IDisposable
Public ReadOnly Property ClipRectangle() As System.Drawing.Rectangle
...
End Property
Public ReadOnly Property Graphics() As System.Drawing.Graphics
...
End Property
' Other properties and methods.
...
End Class
public class PaintEventArgs : EventArgs, IDisposable {
public System.Drawing.Rectangle ClipRectangle {get;}
public System.Drawing.Graphics Graphics {get;}
// Other properties and methods.
...
}
Graphics — Это управляемый класс, инкапсулирующий функциональность рисования, как описано в разделе, GDI далее в этом разделе. ClipRectangle Является экземпляром класса Rectangle структурировать и определяет доступные области, в котором можно нарисовать элемент управления. Разработчик элемента управления можно рассчитать ClipRectangle с помощью ClipRectangle свойства элемента управления, как описано в описании геометрии далее в этом разделе.
Элемент управления должен предоставить логику отрисовки путем переопределения OnPaint метод, который наследует от Control. OnPaint Получает доступ к графический объект и прямоугольника для рисования с помощью Graphics и ClipRectangle свойства PaintEventArgs переданным ему экземпляром.
Protected Overridable Sub OnPaint(pe As PaintEventArgs)
protected virtual void OnPaint(PaintEventArgs pe);
OnPaint Метод базового Control класс не реализует какой-либо функциональности, но просто вызывает делегаты событий, зарегистрированные в Paint событий. При переопределении OnPaint, как правило, следует вызвать OnPaint получать метод базового класса, чтобы зарегистрированные делегаты Paint событий. Тем не менее, элементы управления, их всю поверхность рисования не следует вызывать базовый класс OnPaint, как это вызовет мерцание. Пример переопределения OnPaint событий, см. в разделе как: Создание элемента управления Windows Forms, показывающего прогресс.
Note
Они не вызывают OnPaint непосредственно из вашего элемента управления; вместо этого вызовите Invalidate метод (наследуется от Control) или другим методом, который вызывает Invalidate. Invalidate В свою очередь вызывает метод OnPaint. Invalidate Метод перегружен, и, в зависимости от аргументов предоставляемое Invalidate e
, перерисовывает элемент управления, некоторые или все его области экрана.
Базовый Control класс определяет другой метод, который используется для рисования — OnPaintBackground метод.
Protected Overridable Sub OnPaintBackground(pevent As PaintEventArgs)
protected virtual void OnPaintBackground(PaintEventArgs pevent);
OnPaintBackground Закрашивает фон (и тем самым фигуры) окна и гарантированно будет выполняться быстро, при OnPaint рисует детали и могут работать медленнее, так как индивидуальные запросы на рисование объединены в один Paint событие, которое охватывает все области, которые должны быть перерисовки. Может возникнуть необходимость вызвать OnPaintBackground Если, к примеру, требуется нарисовать градиентной заливкой фон для элемента управления.
Хотя OnPaintBackground имеет аналогичное номенклатуру и принимает того же аргумента как OnPaint
метода OnPaintBackground не является методом значение true, событие. Существует не PaintBackground
событий и OnPaintBackground вызывает делегаты событий. При переопределении метода OnPaintBackground метода производного класса не требуется для вызова OnPaintBackground метод базового класса.
Основные сведения о GDI +
Graphics Класс предоставляет методы для рисования различных фигур, таких как круги, треугольники, дуги и эллипсы, а также методы для отображения текста. System.Drawing Пространство имен и его подпространства имен содержат классы, инкапсулирующие графические элементы, такие как фигуры (круги, прямоугольники, дуги и другие), цвета, шрифты, кистей и т. д. Дополнительные сведения о GDI, см. в разделе использование управляемых графических классов. Основы GDI также описаны в как: Создание элемента управления Windows Forms, показывающего прогресс.
Геометрия области рисования
ClientRectangle Свойства элемента управления задает прямоугольную область, доступную для элемента управления на экране пользователя, хотя ClipRectangle свойство PaintEventArgs задает область, которая фактически закрашивается. (Помните, что рисование выполняется в Paint событие метода, принимающего PaintEventArgs экземпляр в качестве аргумента). Элемент управления может потребоваться рисовать только часть ее доступной области, как в случае изменения отображения элемента управления при небольшом разделе. В этих случаях разработчик элемента управления следует вычислять фактическое прямоугольника для рисования и передать его Invalidate. Перегруженные версии Invalidate , принимающих Rectangle или Region в качестве аргумента, используют этот аргумент для создания ClipRectangle свойство PaintEventArgs.
В следующем фрагменте кода показано как FlashTrackBar
прямоугольную область для рисования вычисляет пользовательского элемента управления. client
Обозначает переменную ClipRectangle свойство. Полный пример см. в разделе как: Создание элемента управления Windows Forms, показывающего прогресс.
Rectangle invalid = new Rectangle(
client.X + min,
client.Y,
max - min,
client.Height);
Invalidate(invalid);
Освобождение ресурсов графики
Графические объекты ресурсоемки, потому что они используют системные ресурсы. Такие объекты содержат экземпляры System.Drawing.Graphics класса, а также экземпляры System.Drawing.Brush, System.Drawing.Penи другие графические классы. Очень важно, создания ресурса графики, только в том случае, когда она необходима и отпустите его сразу после его использования. Если вы создаете тип, реализующий IDisposable интерфейс, вызовите его Dispose метод, когда вы закончите с ним для освобождения ресурсов.
В следующем фрагменте кода показано как FlashTrackBar
пользовательский элемент управления создает и освобождает Brush ресурсов. Полный исходный код, см. в разделе как: Создание элемента управления Windows Forms, показывающего прогресс.
private Brush baseBackground = null;
base.OnPaint(e);
if (baseBackground == null) {
if (showGradient) {
baseBackground = new LinearGradientBrush(new Point(0, 0),
new Point(ClientSize.Width, 0),
StartColor,
EndColor);
}
else if (BackgroundImage != null) {
baseBackground = new TextureBrush(BackgroundImage);
}
else {
baseBackground = new SolidBrush(BackColor);
}
}
protected override void OnResize(EventArgs e) {
base.OnResize(e);
if (baseBackground != null) {
baseBackground.Dispose();
baseBackground = null;
}
}