2011-04-16 46 views
0

我有一個關於奇怪發起WM_PAINT消息發送到我的窗口的問題。它發生在Windows 7並且不會發生在Windows XPWindows 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上顯示呢?

感謝您的任何線索!

丹尼

回答

2

心理調試時間(換句話說,我完全猜)...

請記住,你只能更新一個窗口,從中創建窗口的線程的內容。如果您從創建窗口的線程以外的其他線程調用GetDC().. ReleaseDC(),我並不驚訝它會導致問題。

Vista/Win7的計時器API與XP中的計時器API有完全不同的實現,完全有可能您的計時器可能在不同的線程上運行。

而不是繪製定時器,爲什麼不發佈消息到窗口指示定時器發射。然後在消息處理程序中,使窗口的區域無效。然後處理WM_PAINT處理程序中的繪製線。

一般來說,如果您在WM_PAINT處理程序中的窗口上繪製而不是在其他窗口消息中繪畫,Windows會更加快樂。

+0

謝謝。是的,我確定從系統提供的任意線程更新GUI,這可能不是創建窗口的那個線程。你是否指出在哪裏表示禁止這樣做?關於GetDC的這個頁面http://msdn.microsoft.com/en-us/library/dd144871%28VS.85%29.aspx只規定只有**一個**線程應該在上下文中操作,一旦獲得。 – Denny 2011-04-16 22:19:34

+0

上面引用的頁面中的一些引用:「請注意,DC的句柄只能在任何時候由單個線程使用...... ReleaseDC必須從調用GetDC的同一線程調用」 – Denny 2011-04-16 22:20:38

+0

Windows綁定到創建窗口的線程。您可能能夠從另一個線程與窗口進行交互,但不能保證。你有沒有嘗試過我的建議(將計時器調回窗口線程),看看它是否有幫助? – 2011-04-17 02:21:49