WM_PAINT消息

当系统或其他应用程序请求绘制应用程序窗口的一部分时,将发送 WM_PAINT 消息。 调用 UpdateWindowRedrawWindow 函数时发送消息,当应用程序使用 GetMessage 或 PeekMessage 函数获取WM_PAINT消息时,将发送该消息。

窗口通过其 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);
}

GitHub 上的 Windows 经典示例中的例子。

注解

WM_PAINT消息由系统生成,不应由应用程序发送。 若要强制窗口绘制到特定设备上下文中,请使用 WM_PRINTWM_PRINTCLIENT 消息。 请注意,这需要目标窗口支持 WM_PRINTCLIENT 消息。 大多数常用控件支持 WM_PRINTCLIENT 消息。

DefWindowProc 函数验证更新区域。 如果必须绘制窗口框架,函数还可以将 WM_NCPAINT 消息发送到窗口过程,如果必须擦除窗口背景,则发送 WM_ERASEBKGND 消息。

当应用程序的消息队列中没有其他消息时,系统会发送此消息。 DispatchMessage 确定消息的发送位置; GetMessage 确定要调度的消息。 当应用程序的消息队列中没有其他消息时,GetMessage 将返回WM_PAINT消息,并且 DispatchMessage 会将消息发送到相应的窗口过程。

由于调用 RedrawWindow 并设置了RDW_INTERNALPAINT标志,窗口可能会收到内部绘制消息。 在这种情况下,窗口可能不包含更新区域。 应用程序可以调用 GetUpdateRect 函数来确定窗口是否具有更新区域。 如果 GetUpdateRect 返回零,则应用程序无需调用 BeginPaintEndPaint 函数。

应用程序必须通过查看每个WM_PAINT消息的内部数据结构来检查任何必要的内部绘制,因为WM_PAINT消息可能是由非 NULL 更新区域和调用 RedrawWindow 以及设置了RDW_INTERNALPAINT标志的 RedrawWindow 引起的。

系统仅发送一次内部 WM_PAINT 消息。 从 GetMessagePeekMessage 返回内部WM_PAINT消息或由 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