WM_PAINT消息
当系统或其他应用程序请求绘制应用程序窗口的一部分时,将发送 WM_PAINT 消息。 调用 UpdateWindow 或 RedrawWindow 函数时发送消息,当应用程序使用 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_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标志的 RedrawWindow 引起的。
系统仅发送一次内部 WM_PAINT 消息。 从 GetMessage 或 PeekMessage 返回内部WM_PAINT消息或由 UpdateWindow 发送到窗口后,系统不会发布或发送进一步WM_PAINT消息,直到窗口失效或重新调用 RedrawWindow 并设置RDW_INTERNALPAINT标志。
对于某些常见控件,默认 WM_PAINT 消息处理会检查 wParam 参数。 如果 wParam 为非 NULL,则控件假定该值为 HDC,并使用该设备上下文进行绘制。
要求 | 值 |
---|---|
最低受支持的客户端 |
Windows 2000 Professional [仅限桌面应用] |
最低受支持的服务器 |
Windows 2000 Server [仅限桌面应用] |
标头 |
|