【问题标题】:Custom TreeNode bounds自定义 TreeNode 边界
【发布时间】:2010-12-28 12:13:19
【问题描述】:

如何将 TreeView 节点的标准鼠标行为(如选择、热跟踪、双击展开等)扩展到更宽的节点区域?我有一个自定义绘制的节点,它的标签比系统绘制的要宽,并且它只在光标位于普通节点范围内时才对鼠标操作做出反应。

有什么想法吗?

顺便说一句,拦截 TVM_GETITEMRECT 和 TVM_HITTEST 不会奏效。

关于我正在做的事情的几句话:我正在开发一个 WinForms 树控件,它通常与 WinForms TreeView 完全相同,但也允许添加可以将自定义字体和颜色应用于任何部分的特殊节点他们的标签。所以它有点像“RichTreeView”,例如可以在其文本中包含带有粗体单个单词的节点。通过一些繁重的字体修补,节点标签可以比常规更宽,但也更窄(这会导致抑制鼠标操作的另一个问题),因此我的问题。

【问题讨论】:

    标签: .net winforms treeview controls


    【解决方案1】:

    是的,这是本机 Windows 控件的问题。它没有任何方法可以指定自定义项目边界。 TVN_GETDISPINFO 通知可能是最接近的,但 NMTVDISPINFO 缺少指定边界的方法。 .NET 包装器没有实现它。实现一个 VirtualMode 就足够了。

    这会根据原始指标保持命中测试和 TreeNode.Bounds。尤其是水平滚动条的一个问题,如果它比原来的宽,它不会滚动到足以显示所有自定义绘制的文本。您可以通过实现 MouseDown 和迭代 TreeNode.Bounds 属性在一定程度上解决命中测试问题,但不能解决滚动条问题。

    对此没有干净的解决方案,只有一个丑陋的解决方案。将 TreeNode.Text 设置为足够宽以解决问题的任意字符串。如有必要,您可以使用 Tag 属性来存储实际文本。这取决于您绘制的自定义方式,在 Text 前面加上几个 M 可能就足够了。不漂亮。

    【讨论】:

    • 嘘,我怀疑没有干净的方法可以做到这一点。这个虚拟文本技巧值得考虑。我有一个 TreeNode 派生类,我希望它在放置在标准 TreeView 中时的行为与标准 TreeNode 完全一样,因此如果 lib 使用者想要使用它,则无法使用标记作为占位符(私有字段更好选项)。一个更大的问题是让非虚拟文本像往常一样工作。我想捕获 TVM_SETITEM 并植入虚拟文本可能会起作用。但这是更难看的解决方法代码。无论如何,谢谢,我需要考虑一下我想用这个有多脏......
    猜你喜欢
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 2014-07-24
    相关资源
    最近更新 更多