https://social.msdn.microsoft.com/Forums/windows/en-US/88382d08-8741-4223-9390-a7df5f946c17/treenode-mouseover-effect?forum=winforms
非常好。测试通过。
public class SharxXTreeView : TreeView
{
public SharxXTreeView()
:base()
{
this.HotTracking = true;
this.DrawMode = TreeViewDrawMode.OwnerDrawText;
this.DrawNode += new DrawTreeNodeEventHandler(SharxXTreeView_DrawNode);
}
void SharxXTreeView_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
if ((e.State & TreeNodeStates.Hot) == TreeNodeStates.Hot)
{
// get node font and node fore color
Font nodeFont = GetTreeNodeFont(e.Node);
Color nodeForeColor = GetTreeNodeForeColor(e.Node, e.State);
// fill node background
using (SolidBrush brush = new SolidBrush(Color.Red))
{
e.Graphics.FillRectangle(brush, e.Bounds);
}
// draw node text
TextRenderer.DrawText(e.Graphics, e.Node.Text, nodeFont, e.Bounds, nodeForeColor, TextFormatFlags.Left | TextFormatFlags.Top);
// draw selected node border
if ((e.State & TreeNodeStates.Selected) == TreeNodeStates.Selected)
{
using (Pen pen = new Pen(nodeForeColor))
{
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
Rectangle penBounds = e.Bounds;
penBounds.Width -= 1;
penBounds.Height -= 1;
e.Graphics.DrawRectangle(pen, penBounds);
}
}
}
else
{
e.DrawDefault = true;
}
}
private Font GetTreeNodeFont(TreeNode node)
{
Font nodeFont = node.NodeFont;
if (nodeFont == null)
{
nodeFont = this.Font;
}
return nodeFont;
}
private Color GetTreeNodeForeColor(TreeNode node, TreeNodeStates nodeState)
{
Color nodeForeColor = Color.Empty;
if ((nodeState & TreeNodeStates.Selected) == TreeNodeStates.Selected)
{
nodeForeColor = Color.FromKnownColor(KnownColor.HighlightText);
}
else
{
nodeForeColor = node.ForeColor;
if (nodeForeColor == Color.Empty)
{
nodeForeColor = this.ForeColor;
}
}
return nodeForeColor;
}
}