重绘MenuStrip控件

效果如图:

首先添加 CustomProfessionalRenderer类 用于重绘控件菜单样式

/// <summary>
/// 自定义MenuStrip 控件菜单样式类
/// </summary>
public class CustomProfessionalRenderer : ToolStripProfessionalRenderer
{
private Color _startColor = Color.White;//选中的渐变开始颜色
private Color _endCoolor = Color.Blue;//选中的渐变颜色结束值
public CustomProfessionalRenderer()
: base()
{
}
////public CustomProfessionalRenderer(Color startColor, Color endColor)
//// : base()
////{
//// _startColor = startColor;
//// _endCoolor = endColor;
////} public Color StartColor
{
get { return _startColor; }
set
{
_startColor = value;
}
} public Color EndColor
{
get { return _endCoolor; }
set
{
_endCoolor = value;
}
} /// <summary>
/// 获取圆角矩形区域 radius=直径
/// </summary>
/// <param name="rect"></param>
/// <param name="radius"></param>
/// <returns></returns>
public static GraphicsPath GetRoundedRectPath(Rectangle rect, int radius)
{
int diameter = radius;
Rectangle arcRect = new Rectangle(rect.Location, new Size(diameter, diameter));
GraphicsPath path = new GraphicsPath(); // 左上角
path.AddArc(arcRect, , ); // 右上角
arcRect.X = rect.Right - diameter;
path.AddArc(arcRect, , ); // 右下角
arcRect.Y = rect.Bottom - diameter;
path.AddArc(arcRect, , ); // 左下角
arcRect.X = rect.Left;
path.AddArc(arcRect, , );
path.CloseFigure();
return path;
} /// <summary>
/// 渲染背景 包括menustrip背景 toolstripDropDown背景
/// </summary>
/// <param name="e"></param>
protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e)
{
ToolStrip toolStrip = e.ToolStrip;
Graphics g = e.Graphics;
g.SmoothingMode = SmoothingMode.HighQuality;//抗锯齿
Rectangle bounds = e.AffectedBounds;
LinearGradientBrush lgbrush = new LinearGradientBrush(new Point(, ), new Point(, toolStrip.Height), Color.FromArgb(, _startColor), Color.FromArgb(, _endCoolor));
if (toolStrip is MenuStrip)
{
//由menuStrip的Paint方法定义 这里不做操作 }
else if (toolStrip is ToolStripDropDown)
{
int diameter = ;//直径
GraphicsPath path = new GraphicsPath();
Rectangle rect = new Rectangle(Point.Empty, toolStrip.Size);
Rectangle arcRect = new Rectangle(rect.Location, new Size(diameter, diameter)); path.AddLine(, , , );
// 右上角
arcRect.X = rect.Right - diameter;
path.AddArc(arcRect, , ); // 右下角
arcRect.Y = rect.Bottom - diameter;
path.AddArc(arcRect, , ); // 左下角
arcRect.X = rect.Left;
path.AddArc(arcRect, , );
path.CloseFigure();
toolStrip.Region = new Region(path);
g.FillPath(lgbrush, path);
}
else
{
base.OnRenderToolStripBackground(e);
}
} //渲染边框 不绘制边框
protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
{
//不调用基类的方法 屏蔽掉该方法 去掉边框
} //渲染箭头 更改箭头颜色
protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e)
{
e.ArrowColor = _endCoolor;
base.OnRenderArrow(e);
} /// <summary>
/// 渲染项 不调用基类同名方法
/// </summary>
/// <param name="e"></param>
protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)
{
Graphics g = e.Graphics;
ToolStripItem item = e.Item;
ToolStrip toolstrip = e.ToolStrip; //渲染顶级项
if (toolstrip is MenuStrip)
{
LinearGradientBrush lgbrush = new LinearGradientBrush(new Point(, ), new Point(, item.Height), Color.FromArgb(, _endCoolor), Color.FromArgb(, _startColor));
if (e.Item.Selected)//选中
{
GraphicsPath gp = GetRoundedRectPath(new Rectangle(new Point(, ), item.Size), );
g.FillPath(lgbrush, gp);
}
if (item.Pressed)//按下
{
//创建上面左右2圆角的矩形路径
GraphicsPath path = new GraphicsPath();
int diameter = ;
Rectangle rect = new Rectangle(Point.Empty, item.Size);
Rectangle arcRect = new Rectangle(rect.Location, new Size(diameter, diameter));
// 左上角
path.AddArc(arcRect, , );
// 右上角
arcRect.X = rect.Right - diameter;
path.AddArc(arcRect, , );
path.AddLine(new Point(rect.Width, rect.Height), new Point(, rect.Height));
path.CloseFigure();
//填充路径
g.FillPath(lgbrush, path);
//g.FillRectangle(Brushes.White, new Rectangle(Point.Empty, item.Size));
}
}
else if (toolstrip is ToolStripDropDown)//渲染下拉项
{
g.SmoothingMode = SmoothingMode.HighQuality;
LinearGradientBrush lgbrush = new LinearGradientBrush(new Point(, ), new Point(item.Width, ), Color.FromArgb(, _startColor), Color.FromArgb(, _endCoolor));
if (item.Selected)
{
GraphicsPath gp = GetRoundedRectPath(new Rectangle(, , item.Width, item.Height), );
g.FillPath(lgbrush, gp);
}
}
else
{
base.OnRenderMenuItemBackground(e);
}
} /// <summary>
/// 渲染分界线
/// </summary>
/// <param name="e"></param>
protected override void OnRenderSeparator(ToolStripSeparatorRenderEventArgs e)
{
Graphics g = e.Graphics;
LinearGradientBrush lgbrush = new LinearGradientBrush(new Point(, ), new Point(e.Item.Width, ), _startColor, Color.FromArgb(, _endCoolor));
g.FillRectangle(lgbrush, new Rectangle(, e.Item.Height / , e.Item.Width, ));
//base.OnRenderSeparator(e);
} /// <summary>
/// 渲染图片区域 下拉菜单左边的图片区域
/// </summary>
/// <param name="e"></param>
protected override void OnRenderImageMargin(ToolStripRenderEventArgs e)
{
// base.OnRenderImageMargin(e);
//屏蔽掉左边图片竖条
} }

其次添加类 CustomMenuStripControl 继承MenuStrip类

public partial class CustomMenuStripControl : MenuStrip
{
private Color _startColor = Color.White;//选中的渐变开始颜色
private Color _endCoolor = Color.Blue;//选中的渐变颜色结束值
private CustomProfessionalRenderer render;
public CustomMenuStripControl()
{
render = new CustomProfessionalRenderer();
this.Renderer = render;
} [Category("wyl")]
[Description("选中渐变开始的颜色")]
public Color StartColor
{
get { return _startColor; }
set
{
_startColor = value;
render.StartColor = value;
base.Invalidate();
}
} [Category("wyl")]
[Description("选中渐变结束的颜色")]
public Color EndColor
{
get { return _endCoolor; }
set
{
_endCoolor = value;
render.EndColor = value;
base.Invalidate();
}
}
}

完成。

CustomProfessionalRenderer类样式可以用于右键菜单按键样式。只要修改其属性contextMenuStrip1.Renderer = new CustomProfessionalRenderer();

重绘MenuStrip 控件的更多相关文章

  1. 自行实现透明的控件如Panel GroupBox(使用不需要重绘父控件的效果,一切都因为窗口有了WS_EX_TRANSPARENT属性)

    CSDN的Blog开通了.我想这里的Blog作为今后自己回答别人问题的时候,收藏答案的地方很不错呢. 因为社区的贴子早晚都会沉下去,查找起来很不方便,甚至再也找不到呢. Q: http://commu ...

  2. 重绘panel控件,实现panel的阴影效果

    最近想在项目中添加一个要有阴影的panel控件,找了好多资料,最后通过采用图片的方式实现了panel的阴影效果,效果图如下: 重绘代码如下: using System; using System.Co ...

  3. android控件拖动,移动、解决父布局重绘时控件回到原点

    这是主要代码: 保证其params发生改变,相对于父布局的位置就能达到位置移动到原来的位置 // 每次移动都要设置其layout,不然由于父布局可能嵌套listview,当父布局发生改变冲毁(如下拉刷 ...

  4. C# Winform学习---MDI窗体的设计,PictureBox控件(图片上一页下一页),Timer控件,MenuStrip控件

    一.MDI窗体的设计 1.MDI简介 MDI(Multiple Document Interface)就是所谓的多文档界面,与此对应就有单文档界面 (SDI), 它是微软公司从Windows 2.0下 ...

  5. Menustrip控件和ContextMenustrip控件

    Menustrip 控件是由System.Windows.Forms.Menustrip类提供,取代了以前的MainMenu控件,是应用程序菜单结构的容器,在建立菜单时,要给Menustrip控件添加 ...

  6. 自绘Tab控件

    自绘tab按钮效果图如下: 使用例子: MyTabControl *tabControl = NULL; tabControl = new MyTabControl();tabControl-> ...

  7. ToolStrip和MenuStrip控件簡介及常用屬性(转)

    ToolStrip和MenuStrip實際上是相同的控件,因為MenuStrip直接派生於ToolStrip.也就是說ToolStrip可以做的工作,MenuStrip也能完成. ToolStrip( ...

  8. C#自绘蒙版控件,带延时隐藏显示,拷贝底图功能

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; u ...

  9. (转载)C#工具箱Menustrip控件中分割线的设置方法

    最近编C#程序,因为初学,不是太清楚,碰到了toolstripMenu中分割线设置的问题.遍寻中文网页,都是语言不详的,甚是呕人. 上网找了个外文网站,给的答案甚是详细,先贴在下面. http://w ...

随机推荐

  1. RequestsDependencyWarning: urllib3 (1.25.7) or chardet (2.2.1) doesn't match a supported version

    /usr/lib/python2.7/site-packages/requests/__init__.py:91: RequestsDependencyWarning: urllib3 (1.25.7 ...

  2. (八)OpenStack---M版---双节点搭建---Cinder安装和配置

    ↓↓↓↓↓↓↓↓视频已上线B站↓↓↓↓↓↓↓↓ >>>>>>传送门 1.创建数据库并授权 2.获得admin凭证执行管理员命令并创建服务证书 3.创建块存储设备AP ...

  3. devops 下测试组织管理面临的挑战及应对

    导读 先从引发的5个问题讲起,再简单回顾一下devops 简介和兴起背景 ,再从itest 测试管理团队的视角提出应对办法 DevOps后,测试面临的挑战        敏捷开发必然是迭代开发管理模式 ...

  4. tensorflow模型量化实例

    1,概述 模型量化应该是现在最容易实现的模型压缩技术,而且也基本上是在移动端部署的模型的毕竟之路.模型量化基本可以分为两种:post training quantizated和quantization ...

  5. adb连接夜神模拟器与adb常用操作命令

    adb connect 127.0.0.1:62001 adb kill-server 在关闭adb服务后,要使用如下的命令启动adb服务. adb start-servermore than one ...

  6. Netty线程模型(五)

    Netty支持单线程.主线程模型.主从多线程模型. 我们在创建线程组的时候,如果不传递参数,则默认构建的线程组线程是CPU核心数量. 一.单线程模型 在ServerBootstrap调用方法group ...

  7. LeetCode 79. Word Search单词搜索 (C++)

    题目: Given a 2D board and a word, find if the word exists in the grid. The word can be constructed fr ...

  8. K12

    K12,教育类专用名词(kindergarten through twelfth grade),是学前教育至高中教育的缩写,现在普遍被用来代指基础教育. K-12教育是美国基础教育的统称.“K12”中 ...

  9. 如何确保redis中都是热数据

    相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略. redis 提供 6种数据淘汰策略: voltile-lru:从已设置过期时间的数据集(server.db[i].ex ...

  10. 洛谷 P5021 [NOIP2018]赛道重建

    洛谷 P5021 [NOIP2018]赛道重建 传送门 思路 思路就是常规的思路,所以就不说了--我就是来记录一下我的\(AC\)之路的,真的是太爽了 没错--我也是一个个打的部分分,最后终于AC的, ...