簡體   English   中英

InvalidateRect和RedrawWindow之間的區別

[英]Difference between InvalidateRect and RedrawWindow

當我想重繪窗口時,InvalidateRect和RedrawWindow之間是否有任何首選函數?

例如,這兩個調用是否相等:(win將是HWND)
RedrawWindow(win, NULL, NULL, RDW_INVALIDATE);
InvalidateRect(win, NULL, NULL);

主要問題 :我什么時候應該使用其中一個? 背景中是否存在任何差異? (不同的WM_messages /焦點/順序/優先級..)

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

InvalidateRect不會立即重繪窗口。 它只是“安排”窗口特定矩形區域的未來重繪。 使用InvalidateRect您可以根據需要調度多個區域,使它們在某個內部緩沖區中累積 所有累積的預定區域的實際重繪將在稍后進行,此時窗口沒有其他任何操作。 (當然,如果在您發出InvalidateRect調用時窗口處於空閑狀態,則重繪將立即進行)。

您還可以通過調用UpdateWindow強制立即重繪所有當前累積的無效區域。 但是,再次,如果您不趕時間,則不必顯式調用UpdateWindow ,因為一旦窗口空閑,它將自動為所有當前無效的區域執行重繪。

另一方面, RedrawWindow是一個具有更廣泛和靈活的功能集的函數。 它可用於執行無效調度(即InvalidateRect執行的操作),或者可用於強制執行指定區域的立即重繪,而無需執行任何“調度”。 在后一種情況下,調用RedrawWindow實際上等同於調用InvalidateRect然后立即調用UpdateWindow

RedrawWindow(win, NULL, NULL, RDW_INVALIDATE); InvalidateRect(win, NULL, NULL); 是等價的。 這兩個函數使窗口無效。 在兩種情況下, WM_PAINT都在正常時間發生(應用程序隊列中沒有其他消息)。

如果你想立即完成繪制,那么調用RedrawWindow(win, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW)InvalidateRect RedrawWindow(win, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW)然后調用UpdateWindow就可以了。

RedrawWindow只是為RDW_ *位提供了更多選項。 如果你想要的是在沒有立即繪畫的情況下使窗口無效,那么調用InvalidateRect似乎更清晰。

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

RedrawWindow

InvalidateRect

簡而言之,是的,存在差異。 問題是,為什么要重繪窗口? 是因為內容不再有效嗎? 如果是這樣,請使用InvalidateRect ,否則使用RedrawWindow

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM