重绘MenuStrip 控件

重绘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, 180, 90);

            // 右上角
            arcRect.X = rect.Right - diameter;
            path.AddArc(arcRect, 270, 90);

            // 右下角
            arcRect.Y = rect.Bottom - diameter;
            path.AddArc(arcRect, 0, 90);

            // 左下角
            arcRect.X = rect.Left;
            path.AddArc(arcRect, 90, 90);
            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(0, 0), new Point(0, toolStrip.Height), Color.FromArgb(255, _startColor), Color.FromArgb(200, _endCoolor));
            if (toolStrip is MenuStrip)
            {
                //由menuStrip的Paint方法定义 这里不做操作

            }
            else if (toolStrip is ToolStripDropDown)
            {
                int diameter = 1;//直径
                GraphicsPath path = new GraphicsPath();
                Rectangle rect = new Rectangle(Point.Empty, toolStrip.Size);
                Rectangle arcRect = new Rectangle(rect.Location, new Size(diameter, diameter));

                path.AddLine(0, 0, 10, 0);
                // 右上角
                arcRect.X = rect.Right - diameter;
                path.AddArc(arcRect, 270, 90);

                // 右下角
                arcRect.Y = rect.Bottom - diameter;
                path.AddArc(arcRect, 0, 90);

                // 左下角
                arcRect.X = rect.Left;
                path.AddArc(arcRect, 90, 90);
                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(0, 0), new Point(0, item.Height), Color.FromArgb(255, _endCoolor), Color.FromArgb(255, _startColor));
                if (e.Item.Selected)//选中
                {
                    GraphicsPath gp = GetRoundedRectPath(new Rectangle(new Point(0, 0), item.Size), 1);
                    g.FillPath(lgbrush, gp);
                }
                if (item.Pressed)//按下
                {
                    //创建上面左右2圆角的矩形路径
                    GraphicsPath path = new GraphicsPath();
                    int diameter = 1;
                    Rectangle rect = new Rectangle(Point.Empty, item.Size);
                    Rectangle arcRect = new Rectangle(rect.Location, new Size(diameter, diameter));
                    // 左上角
                    path.AddArc(arcRect, 180, 90);
                    // 右上角
                    arcRect.X = rect.Right - diameter;
                    path.AddArc(arcRect, 270, 90);
                    path.AddLine(new Point(rect.Width, rect.Height), new Point(0, 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(0, 0), new Point(item.Width, 0), Color.FromArgb(255, _startColor), Color.FromArgb(255, _endCoolor));
                if (item.Selected)
                {
                    GraphicsPath gp = GetRoundedRectPath(new Rectangle(0, 0, item.Width, item.Height), 1);
                    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(0, 0), new Point(e.Item.Width, 0), _startColor, Color.FromArgb(0, _endCoolor));
            g.FillRectangle(lgbrush, new Rectangle(3, e.Item.Height / 2, e.Item.Width, 1));
            //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();

原文地址:https://www.cnblogs.com/wangyonglai/p/11328036.html