为了其他人的利益,我将提供我的 hackorama(感谢 Hans!)以供参考。
当我最初构建我的树时,我现在在我将在我的 ...OnDrawText(object sender, DrawTreeNodeEventArgs e) 方法中修改的节点的 .Text 末尾填充空白。在这种方法中,我使用 TextRenderer.DrawText 来自定义节点的外观,但是在计算我的滚动条大小时不会考虑与自定义内容对应的矩形。滚动条的大小仍然由原始文本决定。由于原始文本(大量)填充了空白,因此滚动条被适当地绘制。
我不确定随着时间的推移这将如何保持,但它现在有效。
2012 年 11 月 12 日编辑:要隐藏工具提示,请忽略一些 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;