TreeView 所有者绘制异常

我使用的是 Microsoft Visual Studio Community 2017 版本 15.7.2 和 .NET Framework 版本 4.7.03056。


我正在使用 WinformsTreeView并正在修改其默认行为,使其更像 Windows 资源管理器树视图。我设置了以下属性:


LineHeight`    22

DrawMode       OwnerDrawAll

我正在为DrawNode事件使用以下内容。此代码使用右括号和下括号位图(16x16)来显示展开或未展开的节点,并使用自定义颜色来突出显示选择/焦点。没什么异国情调。


private void treeDir_DrawNode(object sender, DrawTreeNodeEventArgs e)

{

    const int indent = 12;

    const int markerSpacing = 20;


    int leftPos = e.Bounds.Left + e.Node.Level * indent;

    Brush selectBrush;

    Pen pen;

    Graphics g = e.Graphics;


    e.DrawDefault = false;


    if (e.Node.IsSelected)

    {

        if (e.Node.TreeView.Focused)

        {

            selectBrush = new SolidBrush(FocusedBackgroundColor);

            pen = new Pen(new SolidBrush(FocusedPenColor));

        }

        else

        {

            selectBrush = new SolidBrush(UnfocusedBackgroundColor);

            pen = new Pen(new SolidBrush(UnfocusedPenColor));

        }


        g.FillRectangle(selectBrush, e.Bounds);

        g.DrawRectangle(pen, e.Bounds);

    }


    if (e.Node.Nodes.Count > 0)

    {

        if (e.Node.IsExpanded)

        {

            g.DrawImage(Properties.Resources.Expanded, leftPos+2, e.Bounds.Top+2);

        }

        else

        {

            g.DrawImage(Properties.Resources.Unexpanded, leftPos+2, e.Bounds.Top+2);

        }

    }


    g.DrawString(

        e.Node.Text, CommonFont, new SolidBrush(Color.Black), leftPos + markerSpacing, e.Bounds.Top+2);

}

发生的事情是,当表单第一次显示时,如果我展开一个不是第一个节点的节点,它也会覆盖(透明地覆盖)第一个节点文本。这是顺序。


表格启动时:

http://img2.mukewang.com/610e49f400019b9c02540124.jpg

然后我双击节点 4:

http://img4.mukewang.com/610e49fe00011fde02550149.jpg

如果我双击第一个节点,问题就解决了:

http://img4.mukewang.com/610e4a090001e9cd02580231.jpg

从现在开始,如果我双击节点 4,问题将不再出现。双击第一个节点可解决问题,并在节点 4 之后的表单生命周期内避免该问题。但是,如果我进一步向下双击另一个可扩展节点,它会再次发生。

这是一个错误TreeView还是我在我的所有者抽奖中做错了什么?


SMILET
浏览 191回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP