Книга: C# для профессионалов. Том II
Рисование фигур с помощью OnPaint
Рисование фигур с помощью OnPaint
Если приведенное выше объяснение заставило вас подумать, что рисование своего собственного пользовательского интерфейса будет очень сложной задачей, то не стоит волноваться. Это не так. Были приведены различные детали процесса, для того чтобы вы поняли, с какими проблемами столкнетесь. Но заставить приложение перерисовать себя, когда необходимо, — в действительности легкая задача.
Когда возникает необходимость, Windows уведомляет приложение, что требуется выполнить некоторую перерисовку изображения, инициируя событие Paint
. Интересно то, что класс Form
уже реализовал обработчик для этого события, поэтому не нужно создавать свой собственный. Можно воспользоваться этой архитектурой, исходя из факта, что обработчик Form1
для события Paint
будет вызывать в процессе обработки виртуальный метод OnPaint()
, передавая в него единственный параметр PaintEventArgs
. Это означает, что для выполнения рисования необходимо просто переопределить метод OnPaint()
. Мы создадим для этого новый пример, называемый DrawShapes
. Как и раньше, определяем DrawShapes
как приложение Windows, генерируемое с помощью Visual Studio.NET, и добавим следующий код класса Form1
:
protected override void OnPaint(PaintEventArgs e) {
Graphics dc = e.Graphics;
Pen BluePen = new Pen(Color.Blue, 3);
dc.DrawRectangle(BluePen, 0, 0, 50, 50);
Pen RedPen = new Pen(Color.Red, 2);
dc.DrawEllipse(RedPen, 0, 50, 80, 60);
base.OnPaint(e);
}
Отметим, что метод OnPaint()
объявлен как protected
. OnPaint()
обычно используется внутри класса, поэтому нет необходимости любому другому коду вне класса знать о его существовании.
PaintEventArgs
является производным классом от EventArgs
, используемого обычно для передачи информации о событиях. PaintEventArgs
имеет два дополнительных свойства, из которых наиболее важным является экземпляр Graphics
, уже настроенный и оптимизированный для рисования требуемой части окна. Это означает, что нам не нужно вызывать CreateGraphics()
, чтобы получить контекст устройства в методе OnPaint()
, — он уже существует. Мы вскоре рассмотрим другое дополнительное свойство, оно содержит более подробную информацию о том, какая область окна действительно нуждается в перерисовке.
В данной реализации метода OnPaint()
мы сначала получаем ссылку на объект Graphics
из PaintEventArgs
, затем рисуем фигуры так же, как это делалось раньше. В конце вызывается метод OnPaint()
базового класса. Этот шаг является важным. Мы переопределили OnPaint()
для выполнения нашего собственного рисования, но возможно, что Windows должен выполнить свою собственную работу в процессе рисования, и такая работа будет связана с методом OnPaint()
в одном из базовых классов .NET.
Для этого примера может оказаться, что удаление вызова base.OnPaint()
не оказывает никакого влияния на работу, но никогда не пытайтесь удалить вызов. Это может привести к некорректному завершению работы Windows и непредсказуемым результатам.
OnPaint()
будет также вызываться, когда приложение впервые запускается и окно приложения выводится в первый раз, поэтому нет необходимости дублировать код рисования в конструкторе, хотя по-прежнему нужно задать здесь цвет фона и все другие свойства формы. Это обычно задается либо добавлением команды явно, либо заданием цвета в окне свойств Visual Studio.NET:
private void InitializeComponent() {
this.components = new System.ComponentModel.Container();
this.Size = new System.Drawing.Size(300, 300);
this.Text = "Draw Shapes";
this.BackColor = Color.White;
}
Выполнение этого кода вначале дает те же результаты, что и в предыдущем примере, за исключением того, что теперь приложение ведет себя правильно, когда окно минимизируется или скрывается его часть.
- Сеансы Paint
- Графическое рисование
- Рисование сложных фигур
- Повышение производительности приложений с помощью хранимых процедур
- Тестирование Web-сервиса XML с помощью WebDev.WebServer.exe
- Организация пользователей в группы с помощью ролей
- Конфигурация безопасности для базы данных
- Хранение конфигурации в системном реестре
- Конфигурирование
- Параметры конфигурационного файла InterBase
- Конфигурирование жестких дисков
- 12.2. Файлы конфигураци исервера