该控件扩展了ToolStrip的功能,增加了水印功能,增加了图标在鼠标进入时自动增亮的功能。
只要实现思想:
- 扩展了ToolStripProfessionalRenderer渲染器,重写了OnRenderToolStripBorder、OnRenderSeparator、OnRenderItemImage、OnRenderToolStripBackground等几个方法,从而实现背景,水印的实现。
- 代码如下
/// <summary>
/// ToolStrip 渲染器。更改背景为过度显示和鼠标进入时图片自动增亮的功能。
/// </summary>
public class JWToolStripBarRenderer : ToolStripProfessionalRenderer
{
//Dictionary<string, Image> dict = new Dictionary<string, Image>();
private Brush backgroundBrush = null;
List<EtyImageState> m_ImageList = new List<EtyImageState>();
public JWToolStripBarRenderer()
{
this.RoundedEdges = false;
}
/// <summary>
/// 当更换背景颜色时,执行该方法才能生效,为的是提高效率。
/// </summary>
public void ResetBackgroundBrush()
{
this.backgroundBrush = null;
}
private Color m_ToolStripGradientBegin = SystemColors.InactiveBorder;
/// <summary>
/// 获取在 ToolStrip 背景中使用的渐变的开始颜色。
/// </summary>
public Color ToolStripGradientBegin
{
get { return m_ToolStripGradientBegin; }
set { m_ToolStripGradientBegin = value; }
}
private Color m_ToolStripGradientEnd = SystemColors.ControlLightLight;
/// <summary>
/// 获取在 ToolStrip 背景中使用的渐变的结束颜色。
/// </summary>
public Color ToolStripGradientEnd
{
get { return m_ToolStripGradientEnd; }
set { m_ToolStripGradientEnd = value; }
}
private BackgroundGradientStyle m_BackgroundGradientStyle = BackgroundGradientStyle.Horizontal;
/// <summary>
/// 设置背景渐变方式。
/// </summary>
public BackgroundGradientStyle BackgroundGradientStyle
{
get { return m_BackgroundGradientStyle; }
set
{
m_BackgroundGradientStyle = value;
}
}
private DrawBorderMode m_DrawBorderMode = DrawBorderMode.TopAndBottom;
/// <summary>
/// 画ToolStrip边框的形式。
/// </summary>
public DrawBorderMode DrawBorderMode
{
get { return m_DrawBorderMode; }
set { m_DrawBorderMode = value; }
}
private Image m_WatermarkImage;
/// <summary>
/// 水印的图片。
/// </summary>
///
public Image WatermarkImage
{
get { return m_WatermarkImage; }
set { m_WatermarkImage = value; }
}
private int m_brightValue = 30;
/// <summary>
/// 鼠标进入时的图片增亮值。默认为 30
/// </summary>
public int BrightValue
{
get { return m_brightValue; }
set { m_brightValue = value; }
}
//protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e)
//{
// e.ArrowColor = Color.Red;
// e.Direction = ArrowDirection.Right;
// base.OnRenderArrow(e);
//}
// This method draws a border around the GridStrip control.
protected override void OnRenderToolStripBorder(
ToolStripRenderEventArgs e)
{
base.OnRenderToolStripBorder(e);
if (e.ToolStrip is ToolStripDropDown) //过滤,根据需要可能还有更多的过滤
return;
using (Pen pen = new Pen(SystemColors.ButtonShadow))
{
if (m_DrawBorderMode == DrawBorderMode.TopAndBottom || m_DrawBorderMode == DrawBorderMode.TopOnly)
e.Graphics.DrawLine(pen, e.AffectedBounds.X, e.AffectedBounds.Y, e.AffectedBounds.Width, e.AffectedBounds.Y);
if (m_DrawBorderMode == DrawBorderMode.TopAndBottom || m_DrawBorderMode == DrawBorderMode.BottomOnly)
e.Graphics.DrawLine(pen, e.AffectedBounds.X, e.AffectedBounds.Height - 1, e.AffectedBounds.Width, e.AffectedBounds.Height - 1);
}
}
protected override void OnRenderSeparator(ToolStripSeparatorRenderEventArgs e)
{
if (e.ToolStrip.LayoutStyle == ToolStripLayoutStyle.Table || e.ToolStrip.LayoutStyle == ToolStripLayoutStyle.Flow)
{
base.OnRenderSeparator(new ToolStripSeparatorRenderEventArgs(e.Graphics, e.Item as ToolStripSeparator, false));
//e.Graphics.FillRectangle(new SolidBrush(Color.Red), new Rectangle(0, 0, 100, 2));
}
else
base.OnRenderSeparator(e);
}
//修改只保留原图片。
protected override void OnRenderItemImage(ToolStripItemImageRenderEventArgs e)
{
Bitmap img = e.Image as Bitmap;
if (img != null)
{
bool isEqualsInitImage = false;
EtyImageState ety = EtyImageState.GetEtyImageState(m_ImageList, img.GetHashCode(), out isEqualsInitImage);
if (ety == null)
{
ety = new EtyImageState();
ety.InitImage = img;
ety.LightImage = ImageTool.Brightness(img, m_brightValue);
m_ImageList.Add(ety);
}
if (e.Item.Selected)
e.Item.Image = ety.LightImage;
else
e.Item.Image = ety.InitImage;