2009-11-23 28 views
0

我知道WM_PAINT告诉一个窗口,它需要完全重新绘制自己,但显然这并不是在部分覆盖时发送的消息,然后窗口前面的窗口不再出现,并且它需要重新绘制脏部分。有没有人知道在这种情况下发送了什么消息?发送Windows消息以重新绘制部分遮挡的窗口?

编辑:发现问题:

问题涉及到德尔福控制我写的是一个Delphi窗体上嵌入SDL呈现表面。 SDL有一个API在另一个窗口的HWND上构建渲染器,并将其标记为“外部窗口”。

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

+0

所有5个答案都是正确的:WM_PAINT是当您的客户区域的部分或全部需要重新绘制时发送的*消息。在较新版本的Windows上,它并不像以前那样频繁发送,因为Windows为了实现分层窗口和玻璃窗口视觉效果而更积极地缓存桌面 - Windows从内部位图绘制不发送任何类型的消息在那种情况下。 – 2009-11-23 08:52:01

回答

1

为什么你说这显然不是?应调用WM_PAINT进行部分重绘(更新后的矩形由BeginPaintGetUpdateRect返回)。如果它看起来没有被调用,那么应用中其他地方可能存在一个阻止它的错误。你看到的是什么让你相信它不起作用?

+0

因为我有一个Delphi组件,它有一个处理WM_PAINT的方法,但它没有被调用来进行部分重绘。那么我只能得出结论,没有WM_PAINT正在发送。要么是这个,要么是沿线的某个地方非常错误,因为我*对于全面涂料来说很好。 – 2009-11-23 04:23:15

+0

你在做什么来调用部分重绘(以及什么操作系统?) – Toji 2009-11-23 05:57:01

+0

我只在XP上看到这个,因为Vista在将每张表单显示在其自己的缓冲区中之前,将它们绘制到屏幕上。我正在做的是打开另一个窗口,它显示在我正在使用的窗体的前面,然后将窗体重新放回到前台。一切都得到了正确的重新绘制,除了一个组件,它从来没有得到一个WM_PAINT消息,我试图找出发生了什么,为什么。 – 2009-11-23 14:06:30

0

我很确定Win32 API使用WM_PAINT即使对于部分重绘。从MSDN

WM_PAINT消息被发送时的系统或另一应用程序对油漆一个应用程序的窗口的一部分的请求。 [我的斜体]。

这种联系有充分的细节上WM_PAINT,但如果如你所说,WM_PAINT消息是正在为部分重绘发送时,Spy++是你需要找到肯定的工具。

1

WM_PAINT被发送以指示某些部分(包括整个窗户需要重新粉刷。

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

相关问题