gpt4 book ai didi

c# - TreeView 所有者绘制异常

转载 作者:太空宇宙 更新时间:2023-11-03 12:13:41 25 4
gpt4 key购买 nike

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

我正在使用 Winforms TreeView 并修改其默认行为,使其更像 Windows Explorer TreeView 。我设置了以下属性:

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);
}

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

在表单启动时:

enter image description here

然后我双击节点 4:

enter image description here

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

enter image description here

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

这是 TreeView 中的错误还是我在自己的绘制中做错了什么?

最佳答案

DrawNode 事件在双击时被调用得过于频繁,并且一组调用的边界矩形是Empty

(可能的原因是:如果所有绘图都只发生在空矩形中,则不会显示任何内容。嗯..)

因此,作为一种变通方法,您可以缩短 DrawNode 事件,以应对事件开始时的所有错误调用:

if (e.Bounds.Height < 1 || e.Bounds.Width < 1) return;

我还推荐这样的文本渲染......:

TextRenderer.DrawText(g, e.Node.Text, CommonFont, 
new Point( leftPos + markerSpacing, e.Bounds.Top+2), Color.Black);

TextRenderer 始终比 Graphics.DrawString 更受推荐,因为它改进了几个缺点。

关于c# - TreeView 所有者绘制异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50815725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com