0

我有一个关于奇怪地发送到我的窗口的 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 上呢?

感谢您提供任何线索!

丹尼

4

1 回答 1

2

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

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

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

与其在计时器中绘图,不如向窗口发布一条消息,指示计时器已触发。然后在消息处理程序中,使窗口的区域无效。然后在 WM_PAINT 处理程序中处理绘制线条。

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

于 2011-04-16T22:01:45.487 回答