Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Контекстыустройств в MFC






Одно из назначений классов библиотеки MFC – формирование изображения в окне. Рисование изображения выполняется в контексте устройства. Ранее отмечалось, что в Windows запрещены операции, непосредственно передающие информацию внешним графическим устройствам, например, принтеру или монитору. Для логического представления в программе какого-либо устройства в Windows-программах используется понятие контекста устройства. В Win32 API контекст устройства был доступен через дескриптор типа HDC. В MFC контекст представляет собой объект, создаваемый на основе класса CDC или его производных.

Такая модель взаимодействия программы и графического устройства (рис. 21.5), применяемая в программах для Windows, использующих интерфейс Win32 API, имеет два преимущества:

· приложение избавляется от операций, связанных с выводом графической информации непосредственно на внешнее устройство;

· программист избавлен от разработки низкоуровневого кода для поддержки драйвера каждого устройства.

Применение библиотеки MFC существенно упрощает написание программы по сравнению с использованием библиотеки Win32 API. В библиотеку MFC входят несколько классов, представляющих собой оболочки для дескриптора контекста устройства (HDC) в пределах C++ класса. Процесс рисования в среде Windows адресован контексту устройства, а все графические методы инкапсулированы в DC-объект как в оболочку (рис. 21.6).

Рис. 21.6. Взаимодействие приложения и графического устройства в Windows

Класс CDC определяет объекты – контексты устройств и предоставляет методы для выполнения графических операций на мониторе, принтере, в рабочей области диалогового окна и т. д. Класс содержит примерно 170 методов. Класс CPaintDC реализует в окне приложения поверхность для выполнения графических операций. Этот контекст используется для обработки сообщения WM_PAINT, которое появляется при изменении размера, положения окна и возникновения других событий, в результате которых требуется перерисовка окна. Обработка сообщения WM_PAINT требует вызова функций интерфейса Win32 API BeginPaint() и EndPaint().

Напомним, как это делается:

HDC hDC;

PAINTSTRUCT paintstruct;

switch(msg)

{

case WM_PAINT:

{

hDC=BeginPaint(hwnd, & paintstruct);

//графические операции

EndPaint(hwnd, & paintstruct)

}

}

Рис. 21.6. Классы контекстов устройств

При использовании объекта CPaintDC должны быть выполнены следующие действия: создание объекта, выполнение графических операций.

Создание объекта контекста устройства выполняет конструктор с параметром, определяющим, для какого окна создается контекст. Использование указателя на текущий объект this в качестве параметра конструктора означает создание контекста для объекта того класса, которому принадлежит редактируемая функция:

void Clab1Dlg:: OnPaint()

{

CPaintDC dc(this);

}

В приведенном примере контекст dc будет принадлежать диалоговой панели, созданной на основе класса Clab1Dlg.

Класс CClientDC представляет рабочую область окна, т. е. часть окна без рамки, заголовка, строки меню, при этом в конструкторе класса используется функция Win32 API GetDC(), а в деструкторе – ReleaseDC().

Класс CWindowDC – контекст устройства, представляющего всю поверхность окна, в том числе строку заголовка, рамку и другие специальные области окна. В конструкторе класса используется функция GetDC(), а в деструкторе – ReleaseDC().

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

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.