Опубликован: 13.07.2010 | Уровень: специалист | Доступ: платный
Самостоятельная работа 16:

Рисование графических примитивов средствами GDI+

Аннотация: В лекции рассматриваются два вида компьютерной графики: векторная и растровая графика. Способы создания объекта Graphics. Рисование прямых линий. Использование некоторых возможностей печати документа. Разделение кода вывода на экран и печать. Рисование ломаных линий и домика ломаными линиями. Применение функции DrawLines() для рисования графиков. Параметрические уравнения и рисование кривых. Рисование эллипса специализированным методом, спирали, прямоугольников, дуг. Рисование прямоугольника с закругленными углами и секторов. Улучшенное рисование секторов. Заливка прямоугольников, эллипсов и секторов.
Ключевые слова: графика, геометрия, Microsoft Windows, GDI, Graphics, fill, объект, контекст, класс, наследование, конструктор, переопределение метода, paint, замещенный метод, таймер, поле класса, управление событиями, статические методы, win32, оболочка, подкаталог, испытание, конструктор класса, commonality, generality, параметр, startup, значение, net, Toolbox, dock, Эллипс, интерфейс, event, permanent, templates, переименование файлов, библиотека FCL, class library, pen, brush, очередь, контур, color, system, drawing, свойство класса, пользователь, Width, высота, Height, нумерация, пункт, меню, control, Object, true, false, печатающее устройство, rectangle, ориентация страницы, печатающая головка, black, печать, программа, вывод, функция, прямой, form, производительность, аппроксимация, point, визуализация, виртуальный метод, math, double, тип float, single-ended, компилятор, аргумент, Окружность, радиус, координаты, график, выход, операции, процессор, операнд, вычитание, прямоугольник, пиксел, дуга, перегруженный метод, путь, draw, перечисление, alternate, звезда

Рисование графических примитивов средствами GDI+

Файлы к лабораторной работе Вы можете скачать здесь.

Компьютерная графика делится на два вида:

  1. Векторная графика - практическое применение аналитической геометрии, включая рисование линий и заливку замкнутых областей, а также отображение текста с различными атрибутами.
  2. Растровая графика - включает битовые карты и изображения предметов реального мира.

Ниже мы познакомимся с векторной графикой в том виде, в каком она реализована в Microsoft Windows Forms и GDI+. Все рассматриваемые здесь функции рисования являются методами класса Graphics и начинаются с префикса Draw (рисуют линии) или Fill (выполняют заливку в границах).

Для рисования нужен объект Graphics, который определяет контекст устройства. Класс System.Drawing.Graphics объявлен как sealed (не поддерживает наследование) и его конструктор не является открытым, поэтому напрямую создать объект Graphics нельзя

  1. Graphics gr = new Graphics(); // Нельзя!!!
  2. class MyGraphics : Graphics{}; MyGraphics gr = new MyGraphics(); // Тоже нельзя!!!

Способы создания объекта Graphics

Для создания объекта Graphics можно применить один из следующих способов:

  1. При переопределении метода 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
  2. Для рисования на форме или элементе управления (все они наследуют Control ) не только в замещенном методе OnPaint() или обработчике события Paint, но и в других местах программы, можно вызывать метод CreateGraphics() этого элемента управления.


    Часто классы вызывают метод CreateGraphics() в своих конструкторах, чтобы получить нужные данные о GDI+ или выполнить инициализацию. Элементы управления или формы могут также рисовать во время событий мыши, клавиатуры или таймера, временно создавая и освобождая объект Graphics (контекст устройства). Главное, чтобы объект Graphics создавался только на период обработки события, и ни в коем случае не хранился в поле класса. По завершении использования объекта graphics программа должна немедленно вызывать его метод graphics.Dispose(), чтобы отдать контекст устройства другим программам.

  3. Можно получить объект типа System.Drawing.Printing.PrintPageEventArgs, который в свойстве содержит подходящий для данного принтера объект Graphics, установив обработчик события PrintPage при печати.
  4. У некоторых элементов управления (меню, списков, строк состояния) есть свойство OwnerDraw, позволяющее программе динамически рисовать на этом элементе управления. События MeasureItem и DrawItem передают своим обработчикам в аргументах объекты типа MeasureItemEventArgs и DrawItemEventArgs, у которых в свойствах имеется объект Graphics и который можно использовать в обработчике для рисования.
  5. Чтобы рисовать по битовой карте или метафайлу, нужно получить специальный объект Graphics, вызвав статический метод Graphics.FromImage().


  6. Если нужно получить информацию из объекта Graphics, связанного с принтером, не печатая никаких данных, можно использовать метод CreateMeasurementGraphics() объекта класса System.Drawing.Printing.PrinterSettings

  7. При взаимодействии с кодом Win32 получить объект Graphics позволяют статические методы уровня класса Graphics.FromHdc() и Graphics.FromHwnd()


Иван Циферблат
Иван Циферблат
Россия, Таганрог, 36, 2000