我在Windows窗体中有一个树视图。我最近添加了自定义绘制文本的代码,以便我可以摆弄位置,粗体文本等。一切都很好,除非看起来当我进行更改时节点边界不会更新,因此水平滚动条会混淆思维它不需要显示。我猜这是这种情况,因为当我点击树上的一个节点时,我看到一个我认为是节点边界的框,它太小了。
在我的OnDrawText方法中,我希望能够更改DrawTreeNodeEventArgs的Node成员上的Bounds,但它只是readonly。
我已经找了很长时间的解决方案,现在无济于事。设置树视图本身的边界不会使滚动条出现。我在我的OnDrawText方法中使用TextRenderer.DrawText(),如果这有所不同。
任何帮助都非常感谢!
如果有人认为看到代码有帮助,我会添加它。
答案 0 :(得分:1)
为了其他任何人的利益,我会提供我的hackorama(感谢Hans!)以供参考。
当我最初构建我的树时,我现在将空白填充到我将在我的... OnDrawText(对象发送者,DrawTreeNodeEventArgs e)方法中修改的节点的.Text的末尾。在这个方法中,我使用TextRenderer.DrawText来自定义节点的外观,但是对应于自定义内容的矩形不会被计算出滚动条大小的任何内容考虑在内。滚动条大小仍由原始文本决定。由于原始文本是用空格(大量)填充的,因此滚动条会被适当地绘制。
我不确定这会如何随着时间推移而停滞不前,但它现在有效。
于12/12/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;