暂停渲染/绘图 CTreeCtrl (MFC)

Posted

技术标签:

【中文标题】暂停渲染/绘图 CTreeCtrl (MFC)【英文标题】:Pause Rendering/Drawing CTreeCtrl (MFC) 【发布时间】:2013-07-03 13:11:38 【问题描述】:

在展开/折叠树中的所有节点等昂贵操作期间,有没有办法暂停 CTreeCtrl 或其 CTreeView 的渲染?如果没有像 PauseRendering(TRUE) 或类似的函数,是否有可能截获绘图消息,并且仅在未调用我的 ExpandAll 方法时将其转发到树?

【问题讨论】:

听起来像是线程的工作。 可能是真的,但我对 C++ 还很陌生,对 MFC 完全陌生,所以我不确定这是否是一个好主意,因为我有一个截止日期。 【参考方案1】:

您可以使用WM_SETREDRAW 消息:当使用wParam 发送到FALSE 时,会阻止窗口接收WM_PAINT 消息;当用wParam 发送到TRUE 时,它将被设置为正常。

完成后不要忘记手动重新绘制窗口,因为它不是自动完成的:

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

【讨论】:

谢谢!我用Tree->SendMessage(WM_SETREDRAW, FALSE)Tree->SendMessage(WM_SETREDRAW, TRUE) 包围了对我的ExpandAll 方法的调用,它大大加快了它的速度。我会注意到CWnd::RedrawWindow 方法在从 CTreeView(无 hWND)调用时只需要 3 个参数。 RedrawWindow(NULL, NULL, RDW_ERASE|RDW_FRAME|RDW_INVALIDATE) 为我工作。再次感谢您的帮助。 我现在唯一的问题是树视图的垂直滚动条在整个过程中仍然绘制(它看起来很跳跃,因为ExpandAll 方法是递归的)。但这是一个 UI 问题,而不是速度问题。 我遇到同样的问题很久了,即使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 ); 不知道为什么我几年前没有想到这个:-) @JohnC 你做得很好,谢谢。我认为这是 Win32 TreeCtrl 中的一个错误。在我的代码中进行测试后,您的方法还可以阻止控件的边框刷新(闪烁)。

以上是关于暂停渲染/绘图 CTreeCtrl (MFC)的主要内容,如果未能解决你的问题,请参考以下文章

MFC:我们怎样才能轻松地从 CTreeCtrl 切换到 CTreeView?

如何在 MFC 中处理 CTreeCtrl 的状态更改事件

MFC树控件CTreeCtrl

如何在运行时创建的 MFC 中获取 Treeview(CTreeCtrl) 的 Click 事件?

MFC控件:树形控件(CTreeCtrl)

MFC:使用CTreeCtrl和CToolbar创建一个类(CWnd?)