c# - .NET Form Treeview 节点宽度和自定义绘制文本(无法设置节点边界)

标签 c# winforms treeview ownerdrawn

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

在我的 OnDrawText 方法中,我希望能够更改 DrawTreeNodeEventArgs 的节点成员的边界,但它是只读的。

我苦苦寻找了很长时间的解决方案,但无济于事。设置 TreeView 本身的边界不会使滚动条出现。我在我的 OnDrawText 方法中使用 TextRenderer.DrawText(),如果这会产生影响的话。

非常感谢任何帮助!

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

最佳答案

为了其他人的搜索,我将提供我的 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;

关于c# - .NET Form Treeview 节点宽度和自定义绘制文本(无法设置节点边界),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12484383/

相关文章:

c# - Cosmosdb : "message" :"Syntax error, invalid numeric value token ' 4d5f'.“错误

c# - 设置 ToolStripStatusLabel 对象上的光标类型

c# - 从 TreeView 中绑定(bind)到命令

java - 使用适配器应对两种不同情况

c# - 静态类引用名

c# - 如何将 IList<MyObject> 作为参数传递给 Web API 中的 POST 方法?

c# - 我如何使用 JQuery getJSON 来验证用户名

winforms - 防止多个表单实例

c# - TreeView_NodeMouseClick 处理程序

javascript - 如何在 JavaScript 中从 JSON 树获取嵌套父路径?