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

См. также

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

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

BeginPaint

DefWindowProc

DispatchMessage

EndPaint

GetMessage

GetUpdateRect

PeekMessage

RedrawWindow

UpdateWindow

WM_ERASEBKGND

WM_NCPAINT

WM_PRINT

WM_PRINTCLIENT