Winapi 发送什么Windows消息来重新绘制部分遮挡的窗口?

Winapi 发送什么Windows消息来重新绘制部分遮挡的窗口?,winapi,windows-xp,messaging,paint,Winapi,Windows Xp,Messaging,Paint,我知道WM_PAINT告诉一个窗口,它需要完全重新绘制自己,但显然,当它被部分覆盖,然后它前面的窗口不再碍事,它需要重新绘制脏的部分时,这不是发送的消息。有人知道在这种情况下会发送什么消息吗 编辑:发现问题: 这个问题涉及到我编写的一个Delphi控件,它在Delphi窗体上嵌入了一个渲染面。SDL有一个API可以在另一个窗口的HWND上构建其渲染器,并将其标记为“外部窗口” SDL通常在内部处理WM_PAINT,因此我不得不在SDL的WindowProc中添加一些代码,以便将消息转发到外部Wi

我知道WM_PAINT告诉一个窗口,它需要完全重新绘制自己,但显然,当它被部分覆盖,然后它前面的窗口不再碍事,它需要重新绘制脏的部分时,这不是发送的消息。有人知道在这种情况下会发送什么消息吗

编辑:发现问题:

这个问题涉及到我编写的一个Delphi控件,它在Delphi窗体上嵌入了一个渲染面。SDL有一个API可以在另一个窗口的HWND上构建其渲染器,并将其标记为“外部窗口”


SDL通常在内部处理
WM_PAINT
,因此我不得不在SDL的WindowProc中添加一些代码,以便将消息转发到外部WindowProc(如果它是外部窗口)。这有时是可行的,但结果是出现了一个小故障,从窗口的数据结构中剥离了外部窗口标志,因此它吞下了消息,而不是将其传递给我的应用程序。一旦我解决了这个问题,我就开始一直收到
WM\u-PAINT
消息。

我非常确定Win32 API使用
WM\u-PAINT
甚至用于部分重新绘制。发件人:

当系统或其他应用程序请求绘制应用程序窗口的一部分时,将发送
WM_PAINT
消息。[我的斜体字]

该链接包含有关
WM_PAINT
的全部详细信息,但是如果如您所说,WM_PAINT消息没有被发送用于部分重画,则需要确定的工具是该链接。

BeginPaint()函数在其第二个参数中返回需要验证的rect:


查看psPaint.rcPaint:

WM_PAINT
被发送以指示窗口的某些部分(包括整体)需要重新喷漆


调用以获取要更新的区域的边界矩形。此信息也包含在传递给的PAINTSTRUCT(作为rcPaint字段)中。

为什么您说它显然不是?应调用以进行部分重画(更新的rect由或返回)。如果它看起来没有被调用,那么你的应用程序中可能有一个bug阻止了它。你看到什么让你相信它不起作用了?

看看。在某些情况下,不发送
WM_PAINT
,而是发送
WM_PRINTCLIENT
消息。(例如。)

因为我有一个Delphi组件,它有一个处理WM_PAINT的方法,但是没有调用它来进行部分重画。因此,我只能得出结论,没有WM_油漆被发送。要么是这样,要么是在某个地方出现了一些非常错误的情况,因为我对完整绘制的效果很好。你在做什么来调用部分重画(以及什么操作系统?)我只在XP上看到了这一点,因为Vista在将每个表单绘制到屏幕之前,会将它们的外观存储在自己的缓冲区中。我正在做的是打开另一个窗口,它显示在我正在使用的表单前面,然后将我的表单带回前台。所有的东西都被正确地重新绘制了,除了一个组件,它永远不会得到WM_PAINT消息,我正在试图弄清楚发生了什么以及为什么。所有的5个答案都是正确的:WM_PAINT是当您的部分或全部客户区需要重新绘制时发送的消息。在较新版本的Windows上,它不像以前那样频繁地发送,因为Windows正在更积极地缓存桌面,以实现分层窗口和玻璃窗口的视觉效果——在这种情况下,Windows从内部位图绘制,根本不发送任何类型的消息。
case WM_PAINT:
{
PAINTSTRUCT psPaint;
HDC hdc = BeginPaint( hwnd, &psPaint );
// psPaint.rcPaint contains invalidated area
EndPaint (hwnd, &psPaint);
}
return 0;