![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Контекстыустройств в 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(), и создан новый метафайл для дальнейшего хранения изображения.
|