功能调整
This commit is contained in:
1 parent
42acf1b1cb
commit
772d9f4780
40 files changed
+4953
-389
No files matched your search
@@ -0,0 +1,769 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Threading;
|
||||
|
||||
namespace Work.UserComponents
|
||||
{
|
||||
/// <summary>
|
||||
/// 基于树视图的任务控件
|
||||
/// </summary>
|
||||
public partial class UcTreeView : TreeView
|
||||
{
|
||||
#region //construckor
|
||||
/// <summary>
|
||||
/// 自定义树视图控件构造函数
|
||||
/// </summary>
|
||||
public UcTreeView()
|
||||
{
|
||||
FullRowSelect = true;
|
||||
ShowLines = true;
|
||||
// 开启双缓冲等
|
||||
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.EnableNotifyMessage | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint, true);
|
||||
this.DrawMode = TreeViewDrawMode.OwnerDrawAll;
|
||||
this.ItemHeight = 32;
|
||||
this.ShowLines = true;
|
||||
this.AfterExpand += UserTreeView_AfterExpand;
|
||||
this.AfterSelect += UserTreeView_AfterSelect;
|
||||
this.Layout += UserTreeView_Layout;
|
||||
if (Properties.Resources.ResourceManager.GetObject("tree_default_icon_select") != null)
|
||||
defaultNodeImageSelect = (Bitmap)Properties.Resources.ResourceManager.GetObject("tree_default_icon_select");
|
||||
if (Properties.Resources.ResourceManager.GetObject("tree_default_icon") != null)
|
||||
defaultNodeImage = (Bitmap)Properties.Resources.ResourceManager.GetObject("tree_default_icon");
|
||||
}
|
||||
|
||||
protected override void OnNotifyMessage(Message m)
|
||||
{
|
||||
if (m.Msg != 0x14)
|
||||
{
|
||||
base.OnNotifyMessage(m);
|
||||
}
|
||||
}
|
||||
|
||||
protected override CreateParams CreateParams
|
||||
{
|
||||
get
|
||||
{
|
||||
CreateParams cp = base.CreateParams;
|
||||
cp.ExStyle |= 0x02000000;
|
||||
return cp;
|
||||
}
|
||||
}
|
||||
|
||||
private void UserTreeView_AfterSelect(object sender, TreeViewEventArgs e)
|
||||
{
|
||||
if (e.Node.Parent != null)
|
||||
dicSelectNodeId[e.Node.Parent] = e.Node;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region //event
|
||||
// 定义委托
|
||||
public delegate void NodeGroupClickHandle(object sender, TreeViewEventArgs e);
|
||||
|
||||
// 定义事件
|
||||
public event NodeGroupClickHandle NodeGroupClick;
|
||||
|
||||
// 执行事件
|
||||
protected virtual void OnNodeGroupClick(TreeViewEventArgs e)
|
||||
{
|
||||
if (NodeGroupClick != null)
|
||||
{
|
||||
NodeGroupClick(this, e);
|
||||
}
|
||||
}
|
||||
|
||||
private void UserTreeView_Layout(object sender, LayoutEventArgs e)
|
||||
{
|
||||
if (!DesignMode)
|
||||
{
|
||||
foreach (TreeNode node in this.Nodes)
|
||||
{
|
||||
if (node != null)
|
||||
{
|
||||
if (allNodes.Contains(node) == false)
|
||||
allNodes.Add(node);
|
||||
}
|
||||
foreach (TreeNode childNode in node.Nodes)
|
||||
{
|
||||
if (node == null)
|
||||
continue;
|
||||
if (!dicNodeImageSelect.Keys.Contains(childNode))
|
||||
{
|
||||
// 获取图标
|
||||
if (Properties.Resources.ResourceManager.GetObject("tree_" + childNode.Text + "_select") != null)
|
||||
{
|
||||
var bitmap = (Bitmap)Properties.Resources.ResourceManager.GetObject("tree_" + childNode.Text + "_select");
|
||||
dicNodeImageSelect[childNode] = bitmap;
|
||||
}
|
||||
}
|
||||
if (!dicNodeImage.Keys.Contains(childNode))
|
||||
{
|
||||
// 获取图标
|
||||
if (Properties.Resources.ResourceManager.GetObject("tree_" + childNode.Text) != null)
|
||||
{
|
||||
var bitmap = (Bitmap)Properties.Resources.ResourceManager.GetObject("tree_" + childNode.Text);
|
||||
dicNodeImage[childNode] = bitmap;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void UserTreeView_AfterExpand(object sender, TreeViewEventArgs e)
|
||||
{
|
||||
BeginUpdate();
|
||||
if (HideCollapsedGroup && !DesignMode)
|
||||
{
|
||||
for (int i = 0; i < this.Nodes.Count; i++)
|
||||
{
|
||||
if (e.Node != this.Nodes[i])
|
||||
{
|
||||
this.Nodes.Remove(this.Nodes[i]);
|
||||
i--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach (TreeNode node in this.AllNodes)
|
||||
{
|
||||
if (node == null)
|
||||
continue;
|
||||
|
||||
if (node != e.Node)
|
||||
{
|
||||
node.Collapse(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (this.SelectedNode == null || this.SelectedNode.Parent == node)
|
||||
continue;
|
||||
else if (dicSelectNodeId.Keys.Contains(node))
|
||||
this.SelectedNode = dicSelectNodeId[node];
|
||||
else if (node.Nodes.Count > 0)
|
||||
this.SelectedNode = node.Nodes[0];
|
||||
}
|
||||
}
|
||||
EndUpdate();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region //field & property
|
||||
private Bitmap defaultNodeImage;
|
||||
private Bitmap defaultNodeImageSelect;
|
||||
private List<TreeNode> lstTreeNode = new List<TreeNode>();
|
||||
private Dictionary<TreeNode, TreeNode> dicSelectNodeId = new Dictionary<TreeNode, TreeNode>();
|
||||
private Dictionary<TreeNode, Bitmap> dicNodeImage = new Dictionary<TreeNode, Bitmap>();
|
||||
private Dictionary<TreeNode, Bitmap> dicNodeImageSelect = new Dictionary<TreeNode, Bitmap>();
|
||||
/// <summary>
|
||||
/// 展开按扭的大小
|
||||
/// </summary>
|
||||
private Size ExpandButtonSize = new Size(16, 16);
|
||||
private Color _ExpandButtonColor = Color.FromArgb(255, 255, 255);
|
||||
/// <summary>
|
||||
/// 展开按扭颜色
|
||||
/// </summary>
|
||||
[Description("展开按扭颜色"), Category("UserProperty")]
|
||||
public Color ExpandButtonColor
|
||||
{
|
||||
get
|
||||
{
|
||||
return _ExpandButtonColor;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (_ExpandButtonColor != value)
|
||||
{
|
||||
_ExpandButtonColor = value;
|
||||
this.Invalidate();
|
||||
}
|
||||
}
|
||||
}
|
||||
private Color _GroupBgColor = Color.FromArgb(249, 249, 249);
|
||||
/// <summary>
|
||||
/// 分组栏背景色
|
||||
/// </summary>
|
||||
[Description("分组栏背景色"), Category("UserProperty")]
|
||||
public Color GroupBgColor
|
||||
{
|
||||
get
|
||||
{
|
||||
return _GroupBgColor;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (_GroupBgColor != value)
|
||||
{
|
||||
_GroupBgColor = value;
|
||||
this.Invalidate();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Color _ChildNodeSelectedBgColor = Color.FromArgb(34, 148, 203);
|
||||
/// <summary>
|
||||
/// 子节点选中背景色
|
||||
/// </summary>
|
||||
[Description("子节点选中背景色"), Category("UserProperty")]
|
||||
public Color ChildNodeSelectedBgColor
|
||||
{
|
||||
get
|
||||
{
|
||||
return this._ChildNodeSelectedBgColor;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (_ChildNodeSelectedBgColor != value)
|
||||
{
|
||||
_ChildNodeSelectedBgColor = value;
|
||||
this.Invalidate();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Color _GroupTitleColor = Color.FromArgb(80, 80, 80);
|
||||
/// <summary>
|
||||
/// 分组栏标题色
|
||||
/// </summary>
|
||||
[Description("分组栏标题色"), Category("UserProperty")]
|
||||
public Color GroupTitleColor
|
||||
{
|
||||
get
|
||||
{
|
||||
return _GroupTitleColor;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (_GroupTitleColor != value)
|
||||
{
|
||||
_GroupTitleColor = value;
|
||||
this.Invalidate();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Color _OverForeColor = Color.FromArgb(235, 235, 235);
|
||||
/// <summary>
|
||||
/// 鼠标悬停色
|
||||
/// </summary>
|
||||
[Description("鼠标悬停色"), Category("UserProperty")]
|
||||
public Color OverForeColor
|
||||
{
|
||||
get
|
||||
{
|
||||
return _OverForeColor;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (_OverForeColor != value)
|
||||
{
|
||||
_OverForeColor = value;
|
||||
this.Invalidate();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Font groupFont = new Font("宋体", 10.5f);
|
||||
/// <summary>
|
||||
/// 组标题字体样式
|
||||
/// </summary>
|
||||
[Description("组标题字体样式"), Category("UserProperty")]
|
||||
public Font GroupFont
|
||||
{
|
||||
get
|
||||
{
|
||||
return groupFont;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (groupFont != value)
|
||||
{
|
||||
groupFont = value;
|
||||
this.Invalidate();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool _HideCollpasedGroup = false;
|
||||
[Description("隐藏折叠的组"), Category("UserProperty")]
|
||||
public bool HideCollapsedGroup
|
||||
{
|
||||
get
|
||||
{
|
||||
return _HideCollpasedGroup;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (_HideCollpasedGroup != value)
|
||||
{
|
||||
_HideCollpasedGroup = value;
|
||||
this.Invalidate();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 节点高度
|
||||
/// </summary>
|
||||
public new int ItemHeight
|
||||
{
|
||||
get
|
||||
{
|
||||
return base.ItemHeight;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (base.ItemHeight != value && value >= 20)
|
||||
{
|
||||
base.ItemHeight = value;
|
||||
this.Invalidate();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private List<TreeNode> allNodes = new List<TreeNode>();
|
||||
/// <summary>
|
||||
/// 所有节点列表
|
||||
/// </summary>
|
||||
public List<TreeNode> AllNodes { get { return allNodes; } }
|
||||
|
||||
#endregion
|
||||
|
||||
#region //override
|
||||
protected override void OnDrawNode(DrawTreeNodeEventArgs e)
|
||||
{
|
||||
//base.OnDrawNode(e);
|
||||
DrawNodeItem(e);
|
||||
}
|
||||
protected override void WndProc(ref Message m)
|
||||
{
|
||||
if (m.Msg == 0x0201)//单击
|
||||
{
|
||||
int wparam = m.LParam.ToInt32();
|
||||
Point point = new Point(
|
||||
LOWORD(wparam),
|
||||
HIWORD(wparam));
|
||||
//point = PointToClient(point);
|
||||
TreeNode tn = this.GetNodeAt(point);
|
||||
if (tn == null)
|
||||
{
|
||||
base.WndProc(ref m);
|
||||
return;
|
||||
}
|
||||
if (tn.Level == 0)
|
||||
{
|
||||
if (tn.IsExpanded)
|
||||
{
|
||||
//tn.Collapse();
|
||||
}
|
||||
else
|
||||
{
|
||||
tn.Expand();
|
||||
}
|
||||
m.Result = IntPtr.Zero;
|
||||
OnNodeGroupClick(new TreeViewEventArgs(tn, TreeViewAction.ByMouse));
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
base.WndProc(ref m);
|
||||
//tn.IsSelected = true;
|
||||
//this.SelectedNode = tn;
|
||||
}
|
||||
this.SelectedNode = tn;
|
||||
}
|
||||
else if (m.Msg == 0x0203)//双击
|
||||
{
|
||||
int wparam = m.LParam.ToInt32();
|
||||
Point point = new Point(
|
||||
LOWORD(wparam),
|
||||
HIWORD(wparam));
|
||||
//point = PointToClient(point);
|
||||
TreeNode tn = this.GetNodeAt(point);
|
||||
if (tn == null)
|
||||
{
|
||||
base.WndProc(ref m);
|
||||
return;
|
||||
}
|
||||
if (tn.Level == 0)
|
||||
{
|
||||
m.Result = IntPtr.Zero;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
base.WndProc(ref m);
|
||||
}
|
||||
this.SelectedNode = tn;
|
||||
}
|
||||
else if (m.Msg == 0x0200)//鼠标移动
|
||||
{
|
||||
try
|
||||
{
|
||||
int wparam = m.LParam.ToInt32();
|
||||
Point point = new Point(
|
||||
LOWORD(wparam),
|
||||
HIWORD(wparam));
|
||||
//point = PointToClient(point);
|
||||
TreeNode tn = this.GetNodeAt(point);
|
||||
if (tn == null)
|
||||
{
|
||||
Cursor = Cursors.Default;
|
||||
// this.SelectedNode = null;
|
||||
base.WndProc(ref m);
|
||||
return;
|
||||
}
|
||||
Cursor = Cursors.Hand;
|
||||
//this.SelectedNode = tn;
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
else if (m.Msg == 0x02A3)//鼠标移出 WM_MOUSELEAVE = $02A3;
|
||||
{
|
||||
// this.SelectedNode = null;
|
||||
base.WndProc(ref m);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
base.WndProc(ref m);
|
||||
}
|
||||
//WM_LBUTTONDOWN = $0201
|
||||
//WM_LBUTTONDBLCLK = $0203;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region //private method
|
||||
/// <summary>
|
||||
/// 自定义绘制节点
|
||||
/// </summary>
|
||||
/// <param name="e"></param>
|
||||
private void DrawNodeItem(DrawTreeNodeEventArgs e)
|
||||
{
|
||||
TreeNode tn = e.Node;
|
||||
if (tn.Level == 0)
|
||||
{
|
||||
using (Graphics g = e.Graphics)
|
||||
{
|
||||
//g.Clear(this.BackColor); // 清空画布,完整重绘时才能使用
|
||||
//g.SmoothingMode = SmoothingMode.HighQuality; // 高质量
|
||||
//g.PixelOffsetMode = PixelOffsetMode.HighQuality; // 高像素偏移质量
|
||||
//绘制分组的背景
|
||||
//RenderBackgroundInternalRate(g,
|
||||
// e.Bounds,
|
||||
// GroupBgColor,
|
||||
// GroupBgColor,
|
||||
// Color.FromArgb(200, 255, 255, 255),
|
||||
// 0.45f,
|
||||
// true,
|
||||
// 300);
|
||||
int red = GroupBgColor.R;
|
||||
int green = GroupBgColor.G;
|
||||
int blue = GroupBgColor.B;
|
||||
if (red < 127) red += 15; else red -= 15;
|
||||
if (green < 127) green += 15; else green -= 15;
|
||||
if (blue < 127) blue += 15; else blue -= 15;
|
||||
var color = Color.FromArgb(red, green, blue);
|
||||
RenderBackgroundSolid(g, e.Bounds, color, color, color, false);
|
||||
//绘制展开按扭
|
||||
//g.FillEllipse(new SolidBrush(ExpandButtonColor), ExpandButtonBounds(e.Bounds));
|
||||
//g.DrawEllipse(new Pen(Color.LightGray), ExpandButtonBounds(e.Bounds));
|
||||
//Point p1;
|
||||
//Point p2;
|
||||
//Point p3;
|
||||
//if (tn.IsExpanded)
|
||||
//{
|
||||
// p1 = new Point(ExpandButtonBounds(e.Bounds).X + 3, ExpandButtonBounds(e.Bounds).Bottom - 4);
|
||||
// p2 = new Point(ExpandButtonBounds(e.Bounds).X + (ExpandButtonSize.Width) / 2, ExpandButtonBounds(e.Bounds).Top + 5);
|
||||
// p3 = new Point(ExpandButtonBounds(e.Bounds).Right - 3, ExpandButtonBounds(e.Bounds).Bottom - 4);
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// p1 = new Point(ExpandButtonBounds(e.Bounds).X + 3, ExpandButtonBounds(e.Bounds).Y + 4);
|
||||
// p2 = new Point(ExpandButtonBounds(e.Bounds).X + (ExpandButtonSize.Width) / 2, ExpandButtonBounds(e.Bounds).Bottom - 5);
|
||||
// p3 = new Point(ExpandButtonBounds(e.Bounds).Right - 3, ExpandButtonBounds(e.Bounds).Y + 4);
|
||||
//}
|
||||
//GraphicsPath gp = new GraphicsPath();
|
||||
//gp.AddLine(p1, p2);
|
||||
//gp.AddLine(p2, p3);
|
||||
//g.DrawPath(new Pen(Color.FromArgb(255, 150, 0, 0), 2f), gp);
|
||||
|
||||
//绘制分组的文本
|
||||
TextRenderer.DrawText(g, e.Node.Text, this.GroupFont, GroupTitleBounds(e.Bounds), this.GroupTitleColor,
|
||||
TextFormatFlags.Left | TextFormatFlags.VerticalCenter | TextFormatFlags.EndEllipsis);
|
||||
}
|
||||
}
|
||||
else if (tn.Level == 1)
|
||||
{
|
||||
//e.DrawDefault = true;
|
||||
|
||||
using (Graphics g = e.Graphics)
|
||||
{
|
||||
#region 小奶猫增加权限后,无法自动绘制TreeNode图标,经调试确认,增加此段代码 by ttzhao 2020.7.1
|
||||
if (!dicNodeImageSelect.Keys.Contains(e.Node))
|
||||
{
|
||||
// 获取图标
|
||||
if (Properties.Resources.ResourceManager.GetObject(e.Node.Text + "_select") != null)
|
||||
{
|
||||
var bitmap = (Bitmap)Properties.Resources.ResourceManager.GetObject(e.Node.Text + "_select");
|
||||
dicNodeImageSelect[e.Node] = bitmap;
|
||||
}
|
||||
}
|
||||
if (!dicNodeImage.Keys.Contains(e.Node))
|
||||
{
|
||||
// 获取图标
|
||||
if (Properties.Resources.ResourceManager.GetObject(e.Node.Text) != null)
|
||||
{
|
||||
var bitmap = (Bitmap)Properties.Resources.ResourceManager.GetObject(e.Node.Text);
|
||||
dicNodeImage[e.Node] = bitmap;
|
||||
}
|
||||
}
|
||||
#endregion 小奶猫增加权限后,无法自动绘制TreeNode图标,经调试确认,增加此段代码 by ttzhao 2020.7.1
|
||||
|
||||
if (tn.IsSelected)
|
||||
{
|
||||
RenderBackgroundSolid(g, e.Bounds, ChildNodeSelectedBgColor, ChildNodeSelectedBgColor, ChildNodeSelectedBgColor, false);
|
||||
//TextRenderer.DrawText(g, e.Node.Text, new Font(this.Font.FontFamily.Name, this.Font.Size, FontStyle.Underline), e.Bounds, OverForeColor, TextFormatFlags.Left | TextFormatFlags.VerticalCenter);
|
||||
TextRenderer.DrawText(g, e.Node.Text, this.Font, ChildTitleBounds(e.Bounds), this.OverForeColor,
|
||||
TextFormatFlags.Left | TextFormatFlags.VerticalCenter);
|
||||
|
||||
// 绘制图标
|
||||
if (dicNodeImageSelect.Keys.Contains(e.Node))
|
||||
g.DrawImage(dicNodeImageSelect[e.Node], new Rectangle(e.Bounds.X + 30, e.Bounds.Y + 8, 16, 16));
|
||||
else if (defaultNodeImageSelect != null)
|
||||
g.DrawImage(defaultNodeImageSelect, new Rectangle(e.Bounds.X + 30, e.Bounds.Y + 8, 16, 16));
|
||||
}
|
||||
else
|
||||
{
|
||||
RenderBackgroundSolid(g, e.Bounds, GroupBgColor, GroupBgColor, GroupBgColor, false);
|
||||
//TextRenderer.DrawText(g, e.Node.Text, this.Font, e.Bounds, this.ForeColor, TextFormatFlags.Left | TextFormatFlags.VerticalCenter);
|
||||
TextRenderer.DrawText(g, e.Node.Text, this.Font, ChildTitleBounds(e.Bounds), this.ForeColor,
|
||||
TextFormatFlags.Left | TextFormatFlags.VerticalCenter);
|
||||
|
||||
// 绘制图标
|
||||
if (dicNodeImage.Keys.Contains(e.Node))
|
||||
g.DrawImage(dicNodeImage[e.Node], new Rectangle(e.Bounds.X + 30, e.Bounds.Y + 8, 16, 16));
|
||||
else if (defaultNodeImage != null)
|
||||
g.DrawImage(defaultNodeImage, new Rectangle(e.Bounds.X + 30, e.Bounds.Y + 8, 16, 16));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 展开按扭区域 一级菜单后面的展开按钮
|
||||
/// </summary>
|
||||
/// <param name="childRect"></param>
|
||||
/// <returns></returns>
|
||||
private Rectangle ExpandButtonBounds(Rectangle childRect)
|
||||
{
|
||||
Rectangle lrect = new Rectangle(new Point(childRect.Right - ExpandButtonSize.Width * 3 / 2, (childRect.Height - ExpandButtonSize.Height) / 2 + childRect.Top), ExpandButtonSize);
|
||||
return lrect;
|
||||
}
|
||||
/// <summary>
|
||||
/// 取得分组标题绘制空间 一级菜单
|
||||
/// </summary>
|
||||
/// <param name="childRect"></param>
|
||||
/// <returns></returns>
|
||||
private Rectangle GroupTitleBounds(Rectangle childRect)
|
||||
{
|
||||
Rectangle lrect = childRect;
|
||||
lrect.Width -= ExpandButtonSize.Width * 3 / 2 + 20;
|
||||
//lrect.Offset(45, 0);
|
||||
lrect.Offset(12, 0);
|
||||
return lrect;
|
||||
}
|
||||
private Rectangle ChildTitleBounds(Rectangle rect)
|
||||
{
|
||||
Rectangle lrect = rect;
|
||||
lrect.Width -= 50;
|
||||
lrect.Offset(55, 0);
|
||||
return lrect;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region //draw
|
||||
internal void RenderBackgroundSolid(Graphics g, Rectangle rect, Color baseColor, Color borderColor, Color innerBorderColor, bool drawBorder)
|
||||
{
|
||||
if (drawBorder)
|
||||
{
|
||||
rect.Width--;
|
||||
rect.Height--;
|
||||
}
|
||||
using (SolidBrush brush = new SolidBrush(baseColor))
|
||||
{
|
||||
g.FillRectangle(brush, rect);
|
||||
}
|
||||
if (drawBorder)
|
||||
{
|
||||
using (Pen pen = new Pen(borderColor))
|
||||
{
|
||||
g.DrawRectangle(pen, rect);
|
||||
}
|
||||
rect.Inflate(-1, -1);
|
||||
using (Pen pen = new Pen(innerBorderColor))
|
||||
{
|
||||
g.DrawRectangle(pen, rect);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal void RenderBackgroundInternal(Graphics g, Rectangle rect, Color baseColor, Color borderColor, Color innerBorderColor,
|
||||
float basePosition, bool drawBorder, LinearGradientMode mode)
|
||||
{
|
||||
if (drawBorder)
|
||||
{
|
||||
rect.Width--;
|
||||
rect.Height--;
|
||||
}
|
||||
using (LinearGradientBrush brush = new LinearGradientBrush(rect, Color.Transparent, Color.Transparent, mode))
|
||||
{
|
||||
Color[] colors = new Color[4];
|
||||
colors[0] = GetColor(baseColor, 0, 35, 24, 9);
|
||||
colors[1] = GetColor(baseColor, 0, 13, 8, 3);
|
||||
colors[2] = baseColor;
|
||||
colors[3] = GetColor(baseColor, 0, 68, 69, 54);
|
||||
ColorBlend blend = new ColorBlend();
|
||||
blend.Positions = new float[] { 0.0f, basePosition, basePosition + 0.05f, 1.0f };
|
||||
blend.Colors = colors;
|
||||
brush.InterpolationColors = blend;
|
||||
g.FillRectangle(brush, rect);
|
||||
}
|
||||
if (baseColor.A > 80)
|
||||
{
|
||||
Rectangle rectTop = rect;
|
||||
if (mode == LinearGradientMode.Vertical)
|
||||
{
|
||||
rectTop.Height = (int)(rectTop.Height * basePosition);
|
||||
}
|
||||
else
|
||||
{
|
||||
rectTop.Width = (int)(rect.Width * basePosition);
|
||||
}
|
||||
using (SolidBrush brushAlpha =
|
||||
new SolidBrush(Color.FromArgb(80, 255, 255, 255)))
|
||||
{
|
||||
g.FillRectangle(brushAlpha, rectTop);
|
||||
}
|
||||
}
|
||||
if (drawBorder)
|
||||
{
|
||||
using (Pen pen = new Pen(borderColor))
|
||||
{
|
||||
g.DrawRectangle(pen, rect);
|
||||
}
|
||||
rect.Inflate(-1, -1);
|
||||
using (Pen pen = new Pen(innerBorderColor))
|
||||
{
|
||||
g.DrawRectangle(pen, rect);
|
||||
}
|
||||
}
|
||||
}
|
||||
internal void RenderBackgroundInternalRate(Graphics g, Rectangle rect, Color baseColor, Color borderColor, Color innerBorderColor,
|
||||
float basePosition, bool drawBorder, float rate)
|
||||
{
|
||||
if (drawBorder)
|
||||
{
|
||||
rect.Width--;
|
||||
rect.Height--;
|
||||
}
|
||||
using (LinearGradientBrush brush = new LinearGradientBrush(rect, Color.Transparent, Color.Transparent, rate))
|
||||
{
|
||||
Color[] colors = new Color[4];
|
||||
colors[0] = GetColor(baseColor, 0, 35, 24, 9);
|
||||
colors[1] = GetColor(baseColor, 0, 13, 8, 3);
|
||||
colors[2] = baseColor;
|
||||
colors[3] = GetColor(baseColor, 0, 68, 69, 54);
|
||||
ColorBlend blend = new ColorBlend();
|
||||
blend.Positions = new float[] { 0.0f, basePosition, basePosition + 0.05f, 1.0f };
|
||||
blend.Colors = colors;
|
||||
brush.InterpolationColors = blend;
|
||||
g.FillRectangle(brush, rect);
|
||||
}
|
||||
if (baseColor.A > 80)
|
||||
{
|
||||
Rectangle rectTop = rect;
|
||||
if (true/*mode == LinearGradientMode.Vertical*/)
|
||||
{
|
||||
rectTop.Height = (int)(rectTop.Height * basePosition);
|
||||
}
|
||||
else
|
||||
{
|
||||
rectTop.Width = (int)(rect.Width * basePosition);
|
||||
}
|
||||
using (SolidBrush brushAlpha =
|
||||
new SolidBrush(Color.FromArgb(80, 255, 255, 255)))
|
||||
{
|
||||
g.FillRectangle(brushAlpha, rectTop);
|
||||
}
|
||||
}
|
||||
if (drawBorder)
|
||||
{
|
||||
using (Pen pen = new Pen(borderColor))
|
||||
{
|
||||
g.DrawRectangle(pen, rect);
|
||||
}
|
||||
rect.Inflate(-1, -1);
|
||||
using (Pen pen = new Pen(innerBorderColor))
|
||||
{
|
||||
g.DrawRectangle(pen, rect);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Color GetColor(Color colorBase, int a, int r, int g, int b)
|
||||
{
|
||||
int a0 = colorBase.A;
|
||||
int r0 = colorBase.R;
|
||||
int g0 = colorBase.G;
|
||||
int b0 = colorBase.B;
|
||||
if (a + a0 > 255) { a = 255; } else { a = a + a0; }
|
||||
if (r + r0 > 255) { r = 255; } else { r = r + r0; }
|
||||
if (g + g0 > 255) { g = 255; } else { g = g + g0; }
|
||||
if (b + b0 > 255) { b = 255; } else { b = b + b0; }
|
||||
return Color.FromArgb(a, r, g, b);
|
||||
}
|
||||
private Color GetColor2(Color colorBase, int a, int r, int g, int b)
|
||||
{
|
||||
int a0 = colorBase.A;
|
||||
int r0 = colorBase.R;
|
||||
int g0 = colorBase.G;
|
||||
int b0 = colorBase.B;
|
||||
if (a + a0 > 255) { a = 255; } else { a = a + a0; }
|
||||
if (r0 - r < 0) { r = 0; } else { r = r0 - r; }
|
||||
if (g0 - g < 0) { g = 0; } else { g = g0 - g; }
|
||||
if (b0 - b < 0) { b = 0; } else { b = b0 - b; }
|
||||
return Color.FromArgb(a, r, g, b);
|
||||
}
|
||||
#endregion
|
||||
|
||||
public static int LOWORD(int value)
|
||||
{
|
||||
return value & 0xFFFF;
|
||||
}
|
||||
|
||||
public static int HIWORD(int value)
|
||||
{
|
||||
return value >> 16;
|
||||
}
|
||||
|
||||
public void ExpandGroup(string groupName)
|
||||
{
|
||||
var node = this.AllNodes.FirstOrDefault(n => n.Name == groupName);
|
||||
if (node == null)
|
||||
return;
|
||||
BeginUpdate();
|
||||
if (!this.Nodes.Contains(node))
|
||||
this.Nodes.Insert(0, node);
|
||||
node.Expand();
|
||||
EndUpdate();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user