我有一個關於奇怪發起WM_PAINT消息發送到我的窗口的問題。它發生在Windows 7並且不會發生在Windows XP。Windows 7發送不必要的WM_PAINT消息
詳細
在我的計劃,我有一個觸發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)。
問題
是不是新的東西關於WDM或W7處理窗口?任何方式來避免這種情況?
這可能是我的程序或我正在使用的圖形工具包(或兩者)的錯誤。但爲什麼它只在Windows 7上顯示呢?
感謝您的任何線索!
丹尼
謝謝。是的,我確定從系統提供的任意線程更新GUI,這可能不是創建窗口的那個線程。你是否指出在哪裏表示禁止這樣做?關於GetDC的這個頁面http://msdn.microsoft.com/en-us/library/dd144871%28VS.85%29.aspx只規定只有**一個**線程應該在上下文中操作,一旦獲得。 – Denny 2011-04-16 22:19:34
上面引用的頁面中的一些引用:「請注意,DC的句柄只能在任何時候由單個線程使用...... ReleaseDC必須從調用GetDC的同一線程調用」 – Denny 2011-04-16 22:20:38
Windows綁定到創建窗口的線程。您可能能夠從另一個線程與窗口進行交互,但不能保證。你有沒有嘗試過我的建議(將計時器調回窗口線程),看看它是否有幫助? – 2011-04-17 02:21:49