Windows API Урок 13. Рисование в окне - основы
Для рисования в окне мы должны добавить в оконную процедуру обработчик для сообщения Windows WM_PAINT. Обратите внимание, что все рисование происходит именно в обработчике WM_PAINT. Если нам надо нарисовать что-нибудь, например, по левой кнопке мыши, то все равно рисование надо делать не в обработчике WM_LBUTTONDOWN, а в WM_PAINT.
С точки зрения устройства Windows рисование происходит не на самом окне, а на некотором промежуточном слое, который присоединен к окну. Этот промежуточный слой называется контекстом устройства (device context). Т. е. сначала мы должны создать контекст устройства, присоединенный именно к нашему окну, а потом в этом контексте устройства рисовать.
Вот пример кода, рисующего прямоугольник:
LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
// Объявляем контекст устройства.
HDC hdc;
// Объявляем структуру для рисования.
PAINTSTRUCT ps;
switch (Message){
case WM_PAINT:
// Присоединяем контекст устройства к окну.
hdc = BeginPaint(hwnd, &ps);
// Рисуем прямоугольник.
Rectangle(hdc, 10, 10, 40, 80);
// Заканчиваем рисование.
EndPaint(hwnd, &ps);
break;
...
Как вы видите, для рисования мы объявили 2 переменные - hdc и ps. Последняя переменная имеет тип PAINTSTRUCT и нигде не используется, кроме как в вызовах 2 API-функций - BeginPaint и EndPaint. Эта структура у Microsoft плохо документирована - про многие ее поля в MSDN написано, что они зареpзервированны для работы Windows и все. Поэтому мы ничего с ней не делаем, кроме подстановки в качестве параметра в 2 указанные функции. В начале обработчика WM_PAINT мы вызываем BeginPaint, в конце - EndPaint. Основное предназначение BeginPaint - это присоединение контекста устройства к нашему окну (окно определяется первым параметром BeginPaint, а присоединенный контекст устройства - возвращаемым функцией значением).
После того, как мы получили контекст устройства, в нем можно рисовать. Мы рисуем просто прямоугольник. Это мы делаем путем вызова API-функции Rectangle. Обратите внимание, что первым параметром у этой функции идет контекст устройства hdc. Такой первый параметр имеют все функции для рисования. Конкретно для прямоугольника остальные 4 параметра - это координаты его двух противоположенных углов - левого верхнего и правого нижнего.
Результат выполнения программы будет такой:
|