2010-02-02 73 views
6

我對C++中的窗口函數有些懷疑。 究竟"invalidate()"函數做什麼? 它發送什麼信息?當我們需要調用它時? "update()"功能又是什麼? 是"invalidaterect()"的作用類似於"invalidate()"的功能?什麼是無效的,更新方法在VC++中做什麼

感謝

回答

6

CWnd::Invalidate()使窗口的整個客戶區失效,這表示該區域已過期,應該重新繪製。您通常會在需要重繪的控件上調用它。 CWnd::InvalidateRect()僅使窗口的一部分無效。

隨着Invalidate功能,WM_PAINT消息將張貼[不嚴格;請參閱評論]到消息隊列並在將來的某個時間點處理。 CWnd::UpdateWindow()發送(而不是帖子)WM_PAINT消息,導致無效區域立即重新繪製。

真的,這一切都在文檔中。

+0

你的意思是,我們不應該在應用程序權限中的一個實例中調用「Invalidate」或「CWnd :: UpdateWindow()」 ? 我們需要調用其中一個正確的方法來獲得wm_paint消息 – Naruto 2010-02-02 11:58:10

+3

確實如此。調用兩者都不是必需的。只有當相同的線程在之後做了一些冗長的計算時,你通常纔會調用'UpdateWindow',所以它不會很快回到它的消息循環。在這種情況下,你想立即重繪,不要等到更方便的時候。但一般來說,使用'Invalidate'。 – Thomas 2010-02-02 12:01:54

+0

oh ok謝謝你.. – Naruto 2010-02-02 13:21:28

1

的無效功能標記爲無效繪圖區域。當窗口重新繪製時使用該標誌,如果該區域失效,則將重新繪製該區域,否則將僅保持原來的屏幕區域。 invalidate使給定對象的整個客戶區失效,invalidaterect使客戶區的特定區域無效。更新函數進行實際重繪。

這樣一個機制的原因,而不是僅僅當你知道某些東西需要改變時立即繪製,就是你可以防止多次重繪,比如說你一次接收到三個keydown消息,它們滾動一些文本區域。如果您爲每個按鍵重新繪製文本區域,則必須繪製文本區域三次,並且應用程序將無響應。通過代替處理所有關鍵事件,在重繪textarea之前更新附加到文本區域的數據結構並使文本區域無效,您只需重繪textarea一次。