Windows 7发送不必要的WM_PAINT消息

时间:2011-04-16 21:53:33

标签: windows-7 wm-paint

我有一个关于奇怪地发送到我窗口的WM_PAINT消息的问题。它发生在 Windows 7 上,并且不会发生在 Windows XP 上。

详细

在我的程序中,我有一个触发GUI更新的计时器,计时器基于此API调用:

CreateTimerQueueTimer

在提供系统处理计时器到期的线程中,我做了一些GUI更新,即在窗口(0,0) - >(57,50)中画一条线:

HDC hdc = GetDC (hwnd);
MoveToEx (hdc, 0, 0, NULL);
LineTo (hdc, 57, 50);
ReleaseDC(hwnd,hdc);

正如我在 Windows XP 上所期望的那样,但在 Windows7 上,这使得系统将WM_PAINT消息发送到此窗口并带有更新区域:(0 ,0,58,51)即可。请注意,矩形比受该线影响的方形区域宽一个像素。

由于这张图而到达的WM_PAINT是我不明白的。窗口未被触摸/重叠/调整大小等等。显然,该行被系统识别为矩形的无效。

这只发生在Windows 7(而不是Windows XP)中。

问题

W7中的WDM或Windows处理是否是新的东西?有什么方法可以避免这种情况吗?

这可能是我的程序或我正在使用的图形工具包(或两者)中的错误。但是为什么它只在Windows 7上出现呢?

感谢您的任何线索!

丹尼

1 个答案:

答案 0 :(得分:2)

心理调试时间(换句话说,我完全猜测)......

请记住,您只能从创建窗口的线程更新窗口的内容。如果你从创建窗口的线程以外的线程调用GetDC().. ReleaseDC(),我不会惊讶它会导致问题。

Vista / Win7的计时器API与XP中的计时器API具有完全不同的实现,完全有可能您的计时器可能在不同的线程上运行。

为什么不在窗口中发布消息,指示计时器被触发,而不是在计时器中绘图。然后在消息处理程序中,使窗口的区域无效。然后处理在WM_PAINT处理程序中绘制线条。

一般情况下,如果在WM_PAINT处理程序中的窗口上绘制而不是在其他窗口消息期间绘制,Windows会更快乐。