Опубликован: 15.11.2010 | Уровень: для всех | Доступ: платный
Лекция 10:

Общие сведения о контексте GDI

< Лекция 9 || Лекция 10: 123 || Лекция 11 >

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 координату правого нижнего угла прямоугольной области.

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

< Лекция 9 || Лекция 10: 123 || Лекция 11 >
Artem Bardakov
Artem Bardakov
Россия
Андрей Алабин
Андрей Алабин
Россия