• 重绘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();

  • 相关阅读:
    项目中遇到的问题:前台 disabled 与 后台disabled
    差距
    那些零碎的感悟,那些成长的事【壹】
    假期数据结构学习总结
    烟大 2242: 回文(栈和队列)
    烟大 2241: 相同序列(栈和队列)
    烟大 2239: 十进制与八进制的转换(栈和队列)
    烟大 2238: 括号匹配(栈和队列)
    hdu 1018:Big Number(水题)
    hdu 2050:折线分割平面(水题,递归)
  • 原文地址:https://www.cnblogs.com/wangyonglai/p/11328036.html
Copyright © 2020-2023  润新知