📄 customrenderer.cs
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;
using System.Collections;
using System.Drawing.Drawing2D;
namespace CH9
{
[DefaultProperty("Color1")]
class CustomRenderer : ToolStripRenderer
{
#region "变量宣告"
// 用来储存我们所要描绘的工具列系列控件。
private ArrayList m_toolstrips;
// 用来储存我们所要描绘的 ToolStripPanel 控件。
private ArrayList m_ToolStripPanels;
// 用来储存我们所要描绘的 ToolStripItem 控件与衍生型别。
// 这仅仅是用来储存拥有它们自己之描绘设定的项目,m_toolStrips 中之
// ToolStrip、thisnuStrip 与 StatusStrip 所内含的 ToolStripItem 控件
// 不需要分开储存。
private ArrayList m_toolstripitems;
// 我们使用此定时器对象来判断何时该重新描绘并更新背景的外观。
private Timer m_timer = new Timer();
// 此用于 DrawToolbarBorder 属性 -- 控制是否要在工具列系列控件的周围绘制一个单线框。
private bool m_drawToolbarBorder;
// 此用于 Color1 属性 -- 这是渐层色的起始色彩。
private Color m_color1;
/// <summary>
/// 此用于 Color2 属性 -- 这是渐层色的结束色彩。
/// </summary>
///
private Color m_color2;
///
/// <summary>
/// 这是渐层色描绘之左边界与右边界的实际色彩。每秒钟就会变更几次,由于
/// 我们不想破坏 Color1 值,因此我们另存于此。
/// </summary>
///
private Color m_currentc1;
///
/// <summary>
/// 这是渐层色描绘之右边界与下边界的实际色彩。每秒钟就会变更几次,由于
/// 我们不想破坏 Color1 值,因此我们另存于此。
/// </summary>
///
private Color m_currentc2;
///
/// <summary>
/// 这是用来绘制项目边界的色彩。
/// </summary>
///
private Color m_itemBorderColor;
///
/// <summary>
/// 这是用来绘制箭号的色彩。
/// </summary>
///
private Color m_arrowColor;
///
/// <summary>
/// 当我们取得前两个色彩(Color1 与 Color2),我们会计算它们个别色彩组件之间的增量,
/// 并且使用该增量来。
/// </summary>
///
private short m_rinc;
private short m_ginc;
private short m_binc;
private const short NUM_INCREthisNTS = 30;
private int m_currentTick;
private bool m_positiveDirection;
private const int TIthisR_SPEED_MS = 250;
#endregion
public CustomRenderer()
: base()
{
this.m_color1 = SystemColors.ActiveCaption;
this.m_color2 = scaleColorPct(SystemColors.InactiveCaption, 120);
OnColorChanged();
this.m_drawToolbarBorder = true;
this.m_toolstrips = new ArrayList();
this.m_toolstripitems = new ArrayList();
this.m_ToolStripPanels = new ArrayList();
this.m_timer.Tick += new System.EventHandler(this.m_timer_Tick);
m_timer.Start();
}
public void Dispose(bool disposing)
{
this.m_timer.Stop();
this.m_timer = null;
this.m_toolstrips.Clear();
this.m_toolstripitems.Clear();
this.m_ToolStripPanels.Clear();
this.m_toolstrips = null;
this.m_toolstripitems = null;
this.m_ToolStripPanels = null;
}
#region "属性"
// 渐层色彩的起始色彩。
public Color Color1
{
get
{
return this.m_color1;
}
set
{
if (!(value.Equals(this.m_color1)))
{
this.m_color1 = value;
OnColorChanged();
}
}
}
// 渐层色彩的结束色彩。
public Color Color2
{
get
{
return this.m_color2;
}
set
{
if (!(value.Equals(this.m_color2)))
{
this.m_color2 = value;
OnColorChanged();
}
}
}
// 决定是否要替工具列系列控件描绘边框。
public bool DrawToolbarBorder
{
get
{
return this.m_drawToolbarBorder;
}
set
{
this.m_drawToolbarBorder = value;
}
}
#endregion
// 取得所要绘制的工具列系列控件。
protected override void Initialize(ToolStrip toolStrip)
{
if (!(this.m_toolstrips.Contains(toolStrip)))
{
this.m_toolstrips.Add(toolStrip);
}
postInitialize();
}
// 取得所要绘制的 ToolStripPanel。
protected override void InitializePanel(System.Windows.Forms.ToolStripPanel toolStripPanel)
{
base.InitializePanel(toolStripPanel);
if (!(this.m_ToolStripPanels.Contains(toolStripPanel)))
{
this.m_ToolStripPanels.Add(toolStripPanel);
}
postInitialize();
}
// 取得所要绘制的 ToolStripItem。
protected override void InitializeItem(ToolStripItem item)
{
if (!(this.m_toolstripitems.Contains(item)))
{
this.m_toolstripitems.Add(item);
}
postInitialize();
}
// 绘制所指定之按钮的背景,我们亦使用此例程来描绘一些其它项目型别的背景,以便让它们看起来很类似。
protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e)
{
LinearGradientMode lgm;
Rectangle r;
if (e.Item is ToolStripButton)
{
r = e.Item.ContentRectangle;
}
else
{
r = new Rectangle(1, 1, e.Item.Bounds.Width - 2, e.Item.Bounds.Height - 2);
}
if (e.Item.BackColor == SystemColors.ControlLight || e.Item.Pressed || e.Item.Selected)
{
Color c1, c2;
if (e.Item.Pressed)
{
c1 = scaleColorPct(this.m_color1, 80);
c2 = scaleColorPct(this.m_color2, 80);
}
else if (e.Item.Selected)
{
c1 = scaleColorPct(this.m_color1, 120);
c2 = scaleColorPct(this.m_color2, 120);
}
else
{
c1 = this.m_currentc1;
c2 = this.m_currentc2;
}
if (e.ToolStrip.Orientation == Orientation.Vertical)
{
lgm = LinearGradientMode.Vertical;
}
else
{
lgm = LinearGradientMode.Horizontal;
}
using (LinearGradientBrush lgb = new LinearGradientBrush(r, c1, c2, lgm))
{
e.Graphics.FillRectangle(lgb, r);
}
}
else
{
Color c;
c = e.Item.BackColor;
using (SolidBrush b = new SolidBrush(c))
{
e.Graphics.FillRectangle(b, r);
}
}
using (Pen p = new Pen(this.m_itemBorderColor))
{
e.Graphics.DrawRectangle(p, r);
}
}
// 绘制边框。
protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
{
if (this.m_drawToolbarBorder)
{
using (Pen p = new Pen(this.m_itemBorderColor))
{
Rectangle r = new Rectangle(0, 0, e.ToolStrip.Width - 1, e.ToolStrip.Height - 1);
e.Graphics.DrawRectangle(p, r);
}
}
}
// 描绘一个分隔项目。
protected override void OnRenderSeparator(ToolStripSeparatorRenderEventArgs e)
{
Point pt1, pt2;
using (Pen p = new Pen(this.m_itemBorderColor))
{
if (e.ToolStrip.Orientation == Orientation.Vertical)
{
pt1 = new Point(0, e.Item.Height / 2);
pt2 = new Point(e.Item.Width, e.Item.Height / 2);
}
else
{
pt1 = new Point(e.Item.Width / 2, 0);
pt2 = new Point(e.Item.Width / 2, e.Item.Height);
}
e.Graphics.DrawLine(p, pt1, pt2);
}
}
// 描绘一个 ToolStripDropDownButton 的背景。
protected override void OnRenderDropDownButtonBackground(ToolStripItemRenderEventArgs e)
{
OnRenderItemBackground(e);
}
protected override void OnRenderGrip(ToolStripGripRenderEventArgs e)
{
LinearGradientMode lgm;
Rectangle r;
if (e.GripDisplayStyle == ToolStripGripDisplayStyle.Horizontal)
{
lgm = LinearGradientMode.Vertical;
r = new Rectangle(e.GripBounds.Left + 2,
e.GripBounds.Top,
e.GripBounds.Width - 5,
e.GripBounds.Height - 3);
}
else
{
lgm = LinearGradientMode.Horizontal;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -