WM_PAINT讯息

【勇芳软件工作室】汉化HomePreviousNext

通常,响应于WM_PAINT消息,应用程序在窗口中绘制。当窗口更改已更改客户端区域的内容时,Windows将此消息发送到窗口过程。只有当应用程序消息队列中没有其他消息时,Windows才会发送消息。

在接收到WM_PAINT消息时,应用程序可以调用BeginPaint来检索客户端区域的显示DC,并在调用GDI函数时使用它来执行更新客户区域所需的任何绘图操作。完成绘图操作后,应用程序将调用EndPaint函数来释放显示DC。

BeginPaint返回显示器DC之前,Windows准备给定窗口的DC。它首先将DC的剪切区域设置为等于需要更新的窗口的部分与用户可见部分的交集。仅重新绘制已更改的窗口部分。画在该区域外的尝试被剪切,不会出现在屏幕上。

BeginPaint返回之前,Windows还可以向窗口过程发送WM_NCPAINTWM_ERASEBKGND消息。这些消息指示应用程序绘制非客户区域和窗口背景。【非临床区】是位于客户区外的窗口的一部分。该区域包括标题栏,窗口菜单(也称为系统菜单)和滚动条等功能。大多数应用程序依赖于默认窗口函数DefWindowProc来绘制该区域,因此将WM_NCPAINT消息传递给此函数。【窗口背景】是在其他绘图操作开始之前填充一个窗口的颜色或图案。背景包括以前在窗口或窗口下的屏幕上的任何图像。如果窗口属于具有类背景画笔的窗口类,则DefWindowProc函数将自动绘制窗口背景。

BeginPaint填充PAINTSTRUCT 结构,其中包含要更新的窗口部分的维度以及指示是否绘制了窗口背景的标志等信息。应用程序可以使用此信息优化绘图。例如,它可以使用由rcPaint成员指定的更新区域的维度来限制仅需要更新的窗口部分。如果应用程序具有非常简单的输出,则可以忽略更新区域并绘制整个窗口,依靠Windows来丢弃(剪切)任何不需要的输出。因为系统剪切在裁剪区域之外展开的图形,所以只有在更新区域中的绘图是可见的。

BeginPaint将窗口的更新区域设置为NULL。这将清除该区域,从而阻止该区域生成后续的WM_PAINT消息。如果应用程序处理WM_PAINT消息但不调用BeginPaint或以其他方式清除更新区域,则只要该区域不为空,应用程序将继续接收WM_PAINT消息。在所有情况下,应用程序必须在从WM_PAINT消息返回之前清除更新区域。

应用程序完成绘图后,应调用EndPaint.对于大多数窗口,EndPaint释放显示器DC,使其可供其他窗口使用。EndPaint也会显示插入符号,如果它以前被BeginPaint隐藏。BeginPaint隐藏插入符,以防止绘图操作破坏它。