2010-02-24 14 views
32

當我想重新繪製一個窗口時,是否有任何首選函數在InvalidateRect和RedrawWindow之間調用?InvalidateRect和RedrawWindow之間的區別

舉例來說,在這兩個調用等於:(勝利將是一個HWND)
​​

的主要問題(S):什麼時候應該使用一個或其他?背景中是否有差異? (不同的WM_messages /焦點/順序/優先級..)

我想重畫窗口的原因是因爲我發送一個新的圖像,我希望它顯示,這意味着窗口的內容不再有效。

+0

參見http://stackoverflow.com/questions/7360500/what-are-the-differences-between-redrawwindow-and-updatewindow-in-win32 – cdiggins 2013-05-02 16:46:10

回答

46

InvalidateRect不會立即重新繪製窗口。它只是爲窗口的特定矩形區域「計劃」未來重繪。使用InvalidateRect您可以根據需要安排儘可能多的區域,使其在某些內部緩衝區中累積。對於所有累計的計劃區域的實際重繪將在稍後進行,當窗口沒有其他事情要做時。 (當然,如果在您發出InvalidateRect呼叫時窗口閒置,重新繪製將立即進行)。

您也可以通過調用UpdateWindow來強制立即重繪所有當前累積的無效區域。但是,如果您不急,明確呼籲UpdateWindow不是必要的,因爲一旦窗口空閒,它將自動爲所有當前無效的區域執行重繪。另一方面,另一方面,它具有更廣泛和更靈活的功能。它可以用來執行無效調度(即與InvalidateRect一樣),也可以用於強制執行指定區域的立即重繪,而不執行任何「調度」。在後一種情況下,撥打RedrawWindow幾乎等同於撥打InvalidateRect,然後立即撥打UpdateWindow

1

我不喜歡只是提供鏈接,但MSDN爲您提供了所有您需要的信息,如果在此處重新輸入它將浪費時間。

RedrawWindow

InvalidateRect

總之,是有分歧。問題是,你爲什麼要重畫窗口?是因爲內容不再有效嗎?如果是這樣,請使用InvalidateRect,否則使用RedrawWindow

+0

我一直在MSDN和檢查的職能,但我做出的結論是,他們最終通過使矩形無效發送WM_PAINT到窗口。 對你的問題的回答是肯定的,內容無效(這是桌面圖像)。我以恆定速率向窗口發送圖像,然後向窗口發送InvalidateRect以便更新 - 我可以問問另一個原因可能是什麼? – Default 2010-02-24 13:08:54

+0

什麼可以是「其他」原因? – 2015-04-28 10:05:31

1

RedrawWindow立即重新繪製窗口。 InvalidateRect僅標記要在下一個WM_PAINT消息上重新繪製的窗口。但WM_PAINT消息的優先級低於其他消息,因此如果您的應用程序忙於處理其他消息,重新繪製將不會立即生效。

+0

可能值得注意的是,所有「重繪」都需要一個「WM_PAINT」消息。 Thre無法繞過它。 'RedrawWindow'也會發送一個WM_PAINT到你的窗口。不同之處在於'RedrawWindow'會以立即處理的方式發送它。 – AnT 2010-02-24 17:28:35

19

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似乎更清潔。