winform 开发,使用TreeView控件,需要对节点单独设置颜色,
控件本身有焦点时,选中的样式是一样的,所以使用OwnerDrawText 自己实现使用自定义颜色绘制文本
private Brush treeBgColor = new SolidBrush(Color.FromArgb(51, 153, 255));
private void treeViewImg_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
if (!e.Node.IsVisible) {//节点不可见时
e.DrawDefault = true;
return;
}
//return;
//or 自定义颜色
if ((e.State & TreeNodeStates.Selected) != 0)
{
//为蓝底白字
e.Graphics.FillRectangle(treeBgColor, e.Node.Bounds);
Brush fontBrush = e.Node.ForeColor == errorColor ? Brushes.Red : Brushes.White;
Font nodeFont = e.Node.NodeFont;
if (nodeFont == null) nodeFont = ((TreeView)sender).Font;
e.Graphics.DrawString(e.Node.Text, nodeFont, fontBrush, Rectangle.Inflate(e.Bounds, 2, 0));
//, Rectangle.Inflate(e.Bounds, 0, 0));
}
else if (e.Node == selectedTreeNode)
{
e.Graphics.FillRectangle(treeBgColor, e.Node.Bounds);
Brush fontBrush = e.Node.ForeColor == errorColor ? Brushes.Red : Brushes.White;
Font nodeFont = e.Node.NodeFont;
if (nodeFont == null) nodeFont = ((TreeView)sender).Font;
e.Graphics.DrawString(e.Node.Text, nodeFont, fontBrush, Rectangle.Inflate(e.Bounds, 2, 0));
//e.Graphics.DrawString(e.Node.Text, nodeFont, fontBrush, Rectangle.Inflate(e.Bounds, 0, 0));
}
else
{
if (e.Node.ForeColor.A == 0)//初始化时
{
e.DrawDefault = true;
return;
}
using (Brush nBrush = new SolidBrush(e.Node.BackColor))
using (Brush fontBrush = new SolidBrush(e.Node.ForeColor))
{
e.Graphics.FillRectangle(nBrush, e.Node.Bounds);
//Brush fontBrush = e.Node.ForeColor == errorColor ? Brushes.Red : Brushes.White;
Font nodeFont = e.Node.NodeFont;
if (nodeFont == null) nodeFont = ((TreeView)sender).Font;
e.Graphics.DrawString(e.Node.Text, nodeFont, fontBrush, Rectangle.Inflate(e.Bounds, 2, 0));
//, Rectangle.Inflate(e.Bounds, 0, 0));
// e.DrawDefault = true;
}
}
}