Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
289-320.doc
Скачиваний:
2
Добавлен:
11.11.2019
Размер:
301.57 Кб
Скачать

Объекты контекста устройства и выбор инструментов рисования

Для создания графических изображений пользователь должен придерживаться такой технологии:

  • создать объект контекста устройства;

  • выбрать или создать средства рисования в объекте контекста устройства;

  • установить атрибуты рисования в объекте контекста устройства для получения желаемого воздействия на функции рисования;

  • вызвать функции класса CDC для рисования графических фигур.

Рассмотрим подробнее каждую из составляющих этой технологии. Для отображения текста или графики необходим объект контекста устройства (device context — DC), соответствующий окну или устройству вывода данных. Объект контекста устройства управляет выводом информации в окно, сохраняет атрибуты режима рисования и предоставляет функции для отображения текста или графики посредством объектов графического интерфейса устройства GDI. В объекте контекста устройства хранятся такие объекты графического интерфейса, как: перо, кисть, шрифт, растровые изображения, палитра и область отсечения.

Для отображения графического объекта с помощью функции OnDraw() класса представления используется объект контекста устройства класса CDC, адрес которого передается в функцию. Пример использования класса CDC для отображения графики с помощью функции OnDraw() класса представления:

void CMyPaint View::OnDraw (CDC* pDC ) { //отобразите графику, используя указатель на объект //контекста устройства pDС }

Функция OnDraw() класса представления вызывается при рисовании или перерисовке окна представления. Перерисовка необходима при любом изменении размеров окна или перекрытии его другими окна, когда создана недействительная область окна. Если класс представления поддерживает прокрутку, т. е. порожден от класса CScrollView, то переданный в него объект контекста устройства настраивается на текущую позицию прокрутки документа.

Как известно, приложение отображает информацию в окне в ответ на получение сообщения WM_PAINT, которое система посылает оконной процедуре, когда изменения окна приводят к изменению содержимого его клиентской области. Если графика отображается в диалоговом окне или в другом окне, отличном от окна представления, то класс окна для рисования или перерисовки обрабатывает сообщение WM_PAINT с помощью обработчика сообщений OnPaint(). Этот обработчик создает объект контекста устройства, порождаемый от MFC-класса CPaintDC. Класс окна, который не порождается от CView, должен предоставлять собственную функцию OnPaint(), выполняющую рисование содержимого окна. Пример функции OnPaint() классе диалогового окна рассмотрен при разработке программы FontDemo.

void CFormatDlg::OnPaint() { CPaintDC dc (this); //отобразите графику, используя объект контекста устройства dc }

Чтобы отобразить графику в окне представления или другом окне из функции, которая не обрабатывает сообщения WM_PAINT, и, следовательно, не является обработчиком OnDraw() или OnPaint(), нужно создать объект контекста устройства, являющийся членом MFC-класса CClientDC. Если окно представления поддерживает прокрутку, то перед использованием объекта необходимо вызвать функцию CScrollView::OnPrepareDC() для настройки объекта на текущую позицию документа. В главе 10 реализуется отображение графических фигур с помощью объектов контекста устройства класса CClientDC. Приведенный ниже пример иллюстрирует эту возможность:

void CMyPaint View::OnMouseMove(UINT nFlags, CPoint point) { CClientDC ClientDC (this) // Если графика отображается в окне представления, // поддерживающем прокрутку: OnPrepareDC (&ClientDC); // для отображения графики используется объект // контекста устройства ClientDC ... }

Чтобы отобразить графику вне рабочей (клиентской) области окна, создайте объект контекста устройства класса CWindowDC.

Все функции рисования, рассмотренные в этой главе, являются членами класса CDC. Так как CDC — базовый класс по отношению к остальным классам объекта контекста устройства (CClientDC, CPaintDC, CMetaFileDC, CWindowDC), то эти функции вызываются при использовании объекта контекста устройства любого из перечисленных типов.

Каждый тип объектов GDI представлен отдельным классом MFC. Все эти классы являются производными от CGdiObject. Класс CGdiObject является абстрактным базовым классом для объектов GDI. Вот эти классы:

  • CPen — класс пера, определяющий инструмент для рисования.

  • CBrush — класс кисти, представляющий собой точечный шаблон, используемый для закраски областей.

  • CFont — класс шрифта, содержащий полный набор символов некоторой гарнитуры и размера. Обычно шрифты хранятся на диске в виде ресурсов. Некоторые шрифты специфичны для определенных устройств.

  • CBitmap — класс растрового изображения, представляющий собой массив битов, в котором каждой точке дисплея соответствует один или несколько битов. Растровые изображения используются для хранения картинок и создания кистей.

  • CPalette — класс палитры, определяющий интерфейс преобразования цветов.

  • CRgn — класс региона, определяющий многоугольную или эллиптическую область для закраски или отсечения выводимого изображения.

В этой главе мы, в основном, будем использовать перо и кисть в качестве инструментов рисования. Перо влияет на способ рисования линии. Оно действует как на прямые и кривые линии, например, нарисованные с использованием функции CDC::LineTo() или CDC::Arc(), так и на границы замкнутых фигур, например, прямоугольников и эллипсов. Кисть определяет способ рисования внутренней области замкнутых фигур. Очевидно, что замкнутая фигура состоит из двух отдельных элементов: границы и внутренней области.

При первичном создании объект контекста устройства содержит заданные по умолчанию перо и кисть. Перо рисует сплошную черную линию шириной в 1 пиксел независимо от текущего режима отображения (который будет рассмотрен далее). Кисть заливает внутреннюю область фигуры с замкнутым контуром непрозрачным белым цветом. Для выполнения функций рисования необходимо выбрать нужный инструмент рисования в объекте контекста устройства.

Существуют стандартные инструменты рисования (stock GDI objects) и созданные пользователем. Стандартные инструменты рисования имеют предопределенные идентификаторы, которые приведены в табл. 10.1. Эти идентификаторы используются в качестве аргументов в функциях выбора стандартных инструментов рисования. Выбранные перо, кисть, шрифт или палитра используются до следующего явного выбора других инструментов рисования.

Т а б л и ц а 10.1

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]