.net 自定义树节点边界

.net 自定义树节点边界,.net,winforms,treeview,controls,.net,Winforms,Treeview,Controls,如何将TreeView节点的标准鼠标行为(如选择、热跟踪、双击扩展等)扩展到更宽的节点区域?我有一个自定义绘制的节点,它有一个比系统绘制时更宽的标签,它只在光标位于普通节点边界内时对鼠标动作作出反应 有什么想法吗 顺便说一句,拦截TVM_GETITEMRECT和TVM_HITTEST不会奏效 关于我所做的几句话:我正在开发一个WinForms树控件,该控件通常与WinForms TreeView的作用完全相同,但也允许添加特殊节点,这些节点可以将自定义字体和颜色应用于其标签的任何部分。例如,它有

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

有什么想法吗

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


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

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

这使得命中测试和TreeNode.Bounds基于原始度量。水平滚动条尤其存在问题,如果滚动条比原始滚动条宽,则滚动的距离不足以显示所有自定义绘制的文本。通过实现MouseDown并迭代TreeNode.Bounds属性,而不是滚动条问题,您可以在某种程度上解决命中测试问题


这个问题没有明确的解决办法,只有一个令人讨厌的解决办法。将TreeNode.Text设置为足够宽的任意字符串以解决问题。如果需要,可以使用Tag属性存储实际文本。这取决于您如何自定义绘制,在文本前面加上几个M可能就足够了。不漂亮。

唉,我怀疑没有干净的方法来做这件事。这个虚拟文本技巧值得考虑。我有一个TreeNode派生的类,我希望它在放置在标准TreeView中时能像标准TreeNode一样工作,所以如果lib使用者想要使用它,就不可能使用标记作为占位符(private field是更好的选择)。一个更大的问题是让非虚拟文本像往常一样工作。我想捕获TVM_SETITEM并植入虚拟文本可能会起作用。但这是更难看的变通代码。不管怎样,谢谢你,我需要想想我想把这个弄得多脏。。。