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.
Комментарии
Сообщение 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 [только классические приложения] |
Заголовок |
|
См. также раздел