diff --git a/SunnyUI/Common/UDefine.cs b/SunnyUI/Common/UDefine.cs index d916f627..d2fa5c41 100644 --- a/SunnyUI/Common/UDefine.cs +++ b/SunnyUI/Common/UDefine.cs @@ -116,11 +116,19 @@ namespace Sunny.UI /// /// 背景色 /// - public Color BackColor; + public Color BackColor { get; set; } /// /// 前景色 /// - public Color ForeColor; + public Color ForeColor { get; set; } + + public Color HoverColor { get; set; } + + public Color SelectedColor { get; set; } + + public Color SelectedForeColor { get; set; } + + public bool HaveHoveColor { get; set; } = false; } } diff --git a/SunnyUI/Controls/UITreeView.cs b/SunnyUI/Controls/UITreeView.cs index 2afa39bc..bb867484 100644 --- a/SunnyUI/Controls/UITreeView.cs +++ b/SunnyUI/Controls/UITreeView.cs @@ -36,6 +36,7 @@ * 2023-07-02: V3.3.9 屏蔽DrawMode属性,默认为OwnerDrawAll * 2023-11-13: V3.5.2 重构主题 * 2024-01-01: V3.6.2 增加可修改滚动条颜色 + * 2024-01-20: V3.6.3 自定义行颜色,可通过代码给颜色值,SetNodePainter,增加选中颜色 ******************************************************************************/ using System; @@ -265,16 +266,31 @@ namespace Sunny.UI public void SetNodePainter(TreeNode node, Color backColor, Color foreColor) { if (view.IsNull()) return; - if (view.Painter.ContainsKey(node)) + if (view.Painter.NotContainsKey(node)) { - view.Painter[node].BackColor = backColor; - view.Painter[node].ForeColor = foreColor; - } - else - { - view.Painter.TryAdd(node, new UITreeNodePainter() { BackColor = backColor, ForeColor = foreColor }); + view.Painter.TryAdd(node, new UITreeNodePainter()); } + view.Painter[node].BackColor = backColor; + view.Painter[node].ForeColor = foreColor; + view.Painter[node].HaveHoveColor = false; + view.Invalidate(); + } + + public void SetNodePainter(TreeNode node, Color backColor, Color foreColor, Color hoverColor, Color selectedColor, Color selectedForeColor) + { + if (view.IsNull()) return; + if (view.Painter.NotContainsKey(node)) + { + view.Painter.TryAdd(node, new UITreeNodePainter()); + } + + view.Painter[node].BackColor = backColor; + view.Painter[node].ForeColor = foreColor; + view.Painter[node].HoverColor = hoverColor; + view.Painter[node].SelectedColor = selectedColor; + view.Painter[node].SelectedForeColor = selectedForeColor; + view.Painter[node].HaveHoveColor = true; view.Invalidate(); } @@ -1155,29 +1171,43 @@ namespace Sunny.UI var checkboxColor = ForeColor; if (e.Node != null) { - if (Painter.ContainsKey(e.Node)) + if (e.Node == SelectedNode) { - e.Graphics.FillRectangle(Painter[e.Node].BackColor, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); - e.Graphics.DrawString(e.Node.Text, Font, Painter[e.Node].ForeColor, new Rectangle(drawLeft, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height), ContentAlignment.MiddleLeft); + Color sc = SelectedColor; + Color scf = SelectedForeColor; + if (Painter.ContainsKey(e.Node) && Painter[e.Node].HaveHoveColor) + { + sc = Painter[e.Node].SelectedColor; + scf = Painter[e.Node].SelectedForeColor; + } + + e.Graphics.FillRectangle(sc, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); + e.Graphics.DrawString(e.Node.Text, Font, scf, new Rectangle(drawLeft, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height), ContentAlignment.MiddleLeft); + checkboxColor = SelectedForeColor; + } + else if (e.Node == CurrentNode && (e.State & TreeNodeStates.Hot) != 0) + { + Color hc = HoverColor; + if (Painter.ContainsKey(e.Node) && Painter[e.Node].HaveHoveColor) + { + hc = Painter[e.Node].HoverColor; + } + + e.Graphics.FillRectangle(hc, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); + e.Graphics.DrawString(e.Node.Text, Font, ForeColor, new Rectangle(drawLeft, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height), ContentAlignment.MiddleLeft); } else { - if (e.Node == SelectedNode) + Color fc = FillColor; + Color fcf = ForeColor; + if (Painter.ContainsKey(e.Node)) { - e.Graphics.FillRectangle(SelectedColor, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); - e.Graphics.DrawString(e.Node.Text, Font, SelectedForeColor, new Rectangle(drawLeft, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height), ContentAlignment.MiddleLeft); - checkboxColor = SelectedForeColor; - } - else if (e.Node == CurrentNode && (e.State & TreeNodeStates.Hot) != 0) - { - e.Graphics.FillRectangle(HoverColor, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); - e.Graphics.DrawString(e.Node.Text, Font, ForeColor, new Rectangle(drawLeft, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height), ContentAlignment.MiddleLeft); - } - else - { - e.Graphics.FillRectangle(FillColor, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); - e.Graphics.DrawString(e.Node.Text, Font, ForeColor, new Rectangle(drawLeft, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height), ContentAlignment.MiddleLeft); + fc = Painter[e.Node].BackColor; + fcf = Painter[e.Node].ForeColor; } + + e.Graphics.FillRectangle(fc, new Rectangle(new Point(0, e.Node.Bounds.Y), new Size(Width, e.Node.Bounds.Height))); + e.Graphics.DrawString(e.Node.Text, Font, fcf, new Rectangle(drawLeft, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height), ContentAlignment.MiddleLeft); } if (haveImage)