我對C++中的窗口函數有些懷疑。 究竟"invalidate()"
函數做什麼? 它發送什麼信息?當我們需要調用它時? "update()"
功能又是什麼? 是"invalidaterect()"
的作用類似於"invalidate()"
的功能?什麼是無效的,更新方法在VC++中做什麼
感謝
我對C++中的窗口函數有些懷疑。 究竟"invalidate()"
函數做什麼? 它發送什麼信息?當我們需要調用它時? "update()"
功能又是什麼? 是"invalidaterect()"
的作用類似於"invalidate()"
的功能?什麼是無效的,更新方法在VC++中做什麼
感謝
CWnd::Invalidate()
使窗口的整個客戶區失效,這表示該區域已過期,應該重新繪製。您通常會在需要重繪的控件上調用它。 CWnd::InvalidateRect()
僅使窗口的一部分無效。
隨着Invalidate
功能,WM_PAINT
消息將張貼[不嚴格;請參閱評論]到消息隊列並在將來的某個時間點處理。 CWnd::UpdateWindow()
發送(而不是帖子)WM_PAINT
消息,導致無效區域立即重新繪製。
真的,這一切都在文檔中。
的無效功能標記爲無效繪圖區域。當窗口重新繪製時使用該標誌,如果該區域失效,則將重新繪製該區域,否則將僅保持原來的屏幕區域。 invalidate使給定對象的整個客戶區失效,invalidaterect使客戶區的特定區域無效。更新函數進行實際重繪。
這樣一個機制的原因,而不是僅僅當你知道某些東西需要改變時立即繪製,就是你可以防止多次重繪,比如說你一次接收到三個keydown消息,它們滾動一些文本區域。如果您爲每個按鍵重新繪製文本區域,則必須繪製文本區域三次,並且應用程序將無響應。通過代替處理所有關鍵事件,在重繪textarea之前更新附加到文本區域的數據結構並使文本區域無效,您只需重繪textarea一次。
你的意思是,我們不應該在應用程序權限中的一個實例中調用「Invalidate」或「CWnd :: UpdateWindow()」 ? 我們需要調用其中一個正確的方法來獲得wm_paint消息 – Naruto 2010-02-02 11:58:10
確實如此。調用兩者都不是必需的。只有當相同的線程在之後做了一些冗長的計算時,你通常纔會調用'UpdateWindow',所以它不會很快回到它的消息循環。在這種情況下,你想立即重繪,不要等到更方便的時候。但一般來說,使用'Invalidate'。 – Thomas 2010-02-02 12:01:54
oh ok謝謝你.. – Naruto 2010-02-02 13:21:28