Украина, Киев |
Рисование графических примитивов средствами GDI+
Рисование графических примитивов средствами GDI+
Файлы к лабораторной работе Вы можете скачать здесь.
Компьютерная графика делится на два вида:
- Векторная графика - практическое применение аналитической геометрии, включая рисование линий и заливку замкнутых областей, а также отображение текста с различными атрибутами.
- Растровая графика - включает битовые карты и изображения предметов реального мира.
Ниже мы познакомимся с векторной графикой в том виде, в каком она реализована в Microsoft Windows Forms и GDI+. Все рассматриваемые здесь функции рисования являются методами класса Graphics и начинаются с префикса Draw (рисуют линии) или Fill (выполняют заливку в границах).
Для рисования нужен объект Graphics, который определяет контекст устройства. Класс System.Drawing.Graphics объявлен как sealed (не поддерживает наследование) и его конструктор не является открытым, поэтому напрямую создать объект Graphics нельзя
- Graphics gr = new Graphics(); // Нельзя!!!
- class MyGraphics : Graphics{}; MyGraphics gr = new MyGraphics(); // Тоже нельзя!!!
Способы создания объекта Graphics
Для создания объекта Graphics можно применить один из следующих способов:
- При переопределении метода OnPaint() или создании
обработчика события Paint в любом классе, производном от System.Windows.Forms.Control (например, Form) мы получаем
объект Graphics как свойство Graphics класса PaintEventArgs
class MyGraphics : Form { public MyGraphics() { this.Paint +=new PaintEventHandler(MyGraphics_Paint); } private void MyGraphics_Paint(object sender, PaintEventArgs e) { Graphics graphics = e.Graphics; // Это верно! } }
Листинг 16.1. Способ создания объекта Graphics - Для рисования на форме или элементе управления
(все они наследуют Control ) не только в
замещенном методе OnPaint() или обработчике события Paint,
но и в других местах программы, можно вызывать метод CreateGraphics() этого элемента управления.
Часто классы вызывают метод CreateGraphics() в своих конструкторах, чтобы получить нужные данные о GDI+ или выполнить инициализацию. Элементы управления или формы могут также рисовать во время событий мыши, клавиатуры или таймера, временно создавая и освобождая объект Graphics (контекст устройства). Главное, чтобы объект Graphics создавался только на период обработки события, и ни в коем случае не хранился в поле класса. По завершении использования объекта graphics программа должна немедленно вызывать его метод graphics.Dispose(), чтобы отдать контекст устройства другим программам.
- Можно получить объект типа System.Drawing.Printing.PrintPageEventArgs, который в свойстве содержит подходящий для данного принтера объект Graphics, установив обработчик события PrintPage при печати.
- У некоторых элементов управления (меню, списков, строк состояния) есть свойство OwnerDraw, позволяющее программе динамически рисовать на этом элементе управления. События MeasureItem и DrawItem передают своим обработчикам в аргументах объекты типа MeasureItemEventArgs и DrawItemEventArgs, у которых в свойствах имеется объект Graphics и который можно использовать в обработчике для рисования.
- Чтобы рисовать по битовой карте или метафайлу, нужно получить специальный объект Graphics, вызвав статический метод Graphics.FromImage().
- Если нужно получить информацию из объекта Graphics, связанного с принтером, не печатая никаких данных, можно использовать метод CreateMeasurementGraphics() объекта класса System.Drawing.Printing.PrinterSettings
- При взаимодействии с кодом Win32 получить объект Graphics позволяют статические методы уровня класса Graphics.FromHdc() и Graphics.FromHwnd()