сообщение WM_PAINT
Сообщение WM_PAINT отправляется, когда система или другое приложение отправляет запрос на рисование части окна приложения. Сообщение отправляется при вызове функции UpdateWindow или RedrawWindow или функции DispatchMessage , когда приложение получает сообщение WM_PAINT с помощью функции GetMessage или PeekMessage .
Окно получает это сообщение через функцию WindowProc .
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
Параметры
-
wParam
-
Этот параметр не используется.
-
lParam
-
Этот параметр не используется.
Возвращаемое значение
Приложение возвращает ноль, если оно обрабатывает это сообщение.
Пример
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// All painting occurs here, between BeginPaint and EndPaint.
FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
EndPaint(hwnd, &ps);
}
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
Пример из Windows классических примеров на GitHub.
Remarks
Сообщение WM_PAINT создается системой и не должно отправляться приложением. Чтобы принудительно выполнить рисование окна в определенном контексте устройства, используйте сообщение WM_PRINT или WM_PRINTCLIENT . Обратите внимание, что для этого требуется целевое окно для поддержки сообщения WM_PRINTCLIENT . Большинство распространенных элементов управления поддерживают сообщение WM_PRINTCLIENT .
Функция DefWindowProc проверяет регион обновления. Функция также может отправить сообщение WM_NCPAINT процедуре окна, если рамка окна должна быть окрашена и отправлять сообщение WM_ERASEBKGND , если фон окна должен быть удален.
Система отправляет это сообщение, если в очереди сообщений приложения нет других сообщений. DispatchMessage определяет, куда отправлять сообщение; GetMessage определяет, какое сообщение следует отправить. GetMessage возвращает сообщение WM_PAINT , если в очереди сообщений приложения нет других сообщений, а DispatchMessage отправляет сообщение в соответствующую процедуру окна.
В результате вызова RedrawWindow с набором флагов RDW_INTERNALPAINT окно может получать внутренние сообщения рисования. В этом случае в окне может не быть области обновления. Приложение может вызвать функцию GetUpdateRect , чтобы определить, имеет ли окно область обновления. Если GetUpdateRect возвращает ноль, приложению не нужно вызывать функции BeginPaint и EndPaint .
Приложение должно проверить наличие необходимой внутренней картины, просмотрев внутренние структуры данных для каждого сообщения WM_PAINT , так как WM_PAINT сообщение может быть вызвано как областью обновления, отличной от NULL, так и вызовом RedrawWindow с набором флагов RDW_INTERNALPAINT.
Система отправляет внутреннее сообщение WM_PAINT только один раз. После возврата внутреннего сообщения WM_PAINT из GetMessage или PeekMessage или отправляется в окно UpdateWindow, система не публикует или не отправляет дополнительные сообщения WM_PAINT до тех пор, пока окно не будет признано недействительным или до вызова RedrawWindow с набором флагов RDW_INTERNALPAINT.
Для некоторых распространенных элементов управления обработка сообщений по умолчанию WM_PAINT проверяет параметр wParam . Если wParam имеет значение, отличное от NULL, элемент управления предполагает, что значение является HDC и рисует с помощью этого контекста устройства.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента |
Windows 2000 Professional [только классические приложения] |
Минимальная версия сервера |
Windows 2000 Server [только классические приложения] |
Заголовок |
|
См. также