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

时间:2009-11-23 03:47:09

标签: winapi windows-xp messaging paint

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

编辑:发现问题:

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

SDL通常在内部处理WM_PAINT,因此我最终必须向SDL的WindowProc添加一些代码,以便将消息转发到外部WindowProc(如果它是外部窗口)。这有时是有效的,但事实证明有一个小故障正在从窗口的数据结构中剥离外部窗口标志,所以它吞下了消息而不是将其传递给我的应用程序。一旦我解决了这个问题,我就开始一直收到WM_PAINT消息。

5 个答案:

答案 0 :(得分:1)

发送

WM_PAINT表示需要重新绘制窗口的某些部分(包括整数)。

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

答案 1 :(得分:1)

为什么你说这显然不是?应该调用WM_PAINT进行部分重绘(更新的rect由BeginPaintGetUpdateRect返回)。如果它似乎没有被调用,则应用程序中的其他地方可能存在阻止它的错误。你看到什么导致你相信它不起作用?

答案 2 :(得分:0)

我非常确定Win32 API即使是部分重绘也会使用WM_PAINT。来自MSDN

  

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

该链接具有WM_PAINT的完整详细信息,但如果您说,WM_PAINT消息正在发送以进行部分重绘,则Spy++是您的工具需要确定。

答案 3 :(得分:0)

BeginPaint()函数返回需要在其第二个参数中进行验证的rect:http://msdn.microsoft.com/en-us/library/dd183362(VS.85).aspx

case WM_PAINT:
{
PAINTSTRUCT psPaint;
HDC hdc = BeginPaint( hwnd, &psPaint );
// psPaint.rcPaint contains invalidated area
EndPaint (hwnd, &psPaint);
}
return 0;

查看psPaint.rcPaint:http://msdn.microsoft.com/en-us/library/dd162768(VS.85).aspx

答案 4 :(得分:0)

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