.NET 表单树视图节点宽度和自定义绘制文本(无法设置节点边界)



我在windows窗体中有一个树视图。我最近添加了自定义绘制文本的代码,这样我就可以摆弄位置、粗体文本等。一切都很好,只是当我进行更改时,节点边界似乎不会更新,所以水平滚动条会被混淆,以为它不需要显示。我猜是这样的,因为当我点击树上的一个节点时,我会看到一个框,我认为它是节点边界,但它太小了。

在我的OnDrawText方法中,我希望能够更改DrawTreeNodeEventArgs的Node成员上的Bounds,但它是只读的。

我痛苦地寻找了很长一段时间的解决方案,但没有成功。设置树视图本身的边界不会显示滚动条。我在OnDrawText方法中使用TextRenderer.DrawText(),如果这有区别的话。

非常感谢您的帮助!

如果有人认为看到代码会有所帮助,我会添加它。

为了其他人的搜索,我将提供我的hackorama(谢谢Hans!)供参考。

当我最初构建我的树时,我现在在将在我的。。。OnDrawText(对象发送方,DrawTreeNodeEventArgs e)方法。在这个方法中,我使用TextRenderer.DrawText来自定义节点的外观,然而,无论是在计算滚动条大小时,都不会考虑与自定义内容相对应的矩形。滚动条的大小仍然由原始文本决定。由于原始文本(大量)填充了空格,因此滚动条可以适当地绘制。

我不确定随着时间的推移,这将如何维持,但目前有效。

2012年12月11日编辑:要隐藏工具提示,请忽略一些WndProc消息。WM_VSCROLL部分用于减少滚动时的闪烁。其他案例与工具提示有关,但我记不清是哪一个做了什么。我认为Notify可能是您唯一需要的方法,但我想我应该添加整个方法以备不时之需。

protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
//case WindowsConstants.WM_HSCROLL:
case WindowsConstants.WM_VSCROLL:
{
var nfy = m.WParam.ToInt32() & 0xFFFF;
if (nfy == WindowsConstants.SB_THUMBTRACK)
{
currentMsgCount++;
if (currentMsgCount % skipMsgCount == 0)
base.WndProc(ref m);
return;
}
if (nfy == WindowsConstants.SB_ENDSCROLL)
currentMsgCount = 0;
base.WndProc(ref m);
}
break;
case WindowsConstants.MouseLeave:
case WindowsConstants.NcMouseLeave:
case WindowsConstants.MouseHover:
case WindowsConstants.NcMouseHover:
case WindowsConstants.Notify:
break;
default:
base.WndProc(ref m);
break;
}
}

public const int NcMouseHover = 0x2a0;
public const int MouseHover = 0x2a1;
public const int NcMouseLeave = 0x2a2;
public const int MouseLeave = 0x2a3;
public const int Notify = 0x4e;

最新更新