10.4. Приложение № I. Описание структур и функций контекста отображения
СТРУКТУРА: |
PAINTSTRUCT |
НАЗНАЧЕНИЕ: |
Структура содержит параметры, необходимые для вывода изображений; |
СИНТАКСИС: |
typedef struct tagPAINTSTRUCT
{
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[16];
} PAINTSTRUCT;
где
-
hdc - идентификатор полученного контекста отображения (тот же, что возвращает функция BeginPaint );
-
fErase - указывает, нужно ли перерисовывать фон окна. Если в поле стоит True, фон должен быть перерисован;
-
rcPaint - структура, содержащая координаты левого верхнего и правого нижнего угла прямоугольника и указывающая, какую область на экране необходимо перерисовать;
Остальные поля зарезервированы Windows и не должны использоваться. |
ФУНКЦИЯ: |
CreateDC |
ОПРЕДЕЛЕНА В |
<windows.h> |
СИНТАКСИС: |
HDC WINAPI CreateDC( LPCSTR lpszDriver, LPCSTR lpszDevice, LPCSTR lpszOutput, const void FAR *lpvInitData ) ; где
-
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> |
СИНТАКСИС: |
HDC WINAPI CreateCompatibleDC( HDC hdc ), где hdc - контекст отображения или устройства, с которого делается копия в оперативной памяти; |
НАЗНАЧЕНИЕ: |
Создаёт в оперативной памяти контекст для открытого контекста отображения или устройства. Чаще всего используется для формирования растровых изображений (bitmap); |
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: |
Идентификатор копии контекста отображения или ноль в случае ошибки создания контекста. |
ФУНКЦИЯ: |
DeleteDC |
ОПРЕДЕЛЕНА В: |
<windows.h> |
СИНТАКСИС: |
BOOL WINAPI DeleteDC( HDC hdc ) ; где hdc - контекст отображения, созданный функциями CreateDC, CreateIC и CreateCompatibleDC ; |
НАЗНАЧЕНИЕ: |
Удаляет созданный контекст отображения; |
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: |
TRUE, если контекст удалён успешно, и FALSE в случае ошибки. |
ФУНКЦИЯ: |
BeginPaint |
ОПРЕДЕЛЕНА В: |
<windows.h> |
СИНТАКСИС: |
HDC WINAPI BeginPaint( HWND hwnd, PAINTSTRUCT FAR *lpps) ; где
-
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> |
СИНТАКСИС: |
HDC WINAPI GetDC( HWND hwnd ) ; где hwnd - идентификатор окна приложения, получающий для себя контекст отображения; |
НАЗНАЧЕНИЕ: |
Функция получает контекст отображения для рисования в окне вне обработчика сообщения WM_PAINT ; |
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: |
Идентификатор созданного контекста или ноль в случае ошибки. |
ФУНКЦИЯ: |
ReleaseDC |
ОПРЕДЕЛЕНА В: |
<windows.h> |
СИНТАКСИС: |
int WINAPI ReleaseDC( HWND hwnd, HDC hdc ) ; где
-
hwnd - идентификатор окна приложения, получивший для себя контекст отображения;
-
hdc - идентификатор освобождаемого контекста отображения;
|
НАЗНАЧЕНИЕ: |
Функция освобождает контекст отображения для рисования в окне вне обработчика сообщения WM_PAINT ; |
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: |
Ненулевое значение в случае освобождения контекста отображения или ноль в противном случае. |
ФУНКЦИЯ: |
CreateMetaFile |
ОПРЕДЕЛЕНА В: |
<windows.h> |
СИНТАКСИС: |
HDC WINAPI CreateMetaFile( LPCSTR lpszFileName ) ; где lpszFileName - имя метафайла на жёстком диске (полное путевое имя) или NULL, если контекст создаётся в оперативной памяти; |
НАЗНАЧЕНИЕ: |
Создаёт контекст отображения для метафайла Microsoft Windows, содержащий команды рисования GDI; |
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: |
Идентификатор созданного контекста или ноль в случае ошибки. |
ФУНКЦИЯ: |
CloseMetaFile |
ОПРЕДЕЛЕНА В: |
<windows.h> |
СИНТАКСИС: |
HMETAFILE WINAPI CloseMetaFile( HDC hdc ) ; где hdc - контекст отображения для метафайла; |
НАЗНАЧЕНИЕ: |
Функция закрывает контекст отображения для метафайла и возвращает дескриптор метафайла для дальнейших манипуляций с метафайлом; |
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: |
идентификатор метафайла или ноль в случае ошибки. |
ФУНКЦИЯ: |
CopyMetaFile |
ОПРЕДЕЛЕНА В: |
<windows.h> |
СИНТАКСИС: |
HMETAFILE WINAPI CopyMetaFile( HMETAFILE hmf, LPCSTR lpszFileName ) ; где
-
hmf - идентификатор метафайла;
-
lpszFileName - имя метафайла на жёстком диске (полное путевое имя);
|
НАЗНАЧЕНИЕ: |
Функция копирует метафайл, связанный с идентификатором hmf, в файл на диске, путь к которому указан в строке lpszFileName ; |
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: |
новый идентификатор метафайла или ноль в случае ошибки. |
ФУНКЦИЯ: |
PlayMetaFile |
ОПРЕДЕЛЕНА В: |
<windows.h> |
СИНТАКСИС: |
BOOL WINAPI PlayMetaFile( HDC hdc, HMETAFILE hmf ) ; где
-
hdc - контекст для устройства или отображения, в который осуществляется вывод из метафайла с идентификатором 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 - имя метафайла на жёстком диске (полное путевое имя); |
НАЗНАЧЕНИЕ: |
Функция открывает для чтения метафайл на жёстком диске, и связывает с ним идентификатор метафайла; |
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: |
Идентификатор метафайла или ноль в случае ошибки. |
10.5. Приложение № II. Обработка сообщения: WM_PAINT
Как уже это упоминалось автором, окно приложения должно быть способно перерисовать свою внутреннюю его поверхность или любую его часть в любой момент времени, при получении сообщения: 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 к
"Общие сведения о контексте GDI"
, в пункте 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 координату правого нижнего угла прямоугольной области.
Координаты задаются в единицах измерения, называемых пикселями. Пиксель - это минимальные точки на экране, из которых строится изображения. Приложение может определить любой размер любого своего окна или размер используемого шрифта при помощи специальных функций.