2014-01-06 81 views
1

當我移動窗口並同時調整大小時,似乎我的窗口閃爍。這通常發生在從窗口左側進行大小調整時發生。當從左側調整大小時在窗口上閃爍

爲什麼會發生這種閃爍?換句話說,當你重新定位一個窗口時,操作系統在做什麼?

注:從右側這意味着窗口大小調整不一定移動它的起源X和Y

+0

原因是因爲你正在移動整個窗口。 Windows現在將重新繪製該特定位置的所有內容。從右側收縮只會重新繪製其邊框。客戶區域不需要重新繪製,因爲它只是裁剪。從右側伸展需要現在繪製的任何控件以及客戶區。移動一個窗口需要重新繪製每一個組件和客戶區以及其邊界。 – Brandon

+0

@CantChooseUsernames我試圖連接你對這個'SWP_NOCOPYBITS'所說的話。但我認爲它只是複製了一下。 – bluejamesbond

+0

你在使用什麼操作系統?啓用主題(即默認情況下)的Windows XP具有不可避免的閃爍。除Vista以外的所有其他版本的Windows都可以。我沒有試過Vista。 – arx

回答

4

調整窗口大小下一個窗口時,我沒有遇到閃爍涉及操作系統和窗口之間發送的多條消息處理器(WNDCLASSEX結構的lpfnWndProc成員用於register窗口的類)。你可以使用一些消息監控工具自己發現它們。 Visual Studio附帶的Spy++就是這樣一個工具。

一個有趣的消息是WM_NCCALCSIZE:此消息,窗口大小調整過程中調用,可以產生兩個矩形(當WVR_VALIDRECTS標誌設置):源和目標指定什麼舊的窗口的客戶區的內容可以在新的「重用」窗戶的位置。默認情況下,它假定左上角爲樞軸:

  • 調整左側或頂部邊框導致舊的窗口的內容被複制保留樞軸;
  • 調整右側底部邊框的大小不會複製任何內容,因爲窗口的左上角沒有移動。

如果這種默認複製不符合在重繪過程​​中定位視覺效果的方式,則會導致閃爍。例如,在從左邊界或頂部邊界調整大小後,相對於右邊界或下邊界顯示的所有內容都將錯位放置:這些對象將被不必要地移動,在這種調整大小之後會留下奇怪的新舊事物組合,因爲只有未複製的像素將被重新粉刷。如果在WM_SIZE期間嘗試用InvalidateRect來解決混亂問題,您將得到閃爍(事件錯位的時間間隔非常短但仍然存在)。

禁用此行爲的最簡單方法是爲您的窗口設置CS_HREDRAW和CS_VREDRAW Class Styles

+0

很好的答案!爲了跟進,操作系統在從頂部和左側調整大小時嘗試保留數據透視時是否拉伸了舊內容?另外,看起來操作系統也在先移動,然後調整它的大小。你可否確認?另外,我禁用了CS_HREDRAW和CS_VREDRAW並仍然面臨閃爍。 – bluejamesbond

+0

我們該如何停止調用WM_PAINT的setPosWindow? – bluejamesbond

+0

操作系統沒有伸展:它使用源和目標客戶區寬度/高度中較短的一個進行復制。閃爍的另一個原因可能是由於初始化'WNDCLASSEX :: hbrBackground'爲有效筆刷:[WM_ERASEBKGND](http://msdn.microsoft.com/en-us/library/windows/desktop/ms648055(v = vs.85 )。aspx)使用它來清除剩餘的區域,然後您有機會在WM_PAINT中進行重繪。 – NonNumeric

相關問題