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

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

【问题讨论】:

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

标签: c++ visual-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 中的一个错误。在我的代码中进行测试后,您的方法还可以阻止控件的边框刷新(闪烁)。
猜你喜欢
  • 1970-01-01
  • 2017-06-30
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 2022-06-19
  • 1970-01-01
  • 2023-03-06
相关资源
最近更新 更多