暂停渲染/绘图 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?