Прочитать на английском

Поделиться через


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 [только классические приложения]
Заголовок
Winuser.h (включая Windows.h)

См. также раздел

Общие сведения о рисовании и рисовании

Рисование и рисование сообщений

BeginPaint

DefWindowProc

DispatchMessage

EndPaint

GetMessage

GetUpdateRect

PeekMessage

RedrawWindow

UpdateWindow

WM_ERASEBKGND

WM_NCPAINT

WM_PRINT

WM_PRINTCLIENT