如何在更广泛的节点区域扩展TreeView节点的标准鼠标行为(如选择,热跟踪,双击扩展等)?我有一个自定义绘制节点,它具有比系统绘制时更宽的标签,并且只有当光标位于普通节点边界内时才会对鼠标操作做出反应。
任何想法?
顺便说一句,拦截TVM_GETITEMRECT和TVM_HITTEST将无法解决问题。关于我正在做的事情:我正在开发一个WinForms树控件,它通常与WinForms TreeView完全相同,但也允许添加特殊节点,可以将自定义字体和颜色应用于任何部分他们的标签。所以它有点像“RichTreeView”,例如可以在文本中添加带有粗体单个单词的节点。使用一些重字体修补节点标签可以比常规更宽,但也更窄(这导致另一个抑制鼠标操作的问题),因此我的问题。
答案 0 :(得分:2)
是的,这是本机Windows控件的问题。它没有任何方法来指定自定义项边界。 TVN_GETDISPINFO通知可能最接近,但NMTVDISPINFO缺少指定边界的方法。 .NET包装器没有实现它。实际上只有实现VirtualMode才足够好。
基于原始指标保持命中测试和TreeNode.Bounds。对于水平滚动条尤其如此,如果它比原始文本宽,则它不会滚动到足以显示所有自定义绘制的文本。您可以通过实现MouseDown并迭代TreeNode.Bounds属性而不是滚动条问题来解决命中测试问题。
对此没有什么干净的解决办法,只有一个很难看的。将TreeNode.Text设置为足以解决问题的任意字符串。如有必要,您可以使用Tag属性存储实际文本。这取决于你绘制的自定义方式,在文本前加上几个M可能就足够了。不漂亮。