我正在尝试向标准 System.Windows.Forms.TreeView 控件的元素添加更多图标。
我的计划是只更改树视图控件的标签区域,但它显示出奇怪的行为。如果我单击一个节点来选择它,则按下鼠标按钮时,背景将使用突出显示颜色正确绘制。但是,在我释放鼠标按钮之前,文本的未选择颜色是错误的。就好像e.State
包含按下和释放鼠标按钮之间的错误状态。
这就是我正在做的:我用this.DrawMode = TreeViewDrawMode.OwnerDrawText
然后注册我的事件处理程序this.DrawNode += LayoutTreeView_DrawNode
。这是处理程序:
void LayoutTreeView_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
Color color = (e.State & TreeNodeStates.Selected) != 0 ?
SystemColors.HighlightText : SystemColors.WindowText;
TextFormatFlags flags = TextFormatFlags.Left | TextFormatFlags.SingleLine |
TextFormatFlags.VerticalCenter | TextFormatFlags.EndEllipsis;
TextRenderer.DrawText(e.Graphics, e.Node.Text, Font, e.Bounds, color, flags);
}
如果我将处理程序设置为其默认情况...
void LayoutTreeView_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
e.DefaultDraw = true;
}
...同样的事情发生了,这很奇怪,因为 Windows 现在实际上正在绘制它。此行为出现在带有 .Net 3.5 的 Windows XP 中。
有什么办法可以解决这种奇怪的行为吗?
Change
Color color = (e.State & TreeNodeStates.Selected) != 0 ?
SystemColors.HighlightText : SystemColors.WindowText;
to
Color color = (e.State & TreeNodeStates.Focused) != 0 ?
SystemColors.HighlightText : SystemColors.WindowText;
这适用于 Vista x64 和带有 .Net 3.5 的 VS 2008。请让我知道这对你有没有用。
在观察默认窗口行为时,我观察到文本和突出显示在选择节点并获得焦点之前不会绘制。因此,我检查了聚焦条件以更改文本颜色。然而,这并不完全模仿 Widows 的行为,即在释放鼠标之前不会使用新颜色。当它选择在 Ownerdrawn 模式下绘制蓝色突出显示状态与窗口绘制它时的状态变化时,这似乎是一点......这无疑是令人困惑的。
编辑
但是,当您创建自己的派生树视图时,您可以完全控制何时绘制所有内容。
public class MyTreeView : TreeView
{
bool isLeftMouseDown = false;
bool isRightMouseDown = false;
public MyTreeView()
{
DrawMode = TreeViewDrawMode.OwnerDrawText;
}
protected override void OnMouseDown(MouseEventArgs e)
{
TrackMouseButtons(e);
base.OnMouseDown(e);
}
protected override void OnMouseUp(MouseEventArgs e)
{
TrackMouseButtons(e);
base.OnMouseUp(e);
}
protected override void OnMouseMove(MouseEventArgs e)
{
TrackMouseButtons(e);
base.OnMouseMove(e);
}
private void TrackMouseButtons(MouseEventArgs e)
{
isLeftMouseDown = e.Button == MouseButtons.Left;
isRightMouseDown = e.Button == MouseButtons.Right;
}
protected override void OnDrawNode(DrawTreeNodeEventArgs e)
{
// don't call the base or it will goof up your display!
// capture the selected/focused states
bool isFocused = (e.State & TreeNodeStates.Focused) != 0;
bool isSelected = (e.State & TreeNodeStates.Selected) != 0;
// set up default colors.
Color color = SystemColors.WindowText;
Color backColor = BackColor;
if (isFocused && isRightMouseDown)
{
// right clicking on a
color = SystemColors.HighlightText;
backColor = SystemColors.Highlight;
}
else if (isSelected && !isRightMouseDown)
{
// if the node is selected and we're not right clicking on another node.
color = SystemColors.HighlightText;
backColor = SystemColors.Highlight;
}
using (Brush sb = new SolidBrush(backColor))
e.Graphics.FillRectangle(sb,e.Bounds);
TextFormatFlags flags = TextFormatFlags.Left | TextFormatFlags.SingleLine |
TextFormatFlags.VerticalCenter | TextFormatFlags.EndEllipsis;
TextRenderer.DrawText(e.Graphics, e.Node.Text, Font, e.Bounds, color, backColor, flags);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)