Пространство отображения
Прежде чем приступать к рисованию, приложение должно получить в свое распоряжение пространство отображения , которое называется Presentation Space (PS ).
Пространство отображения можно представить себе как холст, на котором будет выполняться рисование. Однако в отличие от обычного холста, которым пользуются художники, в комплекте с пространством отображения приложение получает набор инструментов для рисования, таких как шрифт для рисования текста, набор цветов, "карандаш" для рисования линий определенной толщины, систему координат и т. д.
При необходимости приложение может изменять свойства пространства отображения, выбирая, например, другой шрифт или другой цвет для рисования.
Одним из важных атрибутов пространства отображения является размер области отображения. Например, если приложение получило пространство отображения для окна Client Window , оно может рисовать только во внутренней области этого онка. Если же получено пространство отображения для окна Frame Window , область рисования будет шире.
Подробным изучением атрибутов пространства отображения мы займемся позже, а пока расскажем о двух способах получения идентификатора пространства отображения.
Первый способ используется только при обработке сообщения WM_PAINT . Он заключается в вызыве функции WinBeginPaint :
HPS hps; RECTL rec; . . . case WM_PAINT : { hps = WinBeginPaint (hWnd, NULLHANDLE, &rec); . . . // Вызов функций рисования . . . WinEndPaint (hps); return 0; }
Функция WinBeginPaint возвращает идентификатор пространства отображения, который в дальнейшем будет использоваться всеми функциями рисования.
Заметим, что перед тем как вернуть управление, обработчик сообщения WM_PAINT должен освободить полученное пространство отображения при помощи фукнции WinEndPaint .
Прототип функции WinBeginPaint приведен ниже:
HPS WinBeginPaint ( HWND hwnd, // идентификатор окна HPS hps, // идентификатор пространства отображения PRECTL prclPaint); // область ограничения
Через параметр hwnd функции WinBeginPaint передается идентификатор окна, для которого необходимо получить пространство отображения.
Вы можете указать идентификатор любого окна, созданного вашим приложением, или значение HWND_DESKTOP . В последнем случае будет получено пространство отображения, пригодное для рисования во всей области рабочего стола Workplace Shell.
Для получения так называемого кэшированного пространства отображения (которое мы будем использовать в приложениях, исходные тексты которых приведены в этой книге) для параметра hps необходимо указать значение NULLHANDLE. Подробнее о типах пространств отображения вы узнаете позже.
Что же касается параметра prclPaint, то вы можете указать его как NULL либо передать через этот параметр указатель на структуру типа RECTL, описывающую координаты прямоугольной области.
Если этот параметр указан как NULL, от функции WinBeginPaint будет получено пространство отображения, пригодное для рисования в любом месте окна, заданного параметром hwnd. В противном случае в структуру типа RECTL записываются размеры области, которая будет перерисована.
Структура RECTL определена следующим образом:
typedef struct _RECTL { LONG xLeft; // координата X левой границы // прямоугольной области LONG yBottom; // координата Y нижней границы области LONG xRight; // координата X правой границы области LONG yTop; // координата Y верхней границы области } RECTL; typedef RECTL *PRECTL;
В случае успеха функция WinBeginPaint возвращает идентификатор полученного пространства отображения. При ошибке возвращается значение NULLHANDLE.
Рассмотрим теперь второй способ получения пространства отображения, который должен использоваться во всех случаях, кроме обработки сообщения WM_PAINT . Этот способ основан на использовании функции WinGetPS :
HPS hps; . . . case WM_BUTTON1DOWN : { hps = WinGetPS (hWnd); . . . // Вызов функций рисования . . . WinReleasePS (hps); return 0; }
Функция WinGetPS возвращает идентификатор пространства отображения для окна, идентификатор которого передается ей в качестве единственного параметра.
Отметим, что после завершения процедур рисования вы должны освободить пространство отображения, полученное от функции WinGetPS , при помощи функции WinReleasePS (но не в коем случае не при помощи функции WinEndPaint , которая используется только в паре с функцией WinBeginPaint ).