2013-07-03 50 views
1

在像擴展/摺疊樹中的所有節點這樣的昂貴操作期間,有沒有辦法暫停CTreeCtrl或其CTreeView的渲染?如果沒有像PauseRendering(TRUE)或其他類似的函數,是否有可能截取繪圖消息,並且只有在我的ExpandAll方法未被調用時纔將其轉發給樹?暫停渲染/繪圖CTreeCtrl(MFC)

+0

聽起來像線程的工作。 –

+0

大概是真的,但我對C++相當陌生,而且對於MFC來說是全新的,所以我不確定atm會是個好主意,因爲我有一個這個東西的最後期限。 – aguazales

回答

4

您可以使用WM_SETREDRAW消息:當使用wParam發送到FALSE時,它將阻止窗口接收WM_PAINT消息;當與wParam發送到TRUE它將被設置爲正常。

不要忘記手動重繪窗口在完成後,因爲它不是自動完成:

RedrawWindow(hWnd, NULL, NULL, RDW_ERASE|RDW_FRAME|RDW_INVALIDATE|RDW_ALLCHILDREN); 
+0

謝謝!我包圍了電話到我的'ExpandAll'法'樹形>的SendMessage(WM_SETREDRAW,FALSE)'和'樹形>的SendMessage(WM_SETREDRAW,TRUE)',並加快它增色不少。我會注意到'CWnd :: RedrawWindow'方法在從CTreeView(無hWND)中調用時僅需要3個參數。 RedrawWindow(NULL,NULL,RDW_ERASE | RDW_FRAME | RDW_INVALIDATE)'爲我工作。再次感謝您的幫助。 – aguazales

+0

現在我唯一的問題是,樹視圖的垂直滾動條仍然在整個過程中繪製(並且由於'ExpandAll'方法是遞歸的,所以看起來很詭異)。但這是一個UI問題,而不是速度問題。 – aguazales

+2

我長期以來都遇到同樣的問題,即使在SetRedraw爲false的情況下,垂直滾動條也會出現並消失,所以我最終決定做一些事情!該解決方案非常簡單(我的類直接從CTreeCtrl派生): 'CMyTreeCtrl :: DisableRedraw() { SetRedraw(FALSE); ModifyStyle(NULL,TVS_NOSCROLL); } CMyTreeCtrl :: EnableRedraw() { ModifyStyle(TVS_NOSCROLL,NULL); SetRedraw(TRUE); RedrawWindow(NULL,NULL,RDW_NOCHILDREN | RDW_UPDATENOW | RDW_INVALIDATE); }' 不知道爲什麼我沒有想到前的這幾年:-) –