當我想重新繪製一個窗口時,是否有任何首選函數在InvalidateRect和RedrawWindow之間調用?InvalidateRect和RedrawWindow之間的區別
舉例來說,在這兩個調用等於:(勝利將是一個HWND)
的主要問題(S):什麼時候應該使用一個或其他?背景中是否有差異? (不同的WM_messages /焦點/順序/優先級..)
我想重畫窗口的原因是因爲我發送一個新的圖像,我希望它顯示,這意味着窗口的內容不再有效。
當我想重新繪製一個窗口時,是否有任何首選函數在InvalidateRect和RedrawWindow之間調用?InvalidateRect和RedrawWindow之間的區別
舉例來說,在這兩個調用等於:(勝利將是一個HWND)
的主要問題(S):什麼時候應該使用一個或其他?背景中是否有差異? (不同的WM_messages /焦點/順序/優先級..)
我想重畫窗口的原因是因爲我發送一個新的圖像,我希望它顯示,這意味着窗口的內容不再有效。
InvalidateRect
不會立即重新繪製窗口。它只是爲窗口的特定矩形區域「計劃」未來重繪。使用InvalidateRect
您可以根據需要安排儘可能多的區域,使其在某些內部緩衝區中累積。對於所有累計的計劃區域的實際重繪將在稍後進行,當窗口沒有其他事情要做時。 (當然,如果在您發出InvalidateRect
呼叫時窗口閒置,重新繪製將立即進行)。
您也可以通過調用UpdateWindow
來強制立即重繪所有當前累積的無效區域。但是,如果您不急,明確呼籲UpdateWindow
不是必要的,因爲一旦窗口空閒,它將自動爲所有當前無效的區域執行重繪。另一方面,另一方面,它具有更廣泛和更靈活的功能。它可以用來執行無效調度(即與InvalidateRect
一樣),也可以用於強制執行指定區域的立即重繪,而不執行任何「調度」。在後一種情況下,撥打RedrawWindow
幾乎等同於撥打InvalidateRect
,然後立即撥打UpdateWindow
。
我不喜歡只是提供鏈接,但MSDN爲您提供了所有您需要的信息,如果在此處重新輸入它將浪費時間。
總之,是有分歧。問題是,你爲什麼要重畫窗口?是因爲內容不再有效嗎?如果是這樣,請使用InvalidateRect
,否則使用RedrawWindow
。
我一直在MSDN和檢查的職能,但我做出的結論是,他們最終通過使矩形無效發送WM_PAINT到窗口。 對你的問題的回答是肯定的,內容無效(這是桌面圖像)。我以恆定速率向窗口發送圖像,然後向窗口發送InvalidateRect以便更新 - 我可以問問另一個原因可能是什麼? – Default 2010-02-24 13:08:54
什麼可以是「其他」原因? – 2015-04-28 10:05:31
RedrawWindow立即重新繪製窗口。 InvalidateRect僅標記要在下一個WM_PAINT消息上重新繪製的窗口。但WM_PAINT消息的優先級低於其他消息,因此如果您的應用程序忙於處理其他消息,重新繪製將不會立即生效。
可能值得注意的是,所有「重繪」都需要一個「WM_PAINT」消息。 Thre無法繞過它。 'RedrawWindow'也會發送一個WM_PAINT到你的窗口。不同之處在於'RedrawWindow'會以立即處理的方式發送它。 – AnT 2010-02-24 17:28:35
RedrawWindow(win, NULL, NULL, RDW_INVALIDATE);
和InvalidateRect(win, NULL, NULL);
是等同的。這兩個函數都使窗口無效。在兩種情況下,WM_PAINT
都發生在正常時間(應用程序隊列中沒有其他消息)。
如果您想要立即完成繪畫,請撥打RedrawWindow(win, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW)
或InvalidateRect
後跟UpdateWindow
即可。
RedrawWindow
只是給出了RDW_ *位的更多選項。如果你只想讓沒有立即着色的窗口失效,那麼調用InvalidateRect
似乎更清潔。
參見http://stackoverflow.com/questions/7360500/what-are-the-differences-between-redrawwindow-and-updatewindow-in-win32 – cdiggins 2013-05-02 16:46:10