0

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

编辑:发现问题:

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

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

4

5 回答 5

1

WM_PAINT发送以指示窗口的某些部分(包括整个)需要重新绘制。

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

于 2009-11-23T03:59:43.883 回答
1

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

于 2009-11-23T04:01:43.987 回答
0

我很确定 Win32 APIWM_PAINT甚至用于部分重绘。来自MSDN

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

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

于 2009-11-23T03:58:45.123 回答
0

BeginPaint() 函数在其第二个参数中返回需要验证的矩形: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

于 2009-11-23T03:59:40.283 回答
0

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

于 2009-11-24T02:28:33.180 回答