Интерфейс графических устройств операционной системы Microsoft Windows (в дальнейшем - просто
Прежде всего, это контекст отображения и инструменты для рисования. Контекст является как бы листом бумаги, на котором приложения рисует графику и текст. Инструменты рисования - это перья, кисти (а также шрифты, курсоры, иконки, и даже целые графические изображения), с помощью которых создаётся изображение на устройстве. Если же говорить более точно, то контекст - это структура данных, описывающая устройство отображения. В этой структуре хранятся различные характеристики устройства и набор инструментов рисования, выбранные по-умолчанию. Приложение может выбирать в контексте отображения различные инструменты. Но собственно в функциях рисования изображений и вывода текста эти инструменты не указываются - они "наследуются" из контекста.
Приложение сможет создать контекст отображения не только для экрана монитора или окна, но и для любого другого графического устройства вывода, например, принтера и
Изучение
(рис 10.1) Ввод-вывод данных через контекст устройстваТакже во вводной части необходимо отметить, что контекст - очень ресурсоёмкая структура данных, которая, к тому же, не освобождается при закрытии приложения, его вызвавшего. Поэтому, если создать множество контекстов, а затем не удалить (или не освободить) эти контексты, Ваша система как бы "ни с того ни с сего" станет работать нестабильно, и это может привести к краху операционной системы и её перезагрузке. Поэтому применяем следующие правила:
Как правило, приложения выполняют свою работу по рисованию содержимого окна во время обработки сообщения Windows WM_PAINT, хотя часто требуется рисовать и во время обработки других сообщений. В любом случае приложению нужно придерживаться следующей последовательности действий:
Последнее действие (освобождение либо удаление контекста отображения) должно быть обязательно выполнено. Самый простой способ полностью нарушить работоспособность Windows - забыть освободить полученный контекст отображения или забыть удалить созданный контекст отображения или устройства.
Так как контекст отображения - "самый критичный" ресурс Microsoft Windows, его необходимо освобождать сразу, как только в нём отпадает необходимость. Операционная система Microsoft Windows выполняет кэширование обычного контекста отображения, причём кэшируется только пять контекстов (информация для Microsoft Windows 3.11). Если операционная система не может удовлетворить запрос какого-либо приложения на выделение контекста отображения, вся операционная система окажется в критическом состоянии, из которого есть только один выход - перезагрузка Windows.
Можно выделить следующие типы контекста отображения:
Каждый из перечисленных выше контекстов имеет свои особенности и своё назначение.
Этот контекст используется чаще всего, поэтому для ускорения доступа к нему Windows использует кэширование. Для получения общего контекста отображения приложение должно вызвать функцию BeginPaint (при обработке сообщения WM_PAINT ) или GetDC (при обработке других сообщений). При этом перед регистрацией класса окна в структуре WNDCLASS не должны использоваться значения CS_OWNDC, CS_PARENTDC или CS_CLASSDC. Например:
wc.style = 0;
Функция BeginPaint возвращает контекст отображения для окна hwnd:
HDC WINAPI BeginPaint( HWND hwnd, PAINTSTRUCT FAR *lpps);
Перед этим функция подготавливает окно для рисования, заполняя структуру PAINTSTRUCT информацией, которую можно использовать в процессе рисования.
Назначение полей структуры PAINTSTRUCT смотри в приложении № I к данной лекции (п. 10.4).
Контекст отображения, полученный с помощью функции BeginPaint, необходимо освободить перед завершением обработки сообщения WM_PAINT, вызвав функцию EndPaint с теми же параметрами:
void WINAPI EndPaint( HWND hwnd, PAINTSTRUCT FAR *lpps);
Примечание: функции BeginPaint и EndPaint можно использовать только внутри обработчика сообщения WM_PAINT. Если приложению Microsoft Windows требуется рисовать при обработке других сообщений, оно должно получить контекст отображения с помощью функции GetDC и освободить функцией ReleaseDC ;
Функция GetDC возвращает контекст отображения для окна с идентификатором hwnd:
HDC WINAPI GetDC( HWND hwnd );
Функция ReleaseDC освобождает контекст изображения , полученный для окна hwnd:
int WINAPI ReleaseDC( HWND hwnd, HDC hdc );
Каждый раз, когда приложение получает общий контекст отображения, его атрибуты получают значения по-умолчанию, перечисленные нами в следующей, справочной лекции. Если перед выполнением рисования приложение изменит атрибуты контекста отображения, вызвав соответствующие функции
В Microsoft Windows можно создать такой контекст отображения, который хранится отдельно в единственном экземпляре и используется всеми окнами, созданными на базе класса окна. При регистрации такого класса окна Вы должны в стилях окна указать стиль CS_CLASSDC:
wc.style = CS_CLASSDC;
Все окна, созданные на базе класса, будут использовать один общий контекст отображения. Зачем это нужно?… Вы можете использовать его в тех случаях, когда по соображениям производительности нежелательно вызывать настройку атрибутов вывода общего контекста отображения перед каждым его использованием. Эту настройку можно выполнить один раз. Каждый раз, когда функция окна получает контекст отображения класса окна (с помощью функций BeginPaint или GetDC ), в нём выполняется настройка только двух атрибутов - области ограничения и начала системных физических координат устройства. Остальные атрибуты остаются без изменений и, следовательно, не требуют повторной настройки;
Указав в стиле класса окна значение CS_OWNDC, можно добиться того, что для каждого окна, созданного на базе такого класса, операционная система Microsoft Windows создаст отдельную структуру памяти для контекста отображения. Этот контекст будет "жёстко привязан" к данному приложению Windows. Использовать такой контекст проще и безопаснее, однако при этом неэффективно расходуется оперативная память.
wc.style = CS_OWNDC;
Этот контекст используется для дочерних окон. Он позволяет дочерним окнам "унаследовать" атрибуты контекста отображения у родительского окна. Например, дочернее окно может использовать для вывода текста тот же шрифт и цвета, что и родительское окно. Для использования родительского контекста перед регистрацией дочернего окна необходимо указать стиль CS_PARENTDC:
wc.style = CS_PARENTDC;
Все описанные выше контексты позволяют рисовать только во внутренней области окна (client region). С помощью функции: GetWindowDC приложение может получить "общий контекст отображения", позволяющий рисовать в любом месте окна (например, в области заголовка окна, в области системного меню, рамки окна, кнопок изменения размера и т.п.). Освобождать такой контекст отображения необходимо функцией ReleaseDC (как и "общий контекст отображения").
Особенность данного контекста состоит в том, что в нём выбрана система координат, начало которой находится в левом верхнем углу окна (всего окна, а не его внутренней области).
Это контекст обычно используется при необходимости заменить стандартные элементы окна (заголовок, полосы просмотра и т.п.) на собственные элементы оформления (смотри, например, интерфейс проигрывателя Windows Media Player).
Вывод изображений на такое устройство, как принтер, может выполняться с использованием тех же приёмов, что и вывод в окно приложения. Прежде всего, нужно создать контекст его отображения. А затем можно выполнить рисование, передавая им идентификатор полученного контекста как параметр.
Для создания контекста устройства используется функция CreateDC. Её параметры:
LPCSTR lpszDriver - имя драйвера. Этот параметр является указателем на строку символов, содержащую имя драйвера, обслуживающего физическое устройство. Имя драйвера совпадает с именем файла "*.drv", содержащего сам драйвер и расположенный в системном каталоге Windows;LPCSTR lpszDevice - имя устройства. Название самого устройства, описанного в системном реестре Windows;LPCSTR lpszOutput - имя файла или порта вывода;const void FAR *lpvInitData - данные для инициализации. Это поле указывает на структуру данных типа DEVMODE, используемую для инициализации устройства вывода. Если настройки наследуются из Control Panel (панели управления Windows), то данный параметр нужно устанавливать в NULL ;Пример вызова функции CreateDC для принтера Epson FX-800, подключённого к порту
Пример 10.1.
hdc = CreateDC( "epson9", "Epson FX-800", "LPT1:", NULL );
Созданный при помощи функции CreateDC контекст нужно удалить функцией DeleteDC:
BOOL WINAPI DeleteDC( HDC hdc );
Эта функция возвращает TRUE при нормальном завершении и FALSE при возникновении ошибки.
Если приложению необходимо получить информацию об устройстве вывода, оно может создать вместо обычного контекста информационный контекст. Информационный контекст нельзя использовать для рисования, но он занимает меньший объём оперативной памяти.
Информационный контекст создаётся при помощи функции CreateIC, аналогичной по параметрам с функцией CreateDC. После использования информационный контекст следует удалить, вызвав функцию: DeleteDC.
Создав в качестве "выводного устройства" вместо монитора оперативную память (например, для вывода изображений bitmap ), можно значительно сократить время на вывод изображений.
Контекст для памяти создаётся совместимым с тем контекстом отображения, в котором будет выполняться вывод на физическое устройство. Для создания совместимого контекста используется функция CreateCompatibleDC:
HDC WINAPI CreateCompatibleDC( HDC hdc );
Созданный таким образом контекст памяти удаляется функцией DeleteDC.
Контекст для метафайла позволяет записывать команды
Для создания контекста метафайла используется функция CreateMetaFile:
HDC WINAPI CreateMetaFile( LPCSTR lpszFileName );
Параметр lpszFileName должен указывать на строку, содержащую путь к файлу, или NULL. В последнем случае создаётся файл в оперативной памяти. После выполнения рисования в контексте метафайла его нужно закрыть, вызвав функцию CloseMetaFile:
HMETAFILE WINAPI CloseMetaFile( HDC hdc );
Эта функция закрывает метафайл для контекста и возвращает идентификатор метафайла. Идентификатор закрытого метафайла использовать нельзя, так как он не содержит никакой полезной информации. Что же тогда с ним можно сделать:
CopyMetaFile:HMETAFILE WINAPI CopyMetaFile( HMETAFILE hmf, LPCSTR lpszFileName );Параметр
hmf определяет метафайл, а параметр lpszFileName содержит путь к имени файла, куда будет записан метафайлPlayMetaFile:BOOL WINAPI PlayMetaFile( HDC hdc, HMETAFILE hmf );
DeleteMetaFile можно удалить метафайл из оперативной памяти (но не с диска!), вызвав функцию DeleteMetaFile:BOOL WINAPI DeleteMetaFile( HMETAFILE hmf );
GetMetaFile, указав в качестве единственного параметра путь к соответствующему файлу:HMETAFILE WINAPI GetMetaFile( LPCSTR lpszFileName );
Итак, с помощью этой лекции Вы разобрались со всем разнообразием и классификацией контекста отображения, научились "перенаправлять" контекст отображения на принтер или в файл, а также научились выделать и освобождать контексты отображений.
На данной лекции Вы познакомились с "основным инструментом" вывода и рисования на экране или устройстве информации средствами Windows API. Вы узнали, как рисовать содержимое главного окна Windows, как перенаправлять изображение на принтер (или другое устройство) или в метафайл. Также Вы убедились, что вывод содержимого в окно Windows нельзя производить "порциями", то есть по мере поступления информации. Приложение, созданное средствами WinAPI должно содержать в памяти компьютера всё своё состояние (данные, код, окружение), чтобы с помощью специальных функций оно могла вывести это состояние на экран, в файл, на принтер и т.п., используя соответствующие функции.
В следующей лекции в виде справочника будет рассмотрены основные параметры и настраиваемые функции контекста отображения, обзор существующих в контексте Windows установок и функций, их изменяющих, а далее Вам будет представлен материал по организации вывода информации в окно и всплывающие сообщения Windows.
| СТРУКТУРА: | PAINTSTRUCT |
| НАЗНАЧЕНИЕ: | Структура содержит параметры, необходимые для вывода изображений; |
| СИНТАКСИС: | typedef struct tagPAINTSTRUCT
{
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[16];
} PAINTSTRUCT;
где - идентификатор полученного контекста отображения (тот же, что возвращает функция BeginPaint );fErase - указывает, нужно ли перерисовывать фон окна. Если в поле стоит True, фон должен быть перерисован;rcPaint - структура, содержащая координаты левого верхнего и правого нижнего угла прямоугольника и указывающая, какую область на экране необходимо перерисовать; |
| ФУНКЦИЯ: | CreateDC |
| ОПРЕДЕЛЕНА В | <windows.h> |
| СИНТАКСИС: | ; гдеLPCSTR lpszDriver - имя драйвера;LPCSTR lpszDevice - имя устройства;LPCSTR lpszOutput - имя файла или порта вывода;const void FAR *lpvInitData - данные для инициализации; |
| НАЗНАЧЕНИЕ: | Функция создаёт контекст отображения для устройства, "связывая" его с конкретным устройством и его драйвером; |
| ПРИМЕЧАНИЕ: | Параметры для данной функции берутся либо из файла win.ini, либо из реестра Windows (для новых версий Windows); |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Созданный контекст отображения или нулевое значение в случае ошибки. |
| ФУНКЦИЯ: | CreateIC |
| ОПРЕДЕЛЕНА В | <windows.h> |
| СИНТАКСИС: | HDC WINAPI CreateIC( LPCSTR lpszDriver, LPCSTR lpszDevice, LPCSTR lpszOutput, const void FAR *lpvInitData ); где LPCSTR lpszDriver - имя драйвера;LPCSTR lpszDevice - имя устройства;LPCSTR lpszOutput - имя файла или порта вывода;const void FAR *lpvInitData - данные для инициализации; |
| НАЗНАЧЕНИЕ: | Функция создаёт информационный контекст отображения для устройства, "связывая" его с конкретным устройством и его драйвером; |
| ПРИМЕЧАНИЕ: | Параметры для данной функции берутся либо из файла win.ini, либо из реестра Windows (для новых версий Windows); |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Созданный информационный контекст или нулевое значение в случае ошибки. |
| ФУНКЦИЯ: | CreateCompatibleDC |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | , где - контекст отображения или устройства, с которого делается копия в оперативной памяти; |
| НАЗНАЧЕНИЕ: | Создаёт в оперативной памяти контекст для открытого контекста отображения или устройства. Чаще всего используется для формирования растровых изображений (bitmap); |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Идентификатор копии контекста отображения или ноль в случае ошибки создания контекста. |
| ФУНКЦИЯ: | DeleteDC |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | BOOL WINAPI DeleteDC( ; где - контекст отображения, созданный функциями CreateDC, CreateIC и CreateCompatibleDC ; |
| НАЗНАЧЕНИЕ: | Удаляет созданный контекст отображения; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | TRUE, если контекст удалён успешно, и FALSE в случае ошибки. |
| ФУНКЦИЯ: | BeginPaint |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | ; гдеhwnd - идентификатор окна приложения, получающий для себя контекст отображения;lpps - дальний указатель на структуру PAINTSTRUCT с параметрами контекста; |
| НАЗНАЧЕНИЕ: | Открывает контекст отображения для окна с идентификатором hwnd при обработке системного сообщения WM_PAINT ; |
| ПРИМЕЧАНИЕ: | Данную функцию можно вызывать только при обработке сообщения WM_PAINT. Во всех остальных случаях необходимо пользоваться функциями GetDC/ReleaseDC для получения/освобождения контекста; |
| ПРИМЕЧАНИЕ: | "Парной" для функции BeginPaint является функция EndPaint, вызываемая также при обработке сообщения WM_PAINT ; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Открытый контекст отображения или 0 в случае ошибки. |
| ФУНКЦИЯ: | EndPaint |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | void WINAPI EndPaint( HWND hwnd, PAINTSTRUCT FAR *lpps) ; гдеhwnd - идентификатор окна приложения, получивший для себя контекст отображения;lpps - дальний указатель на структуру PAINTSTRUCT с параметрами контекста; |
| НАЗНАЧЕНИЕ: | Закрывает контекст отображения для окна с идентификатором hwnd при обработке системного сообщения WM_PAINT ; |
| ПРИМЕЧАНИЕ: | Данную функцию можно вызывать только при обработке сообщения WM_PAINT. Во всех остальных случаях необходимо пользоваться функциями GetDC/ReleaseDC для получения/освобождения контекста; |
| ПРИМЕЧАНИЕ: | "Парной" для функции EndPaint является функция BeginPaint, вызываемая также при обработке сообщения WM_PAINT ; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Нет. |
| ФУНКЦИЯ | UPDATEWINDOW |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | void UpdateWindow( hwnd ), где HWND hwnd - дескриптор окна приложения; |
| НАЗНАЧЕНИЕ: | Посылает приложению, связанному с главным дескриптором окна hwnd, сообщение: WM_PAINT ; |
| ОПИСАНИЕ: | Функция может вызываться в любом месте программы, кроме внутри обработчика сообщения: WM_PAINT ; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Нет; |
| ФУНКЦИЯ | INVALIDATERECT |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | void InvalidateRect( hwnd, lprc, fErase) ; гдеHWND hwnd - дескриптор главного окна приложения;LPRECT lprc - дальний указатель на структуру типа RECT, определяющую прямоугольную область окна, подлежащую перерисовке;BOOL fErase - параметр определяет, нужна ли перерисовка фона окна; |
| НАЗНАЧЕНИЕ: | Объявляет любую прямоугольную область экрана как требующую перерисовки; |
| ОПИСАНИЕ: | При помощи данной функции Вы можете объявить любую область окна на экране как требующую перерисовки. Область перерисовки задаётся дальним указателем на структуру, хранящую в себе координаты обновляемой области. Параметр fErase определяет необходимость стирания фона окна. (Этот параметр указан как fErase структуры PAINTSTRUCT выше). Данная функция также посылает функции окна сообщение: WM_PAINT. Функция может вызываться в любом месте программы, кроме внутри обработчика сообщения: WM_PAINT ; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Нет; |
| ФУНКЦИЯ | VALIDATERECT |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | void ValidateRect( HWND hwnd, LPRECT lprc ) ; гдеHWND hwnd - дескриптор главного окна приложения;LPRECT lprc - дальний указатель на структуру типа RECT, определяющую прямоугольную область окна, подлежащую перерисовке; |
| НАЗНАЧЕНИЕ: | Удаляет прямоугольную область из списка областей, подлежащих обновлению; |
| ОПИСАНИЕ: | Указанная в указателе на структуру lprc область окна исключается из перерисовки. Если эта область захватывает всё окно, сообщение: WM_PAINT удаляется из очереди сообщений; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Нет; |
| ФУНКЦИЯ: | GetDC |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | ; где hwnd - идентификатор окна приложения, получающий для себя контекст отображения; |
| НАЗНАЧЕНИЕ: | Функция получает контекст отображения для рисования в окне вне обработчика сообщения WM_PAINT ; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Идентификатор созданного контекста или ноль в случае ошибки. |
| ФУНКЦИЯ: | ReleaseDC |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | int WINAPI ReleaseDC( HWND hwnd, ; гдеhwnd - идентификатор окна приложения, получивший для себя контекст отображения; - идентификатор освобождаемого контекста отображения; |
| НАЗНАЧЕНИЕ: | Функция освобождает контекст отображения для рисования в окне вне обработчика сообщения WM_PAINT ; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Ненулевое значение в случае освобождения контекста отображения или ноль в противном случае. |
| ФУНКЦИЯ: | CreateMetaFile |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | ; где lpszFileName - имя метафайла на жёстком диске (полное путевое имя) или NULL, если контекст создаётся в оперативной памяти; |
| НАЗНАЧЕНИЕ: | Создаёт контекст отображения для метафайла Microsoft Windows, содержащий команды рисования |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Идентификатор созданного контекста или ноль в случае ошибки. |
| ФУНКЦИЯ: | CloseMetaFile |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | HMETAFILE WINAPI CloseMetaFile( ; где - контекст отображения для метафайла; |
| НАЗНАЧЕНИЕ: | Функция закрывает контекст отображения для метафайла и возвращает дескриптор метафайла для дальнейших манипуляций с метафайлом; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | идентификатор метафайла или ноль в случае ошибки. |
| ФУНКЦИЯ: | CopyMetaFile |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | HMETAFILE WINAPI CopyMetaFile( HMETAFILE hmf, LPCSTR lpszFileName ) ; гдеhmf - идентификатор метафайла;lpszFileName - имя метафайла на жёстком диске (полное путевое имя); |
| НАЗНАЧЕНИЕ: | Функция копирует метафайл, связанный с идентификатором hmf, в файл на диске, путь к которому указан в строке lpszFileName ; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | новый идентификатор метафайла или ноль в случае ошибки. |
| ФУНКЦИЯ: | PlayMetaFile |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | BOOL WINAPI PlayMetaFile( ; где - контекст для устройства или отображения, в который осуществляется вывод из метафайла с идентификатором hmf ;hmf - идентификатор "проигрываемого" метафайла; |
| НАЗНАЧЕНИЕ: | Функция "проигрывает" (осуществляет вывод информации из файла) указанный метафайл на данном контексте отображения или устройства; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | TRUE в случае успешного завершения функции и FALSE в случае ошибки. |
| ФУНКЦИЯ: | DeleteMetaFile |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | BOOL WINAPI DeleteMetaFile( HMETAFILE hmf ) ; где hmf - идентификатор удаляемого метафайла; |
| НАЗНАЧЕНИЕ: | Функция удаляет (освобождает память) метафайл, связанный со своим идентификатором; |
| ПРИМЕЧАНИЕ: | Функция не удаляет метафайл с диска, созданного функциями CreateMetaFile и CopyMetaFile, то есть работает только с оперативной памятью; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | TRUE в случае успешного удаления из памяти и FALSE в противном случае. |
| ФУНКЦИЯ: | GetMetaFile |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | HMETAFILE WINAPI GetMetaFile( LPCSTR lpszFileName ) ; где lpszFileName - имя метафайла на жёстком диске (полное путевое имя); |
| НАЗНАЧЕНИЕ: | Функция открывает для чтения метафайл на жёстком диске, и связывает с ним идентификатор метафайла; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Идентификатор метафайла или ноль в случае ошибки. |
Как уже это упоминалось автором, окно приложения должно быть способно перерисовать свою внутреннюю его поверхность или любую его часть в любой момент времени, при получении сообщения: WM_PAINT.
Сообщение WM_PAINT передаётся функции окна, если стала видна область окна, ранее скрытая другими окнами, если Вы изменили размер окна или выполнили операцию прокрутки изображения в окне. Приложение может передать функции окна сообщение WM_PAINT явным образом, вызывая функции: UpdateWindow, InvalidateRect и InvalidateRgn. Иногда операционная система способна перерисовать окно, не посылая сообщения: WM_PAINT.
Перед тем, как записать сообщение WM_PAINT в очередь приложения, Windows посылает функции окна сообщение: WM_ERASEBKGND. Если функция окна не обрабатывает это сообщение, в ответ на это сообщение функция окна закрашивает внутреннюю область окна с помощью кисти, указанной в классе окна (при регистрации класса окна). Поэтому, если функция окна нарисует что-то в окне во время обработки других сообщений, то после прихода сообщения WM_PAINT нарисованное изображение будет закрашено.
Что же делать в том случае, если по логике работы программы требуется изменить содержимое окна не во время обработки сообщения WM_PAINT, а в любом другом месте приложения? В этом случае приложение должно сообщить Windows, что необходимо перерисовать часть окна или всё окно. При этом в очередь сообщений приложения будет записано сообщение: WM_PAINT, обработка которого приведёт к нужному Вам результату.
Для обработки сообщения: WM_PAINT программист должен вызвать функцию: BeginPaint, о которой было подробно рассказано на этой лекции, пункт 10.2.3. Эта функция принимает в себя два параметра, первым из которых является дескриптор окна приложения, а вторым параметром - структура PAINTSTRUCT. Её описание также смотрите в приложении №I к лекции 10, в пункте 10.4. Мы же только отметим, что в этой структуре, кроме контекста отображения, содержатся координаты и размер области, подлежащей обновлению и перерисовке при обработке сообщения WM_PAINT. Эти координаты передаются через поле rcPaint, представляющую собой структуру типа RECT, описывающую прямоугольную область. Её поля смотри ниже:
typedef struct tagRECT
{
int left;
int top;
int right;
int bottom;
} RECT;
left задаёт X координату верхнего левого угла области;top задаёт Y координату левого верхнего угла области;right задаёт X координату правого нижнего угла области;bottom задаёт Y координату правого нижнего угла прямоугольной области.Координаты задаются в единицах измерения, называемых пикселями. Пиксель - это минимальные точки на экране, из которых строится изображения. Приложение может определить любой размер любого своего окна или размер используемого шрифта при помощи специальных функций.
Интерфейс графических устройств операционной системы Microsoft Windows (в дальнейшем - просто
Прежде всего, это контекст отображения и инструменты для рисования. Контекст является как бы листом бумаги, на котором приложения рисует графику и текст. Инструменты рисования - это перья, кисти (а также шрифты, курсоры, иконки, и даже целые графические изображения), с помощью которых создаётся изображение на устройстве. Если же говорить более точно, то контекст - это структура данных, описывающая устройство отображения. В этой структуре хранятся различные характеристики устройства и набор инструментов рисования, выбранные по-умолчанию. Приложение может выбирать в контексте отображения различные инструменты. Но собственно в функциях рисования изображений и вывода текста эти инструменты не указываются - они "наследуются" из контекста.
Приложение сможет создать контекст отображения не только для экрана монитора или окна, но и для любого другого графического устройства вывода, например, принтера и
Изучение
(рис 10.1) Ввод-вывод данных через контекст устройстваТакже во вводной части необходимо отметить, что контекст - очень ресурсоёмкая структура данных, которая, к тому же, не освобождается при закрытии приложения, его вызвавшего. Поэтому, если создать множество контекстов, а затем не удалить (или не освободить) эти контексты, Ваша система как бы "ни с того ни с сего" станет работать нестабильно, и это может привести к краху операционной системы и её перезагрузке. Поэтому применяем следующие правила:
Как правило, приложения выполняют свою работу по рисованию содержимого окна во время обработки сообщения Windows WM_PAINT, хотя часто требуется рисовать и во время обработки других сообщений. В любом случае приложению нужно придерживаться следующей последовательности действий:
Последнее действие (освобождение либо удаление контекста отображения) должно быть обязательно выполнено. Самый простой способ полностью нарушить работоспособность Windows - забыть освободить полученный контекст отображения или забыть удалить созданный контекст отображения или устройства.
Так как контекст отображения - "самый критичный" ресурс Microsoft Windows, его необходимо освобождать сразу, как только в нём отпадает необходимость. Операционная система Microsoft Windows выполняет кэширование обычного контекста отображения, причём кэшируется только пять контекстов (информация для Microsoft Windows 3.11). Если операционная система не может удовлетворить запрос какого-либо приложения на выделение контекста отображения, вся операционная система окажется в критическом состоянии, из которого есть только один выход - перезагрузка Windows.
Можно выделить следующие типы контекста отображения:
Каждый из перечисленных выше контекстов имеет свои особенности и своё назначение.
Этот контекст используется чаще всего, поэтому для ускорения доступа к нему Windows использует кэширование. Для получения общего контекста отображения приложение должно вызвать функцию BeginPaint (при обработке сообщения WM_PAINT ) или GetDC (при обработке других сообщений). При этом перед регистрацией класса окна в структуре WNDCLASS не должны использоваться значения CS_OWNDC, CS_PARENTDC или CS_CLASSDC. Например:
wc.style = 0;
Функция BeginPaint возвращает контекст отображения для окна hwnd:
HDC WINAPI BeginPaint( HWND hwnd, PAINTSTRUCT FAR *lpps);
Перед этим функция подготавливает окно для рисования, заполняя структуру PAINTSTRUCT информацией, которую можно использовать в процессе рисования.
Назначение полей структуры PAINTSTRUCT смотри в приложении № I к данной лекции (п. 10.4).
Контекст отображения, полученный с помощью функции BeginPaint, необходимо освободить перед завершением обработки сообщения WM_PAINT, вызвав функцию EndPaint с теми же параметрами:
void WINAPI EndPaint( HWND hwnd, PAINTSTRUCT FAR *lpps);
Примечание: функции BeginPaint и EndPaint можно использовать только внутри обработчика сообщения WM_PAINT. Если приложению Microsoft Windows требуется рисовать при обработке других сообщений, оно должно получить контекст отображения с помощью функции GetDC и освободить функцией ReleaseDC ;
Функция GetDC возвращает контекст отображения для окна с идентификатором hwnd:
HDC WINAPI GetDC( HWND hwnd );
Функция ReleaseDC освобождает контекст изображения , полученный для окна hwnd:
int WINAPI ReleaseDC( HWND hwnd, HDC hdc );
Каждый раз, когда приложение получает общий контекст отображения, его атрибуты получают значения по-умолчанию, перечисленные нами в следующей, справочной лекции. Если перед выполнением рисования приложение изменит атрибуты контекста отображения, вызвав соответствующие функции
В Microsoft Windows можно создать такой контекст отображения, который хранится отдельно в единственном экземпляре и используется всеми окнами, созданными на базе класса окна. При регистрации такого класса окна Вы должны в стилях окна указать стиль CS_CLASSDC:
wc.style = CS_CLASSDC;
Все окна, созданные на базе класса, будут использовать один общий контекст отображения. Зачем это нужно?… Вы можете использовать его в тех случаях, когда по соображениям производительности нежелательно вызывать настройку атрибутов вывода общего контекста отображения перед каждым его использованием. Эту настройку можно выполнить один раз. Каждый раз, когда функция окна получает контекст отображения класса окна (с помощью функций BeginPaint или GetDC ), в нём выполняется настройка только двух атрибутов - области ограничения и начала системных физических координат устройства. Остальные атрибуты остаются без изменений и, следовательно, не требуют повторной настройки;
Указав в стиле класса окна значение CS_OWNDC, можно добиться того, что для каждого окна, созданного на базе такого класса, операционная система Microsoft Windows создаст отдельную структуру памяти для контекста отображения. Этот контекст будет "жёстко привязан" к данному приложению Windows. Использовать такой контекст проще и безопаснее, однако при этом неэффективно расходуется оперативная память.
wc.style = CS_OWNDC;
Этот контекст используется для дочерних окон. Он позволяет дочерним окнам "унаследовать" атрибуты контекста отображения у родительского окна. Например, дочернее окно может использовать для вывода текста тот же шрифт и цвета, что и родительское окно. Для использования родительского контекста перед регистрацией дочернего окна необходимо указать стиль CS_PARENTDC:
wc.style = CS_PARENTDC;
Все описанные выше контексты позволяют рисовать только во внутренней области окна (client region). С помощью функции: GetWindowDC приложение может получить "общий контекст отображения", позволяющий рисовать в любом месте окна (например, в области заголовка окна, в области системного меню, рамки окна, кнопок изменения размера и т.п.). Освобождать такой контекст отображения необходимо функцией ReleaseDC (как и "общий контекст отображения").
Особенность данного контекста состоит в том, что в нём выбрана система координат, начало которой находится в левом верхнем углу окна (всего окна, а не его внутренней области).
Это контекст обычно используется при необходимости заменить стандартные элементы окна (заголовок, полосы просмотра и т.п.) на собственные элементы оформления (смотри, например, интерфейс проигрывателя Windows Media Player).
Вывод изображений на такое устройство, как принтер, может выполняться с использованием тех же приёмов, что и вывод в окно приложения. Прежде всего, нужно создать контекст его отображения. А затем можно выполнить рисование, передавая им идентификатор полученного контекста как параметр.
Для создания контекста устройства используется функция CreateDC. Её параметры:
LPCSTR lpszDriver - имя драйвера. Этот параметр является указателем на строку символов, содержащую имя драйвера, обслуживающего физическое устройство. Имя драйвера совпадает с именем файла "*.drv", содержащего сам драйвер и расположенный в системном каталоге Windows;LPCSTR lpszDevice - имя устройства. Название самого устройства, описанного в системном реестре Windows;LPCSTR lpszOutput - имя файла или порта вывода;const void FAR *lpvInitData - данные для инициализации. Это поле указывает на структуру данных типа DEVMODE, используемую для инициализации устройства вывода. Если настройки наследуются из Control Panel (панели управления Windows), то данный параметр нужно устанавливать в NULL ;Пример вызова функции CreateDC для принтера Epson FX-800, подключённого к порту
Пример 10.1.
hdc = CreateDC( "epson9", "Epson FX-800", "LPT1:", NULL );
Созданный при помощи функции CreateDC контекст нужно удалить функцией DeleteDC:
BOOL WINAPI DeleteDC( HDC hdc );
Эта функция возвращает TRUE при нормальном завершении и FALSE при возникновении ошибки.
Если приложению необходимо получить информацию об устройстве вывода, оно может создать вместо обычного контекста информационный контекст. Информационный контекст нельзя использовать для рисования, но он занимает меньший объём оперативной памяти.
Информационный контекст создаётся при помощи функции CreateIC, аналогичной по параметрам с функцией CreateDC. После использования информационный контекст следует удалить, вызвав функцию: DeleteDC.
Создав в качестве "выводного устройства" вместо монитора оперативную память (например, для вывода изображений bitmap ), можно значительно сократить время на вывод изображений.
Контекст для памяти создаётся совместимым с тем контекстом отображения, в котором будет выполняться вывод на физическое устройство. Для создания совместимого контекста используется функция CreateCompatibleDC:
HDC WINAPI CreateCompatibleDC( HDC hdc );
Созданный таким образом контекст памяти удаляется функцией DeleteDC.
Контекст для метафайла позволяет записывать команды
Для создания контекста метафайла используется функция CreateMetaFile:
HDC WINAPI CreateMetaFile( LPCSTR lpszFileName );
Параметр lpszFileName должен указывать на строку, содержащую путь к файлу, или NULL. В последнем случае создаётся файл в оперативной памяти. После выполнения рисования в контексте метафайла его нужно закрыть, вызвав функцию CloseMetaFile:
HMETAFILE WINAPI CloseMetaFile( HDC hdc );
Эта функция закрывает метафайл для контекста и возвращает идентификатор метафайла. Идентификатор закрытого метафайла использовать нельзя, так как он не содержит никакой полезной информации. Что же тогда с ним можно сделать:
CopyMetaFile:HMETAFILE WINAPI CopyMetaFile( HMETAFILE hmf, LPCSTR lpszFileName );Параметр
hmf определяет метафайл, а параметр lpszFileName содержит путь к имени файла, куда будет записан метафайлPlayMetaFile:BOOL WINAPI PlayMetaFile( HDC hdc, HMETAFILE hmf );
DeleteMetaFile можно удалить метафайл из оперативной памяти (но не с диска!), вызвав функцию DeleteMetaFile:BOOL WINAPI DeleteMetaFile( HMETAFILE hmf );
GetMetaFile, указав в качестве единственного параметра путь к соответствующему файлу:HMETAFILE WINAPI GetMetaFile( LPCSTR lpszFileName );
Итак, с помощью этой лекции Вы разобрались со всем разнообразием и классификацией контекста отображения, научились "перенаправлять" контекст отображения на принтер или в файл, а также научились выделать и освобождать контексты отображений.
На данной лекции Вы познакомились с "основным инструментом" вывода и рисования на экране или устройстве информации средствами Windows API. Вы узнали, как рисовать содержимое главного окна Windows, как перенаправлять изображение на принтер (или другое устройство) или в метафайл. Также Вы убедились, что вывод содержимого в окно Windows нельзя производить "порциями", то есть по мере поступления информации. Приложение, созданное средствами WinAPI должно содержать в памяти компьютера всё своё состояние (данные, код, окружение), чтобы с помощью специальных функций оно могла вывести это состояние на экран, в файл, на принтер и т.п., используя соответствующие функции.
В следующей лекции в виде справочника будет рассмотрены основные параметры и настраиваемые функции контекста отображения, обзор существующих в контексте Windows установок и функций, их изменяющих, а далее Вам будет представлен материал по организации вывода информации в окно и всплывающие сообщения Windows.
| СТРУКТУРА: | PAINTSTRUCT |
| НАЗНАЧЕНИЕ: | Структура содержит параметры, необходимые для вывода изображений; |
| СИНТАКСИС: | typedef struct tagPAINTSTRUCT
{
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[16];
} PAINTSTRUCT;
где - идентификатор полученного контекста отображения (тот же, что возвращает функция BeginPaint );fErase - указывает, нужно ли перерисовывать фон окна. Если в поле стоит True, фон должен быть перерисован;rcPaint - структура, содержащая координаты левого верхнего и правого нижнего угла прямоугольника и указывающая, какую область на экране необходимо перерисовать; |
| ФУНКЦИЯ: | CreateDC |
| ОПРЕДЕЛЕНА В | <windows.h> |
| СИНТАКСИС: | ; гдеLPCSTR lpszDriver - имя драйвера;LPCSTR lpszDevice - имя устройства;LPCSTR lpszOutput - имя файла или порта вывода;const void FAR *lpvInitData - данные для инициализации; |
| НАЗНАЧЕНИЕ: | Функция создаёт контекст отображения для устройства, "связывая" его с конкретным устройством и его драйвером; |
| ПРИМЕЧАНИЕ: | Параметры для данной функции берутся либо из файла win.ini, либо из реестра Windows (для новых версий Windows); |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Созданный контекст отображения или нулевое значение в случае ошибки. |
| ФУНКЦИЯ: | CreateIC |
| ОПРЕДЕЛЕНА В | <windows.h> |
| СИНТАКСИС: | HDC WINAPI CreateIC( LPCSTR lpszDriver, LPCSTR lpszDevice, LPCSTR lpszOutput, const void FAR *lpvInitData ); где LPCSTR lpszDriver - имя драйвера;LPCSTR lpszDevice - имя устройства;LPCSTR lpszOutput - имя файла или порта вывода;const void FAR *lpvInitData - данные для инициализации; |
| НАЗНАЧЕНИЕ: | Функция создаёт информационный контекст отображения для устройства, "связывая" его с конкретным устройством и его драйвером; |
| ПРИМЕЧАНИЕ: | Параметры для данной функции берутся либо из файла win.ini, либо из реестра Windows (для новых версий Windows); |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Созданный информационный контекст или нулевое значение в случае ошибки. |
| ФУНКЦИЯ: | CreateCompatibleDC |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | , где - контекст отображения или устройства, с которого делается копия в оперативной памяти; |
| НАЗНАЧЕНИЕ: | Создаёт в оперативной памяти контекст для открытого контекста отображения или устройства. Чаще всего используется для формирования растровых изображений (bitmap); |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Идентификатор копии контекста отображения или ноль в случае ошибки создания контекста. |
| ФУНКЦИЯ: | DeleteDC |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | BOOL WINAPI DeleteDC( ; где - контекст отображения, созданный функциями CreateDC, CreateIC и CreateCompatibleDC ; |
| НАЗНАЧЕНИЕ: | Удаляет созданный контекст отображения; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | TRUE, если контекст удалён успешно, и FALSE в случае ошибки. |
| ФУНКЦИЯ: | BeginPaint |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | ; гдеhwnd - идентификатор окна приложения, получающий для себя контекст отображения;lpps - дальний указатель на структуру PAINTSTRUCT с параметрами контекста; |
| НАЗНАЧЕНИЕ: | Открывает контекст отображения для окна с идентификатором hwnd при обработке системного сообщения WM_PAINT ; |
| ПРИМЕЧАНИЕ: | Данную функцию можно вызывать только при обработке сообщения WM_PAINT. Во всех остальных случаях необходимо пользоваться функциями GetDC/ReleaseDC для получения/освобождения контекста; |
| ПРИМЕЧАНИЕ: | "Парной" для функции BeginPaint является функция EndPaint, вызываемая также при обработке сообщения WM_PAINT ; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Открытый контекст отображения или 0 в случае ошибки. |
| ФУНКЦИЯ: | EndPaint |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | void WINAPI EndPaint( HWND hwnd, PAINTSTRUCT FAR *lpps) ; гдеhwnd - идентификатор окна приложения, получивший для себя контекст отображения;lpps - дальний указатель на структуру PAINTSTRUCT с параметрами контекста; |
| НАЗНАЧЕНИЕ: | Закрывает контекст отображения для окна с идентификатором hwnd при обработке системного сообщения WM_PAINT ; |
| ПРИМЕЧАНИЕ: | Данную функцию можно вызывать только при обработке сообщения WM_PAINT. Во всех остальных случаях необходимо пользоваться функциями GetDC/ReleaseDC для получения/освобождения контекста; |
| ПРИМЕЧАНИЕ: | "Парной" для функции EndPaint является функция BeginPaint, вызываемая также при обработке сообщения WM_PAINT ; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Нет. |
| ФУНКЦИЯ | UPDATEWINDOW |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | void UpdateWindow( hwnd ), где HWND hwnd - дескриптор окна приложения; |
| НАЗНАЧЕНИЕ: | Посылает приложению, связанному с главным дескриптором окна hwnd, сообщение: WM_PAINT ; |
| ОПИСАНИЕ: | Функция может вызываться в любом месте программы, кроме внутри обработчика сообщения: WM_PAINT ; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Нет; |
| ФУНКЦИЯ | INVALIDATERECT |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | void InvalidateRect( hwnd, lprc, fErase) ; гдеHWND hwnd - дескриптор главного окна приложения;LPRECT lprc - дальний указатель на структуру типа RECT, определяющую прямоугольную область окна, подлежащую перерисовке;BOOL fErase - параметр определяет, нужна ли перерисовка фона окна; |
| НАЗНАЧЕНИЕ: | Объявляет любую прямоугольную область экрана как требующую перерисовки; |
| ОПИСАНИЕ: | При помощи данной функции Вы можете объявить любую область окна на экране как требующую перерисовки. Область перерисовки задаётся дальним указателем на структуру, хранящую в себе координаты обновляемой области. Параметр fErase определяет необходимость стирания фона окна. (Этот параметр указан как fErase структуры PAINTSTRUCT выше). Данная функция также посылает функции окна сообщение: WM_PAINT. Функция может вызываться в любом месте программы, кроме внутри обработчика сообщения: WM_PAINT ; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Нет; |
| ФУНКЦИЯ | VALIDATERECT |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | void ValidateRect( HWND hwnd, LPRECT lprc ) ; гдеHWND hwnd - дескриптор главного окна приложения;LPRECT lprc - дальний указатель на структуру типа RECT, определяющую прямоугольную область окна, подлежащую перерисовке; |
| НАЗНАЧЕНИЕ: | Удаляет прямоугольную область из списка областей, подлежащих обновлению; |
| ОПИСАНИЕ: | Указанная в указателе на структуру lprc область окна исключается из перерисовки. Если эта область захватывает всё окно, сообщение: WM_PAINT удаляется из очереди сообщений; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Нет; |
| ФУНКЦИЯ: | GetDC |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | ; где hwnd - идентификатор окна приложения, получающий для себя контекст отображения; |
| НАЗНАЧЕНИЕ: | Функция получает контекст отображения для рисования в окне вне обработчика сообщения WM_PAINT ; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Идентификатор созданного контекста или ноль в случае ошибки. |
| ФУНКЦИЯ: | ReleaseDC |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | int WINAPI ReleaseDC( HWND hwnd, ; гдеhwnd - идентификатор окна приложения, получивший для себя контекст отображения; - идентификатор освобождаемого контекста отображения; |
| НАЗНАЧЕНИЕ: | Функция освобождает контекст отображения для рисования в окне вне обработчика сообщения WM_PAINT ; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Ненулевое значение в случае освобождения контекста отображения или ноль в противном случае. |
| ФУНКЦИЯ: | CreateMetaFile |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | ; где lpszFileName - имя метафайла на жёстком диске (полное путевое имя) или NULL, если контекст создаётся в оперативной памяти; |
| НАЗНАЧЕНИЕ: | Создаёт контекст отображения для метафайла Microsoft Windows, содержащий команды рисования |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Идентификатор созданного контекста или ноль в случае ошибки. |
| ФУНКЦИЯ: | CloseMetaFile |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | HMETAFILE WINAPI CloseMetaFile( ; где - контекст отображения для метафайла; |
| НАЗНАЧЕНИЕ: | Функция закрывает контекст отображения для метафайла и возвращает дескриптор метафайла для дальнейших манипуляций с метафайлом; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | идентификатор метафайла или ноль в случае ошибки. |
| ФУНКЦИЯ: | CopyMetaFile |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | HMETAFILE WINAPI CopyMetaFile( HMETAFILE hmf, LPCSTR lpszFileName ) ; гдеhmf - идентификатор метафайла;lpszFileName - имя метафайла на жёстком диске (полное путевое имя); |
| НАЗНАЧЕНИЕ: | Функция копирует метафайл, связанный с идентификатором hmf, в файл на диске, путь к которому указан в строке lpszFileName ; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | новый идентификатор метафайла или ноль в случае ошибки. |
| ФУНКЦИЯ: | PlayMetaFile |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | BOOL WINAPI PlayMetaFile( ; где - контекст для устройства или отображения, в который осуществляется вывод из метафайла с идентификатором hmf ;hmf - идентификатор "проигрываемого" метафайла; |
| НАЗНАЧЕНИЕ: | Функция "проигрывает" (осуществляет вывод информации из файла) указанный метафайл на данном контексте отображения или устройства; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | TRUE в случае успешного завершения функции и FALSE в случае ошибки. |
| ФУНКЦИЯ: | DeleteMetaFile |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | BOOL WINAPI DeleteMetaFile( HMETAFILE hmf ) ; где hmf - идентификатор удаляемого метафайла; |
| НАЗНАЧЕНИЕ: | Функция удаляет (освобождает память) метафайл, связанный со своим идентификатором; |
| ПРИМЕЧАНИЕ: | Функция не удаляет метафайл с диска, созданного функциями CreateMetaFile и CopyMetaFile, то есть работает только с оперативной памятью; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | TRUE в случае успешного удаления из памяти и FALSE в противном случае. |
| ФУНКЦИЯ: | GetMetaFile |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | HMETAFILE WINAPI GetMetaFile( LPCSTR lpszFileName ) ; где lpszFileName - имя метафайла на жёстком диске (полное путевое имя); |
| НАЗНАЧЕНИЕ: | Функция открывает для чтения метафайл на жёстком диске, и связывает с ним идентификатор метафайла; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Идентификатор метафайла или ноль в случае ошибки. |
Как уже это упоминалось автором, окно приложения должно быть способно перерисовать свою внутреннюю его поверхность или любую его часть в любой момент времени, при получении сообщения: WM_PAINT.
Сообщение WM_PAINT передаётся функции окна, если стала видна область окна, ранее скрытая другими окнами, если Вы изменили размер окна или выполнили операцию прокрутки изображения в окне. Приложение может передать функции окна сообщение WM_PAINT явным образом, вызывая функции: UpdateWindow, InvalidateRect и InvalidateRgn. Иногда операционная система способна перерисовать окно, не посылая сообщения: WM_PAINT.
Перед тем, как записать сообщение WM_PAINT в очередь приложения, Windows посылает функции окна сообщение: WM_ERASEBKGND. Если функция окна не обрабатывает это сообщение, в ответ на это сообщение функция окна закрашивает внутреннюю область окна с помощью кисти, указанной в классе окна (при регистрации класса окна). Поэтому, если функция окна нарисует что-то в окне во время обработки других сообщений, то после прихода сообщения WM_PAINT нарисованное изображение будет закрашено.
Что же делать в том случае, если по логике работы программы требуется изменить содержимое окна не во время обработки сообщения WM_PAINT, а в любом другом месте приложения? В этом случае приложение должно сообщить Windows, что необходимо перерисовать часть окна или всё окно. При этом в очередь сообщений приложения будет записано сообщение: WM_PAINT, обработка которого приведёт к нужному Вам результату.
Для обработки сообщения: WM_PAINT программист должен вызвать функцию: BeginPaint, о которой было подробно рассказано на этой лекции, пункт 10.2.3. Эта функция принимает в себя два параметра, первым из которых является дескриптор окна приложения, а вторым параметром - структура PAINTSTRUCT. Её описание также смотрите в приложении №I к лекции 10, в пункте 10.4. Мы же только отметим, что в этой структуре, кроме контекста отображения, содержатся координаты и размер области, подлежащей обновлению и перерисовке при обработке сообщения WM_PAINT. Эти координаты передаются через поле rcPaint, представляющую собой структуру типа RECT, описывающую прямоугольную область. Её поля смотри ниже:
typedef struct tagRECT
{
int left;
int top;
int right;
int bottom;
} RECT;
left задаёт X координату верхнего левого угла области;top задаёт Y координату левого верхнего угла области;right задаёт X координату правого нижнего угла области;bottom задаёт Y координату правого нижнего угла прямоугольной области.Координаты задаются в единицах измерения, называемых пикселями. Пиксель - это минимальные точки на экране, из которых строится изображения. Приложение может определить любой размер любого своего окна или размер используемого шрифта при помощи специальных функций.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.