在像擴展/摺疊樹中的所有節點這樣的昂貴操作期間,有沒有辦法暫停CTreeCtrl
或其CTreeView
的渲染?如果沒有像PauseRendering(TRUE)
或其他類似的函數,是否有可能截取繪圖消息,並且只有在我的ExpandAll方法未被調用時纔將其轉發給樹?暫停渲染/繪圖CTreeCtrl(MFC)
回答
您可以使用WM_SETREDRAW
消息:當使用wParam
發送到FALSE
時,它將阻止窗口接收WM_PAINT
消息;當與wParam
發送到TRUE
它將被設置爲正常。
不要忘記手動重繪窗口在完成後,因爲它不是自動完成:
RedrawWindow(hWnd, NULL, NULL, RDW_ERASE|RDW_FRAME|RDW_INVALIDATE|RDW_ALLCHILDREN);
謝謝!我包圍了電話到我的'ExpandAll'法'樹形>的SendMessage(WM_SETREDRAW,FALSE)'和'樹形>的SendMessage(WM_SETREDRAW,TRUE)',並加快它增色不少。我會注意到'CWnd :: RedrawWindow'方法在從CTreeView(無hWND)中調用時僅需要3個參數。 RedrawWindow(NULL,NULL,RDW_ERASE | RDW_FRAME | RDW_INVALIDATE)'爲我工作。再次感謝您的幫助。 – aguazales
現在我唯一的問題是,樹視圖的垂直滾動條仍然在整個過程中繪製(並且由於'ExpandAll'方法是遞歸的,所以看起來很詭異)。但這是一個UI問題,而不是速度問題。 – aguazales
我長期以來都遇到同樣的問題,即使在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); }' 不知道爲什麼我沒有想到前的這幾年:-) –
- 1. 如何暫停離線渲染?
- 2. 如何暫停JavaScript來允許渲染
- 3. Slow DataGridView繪圖\渲染
- 4. MFC中的按鈕CtreeCtrl列
- 5. C++ MFC MDI查看渲染
- 6. OpenGL停止渲染
- 7. MFC繪圖板
- 8. 繪製形狀與渲染圖像?
- 9. 自定義渲染/繪圖的Python GUI
- 10. 緩存石英渲染繪圖到CALayer
- 11. CALayer沒有渲染或繪圖
- 12. 暫停重繪Windows窗體
- 13. wxGLCanvas暫停繪製事件?
- 14. Javascript和渲染暫停並停留在Android瀏覽器的滾動中
- 15. 停用MVC的HTML渲染
- 16. Three.js停止渲染過程
- 17. 在Marionette.js中停止渲染
- 18. 渲染鼠標懸停
- 19. 停止渲染Reactjs組件?
- 20. HTML:停止渲染DIV
- 21. Golang模板停止渲染
- 22. 在MFC應用程序中渲染SVG圖像的最佳庫
- 23. 渲染視圖
- 24. 渲染圖像
- 25. Angular 2 - 在第一個指令被渲染後停止渲染
- 26. 的DirectShow:DES渲染到文件停止渲染使用
- 27. iPhone地圖渲染
- 28. iOS圖形渲染
- 29. Android-圖像渲染
- 30. 視圖渲染4.2
聽起來像線程的工作。 –
大概是真的,但我對C++相當陌生,而且對於MFC來說是全新的,所以我不確定atm會是個好主意,因爲我有一個這個東西的最後期限。 – aguazales