通过上面的效果截图可以看到,重绘后的MenuStrip和ContextMenuStrip可以添加自己的LOGO信息,实现了类似OFFICE2007的菜单显示效果。

.NET对菜单控件的绘制提供了一个抽象类ToolStripRenderer,这个类里面提供了相应的绘制函数,只要重写这些函数,就可以实现菜单的重绘。MenuStrip和ContextMenuStrip提供了一个属性Renderer,该属性就是由ToolStripRenderer定义的,MenuStrip和ContextMenuStrip的Renderer属性设置为继承ToolStripRenderer的绘制类,就可以轻松的绘制MenuStrip和ContextMenuStrip的皮肤了。

下面就是继承ToolStripRenderer类实现的本文开始贴出的菜单效果图的ProfessionalToolStripRendererEx类的代码:

public class ProfessionalToolStripRendererEx 

        : ToolStripRenderer

    {

        private static readonly int OffsetMargin = ;

        private string _menuLogoString = "更多精彩尽在 www.csharpwin.com";

        private ToolStripColorTable _colorTable;

        public ProfessionalToolStripRendererEx()

            : base()

        {

        }

        public ProfessionalToolStripRendererEx(

            ToolStripColorTable colorTable) : base()

        {

            _colorTable = colorTable;

        }

        public string MenuLogoString

        {

            get { return _menuLogoString; }

            set { _menuLogoString = value; }

        }

        protected virtual ToolStripColorTable ColorTable

        {

            get

            {

                if (_colorTable == null)

                {

                    _colorTable = new ToolStripColorTable();

                }

                return _colorTable;

            }

        }

        protected override void OnRenderToolStripBackground(

            ToolStripRenderEventArgs e)

        {

            ToolStrip toolStrip = e.ToolStrip;

            Graphics g = e.Graphics;

            Rectangle bounds = e.AffectedBounds;

            if (toolStrip is ToolStripDropDown)

            {

                RegionHelper.CreateRegion(toolStrip, bounds);

                using (SolidBrush brush = new SolidBrush(ColorTable.BackNormal))

                {

                    g.FillRectangle(brush, bounds);

                }

            }

            else if (toolStrip is MenuStrip)

            {

                LinearGradientMode mode =

                    toolStrip.Orientation == Orientation.Horizontal ?

                    LinearGradientMode.Vertical : LinearGradientMode.Horizontal;

                RenderHelper.RenderBackgroundInternal(

                    g,

                    bounds,

                    ColorTable.Base,

                    ColorTable.Border,

                    ColorTable.BackNormal,

                    RoundStyle.None,

                    ,

                    .35f,

                    false,

                    false,

                    mode);

            }

            else

            {

                base.OnRenderToolStripBackground(e);

            }

        }

        protected override void OnRenderImageMargin(

            ToolStripRenderEventArgs e)

        {

            ToolStrip toolStrip = e.ToolStrip;

            Graphics g = e.Graphics;

            Rectangle bounds = e.AffectedBounds;

            if (toolStrip is ToolStripDropDown)

            {

                bool bDrawLogo = NeedDrawLogo(toolStrip);

                bool bRightToLeft = toolStrip.RightToLeft == RightToLeft.Yes;

                Rectangle imageBackRect = bounds;

                imageBackRect.Width = OffsetMargin;

                if (bDrawLogo)

                {

                    Rectangle logoRect = bounds;

                    logoRect.Width = OffsetMargin;

                    if (bRightToLeft)

                    {

                        logoRect.X -= ;

                        imageBackRect.X = logoRect.X - OffsetMargin;

                    }

                    else

                    {

                        logoRect.X += ;

                        imageBackRect.X = logoRect.Right;

                    }

                    logoRect.Y += ;

                    logoRect.Height -= ;

                    using (LinearGradientBrush brush = new LinearGradientBrush(

                        logoRect,

                        ColorTable.BackHover,

                        ColorTable.BackNormal,

                        90f))

                    {

                        Blend blend = new Blend();

                        blend.Positions = new float[] { 0f, .2f, 1f };

                        blend.Factors = new float[] { 0f, 0.1f, .9f };

                        brush.Blend = blend;

                        logoRect.Y += ;

                        logoRect.Height -= ;

                        using (GraphicsPath path =

                            GraphicsPathHelper.CreatePath(logoRect, , RoundStyle.All, false))

                        {

                            using (SmoothingModeGraphics sg = new SmoothingModeGraphics(g))

                            {

                                g.FillPath(brush, path);

                            }

                        }

                    }

                    StringFormat sf = new StringFormat(StringFormatFlags.NoWrap);

                    Font font = new Font(

                        toolStrip.Font.FontFamily, , FontStyle.Bold);

                    sf.Alignment = StringAlignment.Near;

                    sf.LineAlignment = StringAlignment.Center;

                    sf.Trimming = StringTrimming.EllipsisCharacter;

                    g.TranslateTransform(logoRect.X, logoRect.Bottom);

                    g.RotateTransform(270f);

                    if (!string.IsNullOrEmpty(MenuLogoString))

                    {

                        Rectangle newRect = new Rectangle(

                            , , logoRect.Height, logoRect.Width);

                        using (Brush brush = new SolidBrush(ColorTable.Fore))

                        {

                            using (TextRenderingHintGraphics tg = 

                                new TextRenderingHintGraphics(g))

                            {

                                g.DrawString(

                                    MenuLogoString,

                                    font,

                                    brush,

                                    newRect,

                                    sf);

                            }

                        }

                    }

                    g.ResetTransform();

                }

                else

                {

                    if (bRightToLeft)

                    {

                        imageBackRect.X -= ;

                    }

                    else

                    {

                        imageBackRect.X += ;

                    }

                }

                imageBackRect.Y += ;

                imageBackRect.Height -= ;

                using (SolidBrush brush = new SolidBrush(ColorTable.DropDownImageBack))

                {

                    g.FillRectangle(brush, imageBackRect);

                }

                Point ponitStart;

                Point pointEnd;

                if (bRightToLeft)

                {

                    ponitStart = new Point(imageBackRect.X, imageBackRect.Y);

                    pointEnd = new Point(imageBackRect.X, imageBackRect.Bottom);

                }

                else

                {

                    ponitStart = new Point(imageBackRect.Right - , imageBackRect.Y);

                    pointEnd = new Point(imageBackRect.Right - , imageBackRect.Bottom);

                }

                using (Pen pen = new Pen(ColorTable.DropDownImageSeparator))

                {

                    g.DrawLine(pen, ponitStart, pointEnd);

                }

            }

            else

            {

                base.OnRenderImageMargin(e);

            }

        }

        protected override void OnRenderToolStripBorder(

            ToolStripRenderEventArgs e)

        {

            ToolStrip toolStrip = e.ToolStrip;

            Graphics g = e.Graphics;

            Rectangle bounds = e.AffectedBounds;

            if (toolStrip is ToolStripDropDown)

            {

                using (SmoothingModeGraphics sg = new SmoothingModeGraphics(g))

                {

                    using (GraphicsPath path =

                        GraphicsPathHelper.CreatePath(bounds, , RoundStyle.All, true))

                    {

                        using (Pen pen = new Pen(ColorTable.DropDownImageSeparator))

                        {

                            path.Widen(pen);

                            g.DrawPath(pen, path);

                        }

                    }

                }

                bounds.Inflate(-, -);

                using (GraphicsPath innerPath = GraphicsPathHelper.CreatePath(

                    bounds, , RoundStyle.All, true))

                {

                    using (Pen pen = new Pen(ColorTable.BackNormal))

                    {

                        g.DrawPath(pen, innerPath);

                    }

                }

            }

            else if (toolStrip is StatusStrip)

            {

                using (Pen pen = new Pen(ColorTable.Border))

                {

                    e.Graphics.DrawRectangle(

                        pen, , , e.ToolStrip.Width - , e.ToolStrip.Height - );

                }

            }

            else if (toolStrip is MenuStrip)

            {

                base.OnRenderToolStripBorder(e);

            }

            else

            {

                using (Pen pen = new Pen(ColorTable.Border))

                {

                    g.DrawRectangle(

                        pen, , , e.ToolStrip.Width - , e.ToolStrip.Height - );

                }

            }

        }

        protected override void OnRenderMenuItemBackground(

           ToolStripItemRenderEventArgs e)

        {

            ToolStrip toolStrip = e.ToolStrip;

            ToolStripItem item = e.Item;

            if (!item.Enabled)

            {

                return;

            }

            Graphics g = e.Graphics;

            Rectangle rect = new Rectangle(Point.Empty, e.Item.Size);

            if (toolStrip is MenuStrip)

            {

                LinearGradientMode mode =

                    toolStrip.Orientation == Orientation.Horizontal ?

                    LinearGradientMode.Vertical : LinearGradientMode.Horizontal;

                if (item.Selected)

                {

                    RenderHelper.RenderBackgroundInternal(

                        g,

                        rect,

                        ColorTable.BackHover,

                        ColorTable.Border,

                        ColorTable.BackNormal,

                        RoundStyle.All,

                        true,

                        true,

                        mode);

                }

                else if (item.Pressed)

                {

                    RenderHelper.RenderBackgroundInternal(

                       g,

                       rect,

                       ColorTable.BackPressed,

                       ColorTable.Border,

                       ColorTable.BackNormal,

                       RoundStyle.All,

                       true,

                       true,

                       mode);

                }

                else

                {

                    base.OnRenderMenuItemBackground(e);

                }

            }

            else if (toolStrip is ToolStripDropDown)

            {

                bool bDrawLogo = NeedDrawLogo(toolStrip);

                int offsetMargin = bDrawLogo ? OffsetMargin : ;

                if (item.RightToLeft == RightToLeft.Yes)

                {

                    rect.X += ;

                }

                else

                {

                    rect.X += offsetMargin + ;

                }

                rect.Width -= offsetMargin + ;

                rect.Height--;

                if (item.Selected)

                {

                    RenderHelper.RenderBackgroundInternal(

                       g,

                       rect,

                       ColorTable.BackHover,

                       ColorTable.Border,

                       ColorTable.BackNormal,

                       RoundStyle.All,

                       true,

                       true,

                       LinearGradientMode.Vertical);

                }

                else

                {

                    base.OnRenderMenuItemBackground(e);

                }

            }

            else

            {

                base.OnRenderMenuItemBackground(e);

            }

        }

        protected override void OnRenderItemImage(

            ToolStripItemImageRenderEventArgs e)

        {

            ToolStrip toolStrip = e.ToolStrip;

            Graphics g = e.Graphics;

            if (toolStrip is ToolStripDropDown &&

               e.Item is ToolStripMenuItem)

            {

                bool bDrawLogo = NeedDrawLogo(toolStrip);

                int offsetMargin = bDrawLogo ? OffsetMargin : ;

                ToolStripMenuItem item = (ToolStripMenuItem)e.Item;

                if (item.Checked)

                {

                    return;

                }

                Rectangle rect = e.ImageRectangle;

                if (e.Item.RightToLeft == RightToLeft.Yes)

                {

                    rect.X -= offsetMargin + ;

                }

                else

                {

                    rect.X += offsetMargin + ;

                }

                using (InterpolationModeGraphics ig = 

                    new InterpolationModeGraphics(g))

                {

                    ToolStripItemImageRenderEventArgs ne =

                        new ToolStripItemImageRenderEventArgs(

                        g, e.Item, e.Image, rect);

                    base.OnRenderItemImage(ne);

                }

            }

            else

            {

                base.OnRenderItemImage(e);

            }

        }

        protected override void OnRenderItemText(

            ToolStripItemTextRenderEventArgs e)

        {

            ToolStrip toolStrip = e.ToolStrip;

            e.TextColor = ColorTable.Fore;

            if (toolStrip is ToolStripDropDown &&

                e.Item is ToolStripMenuItem)

            {

                bool bDrawLogo = NeedDrawLogo(toolStrip);

                int offsetMargin = bDrawLogo ?  : ;

                Rectangle rect = e.TextRectangle;

                if (e.Item.RightToLeft == RightToLeft.Yes)

                {

                    rect.X -= offsetMargin;

                }

                else

                {

                    rect.X += offsetMargin;

                }

                e.TextRectangle = rect;

            }

            base.OnRenderItemText(e);

        }

        protected override void OnRenderItemCheck(

            ToolStripItemImageRenderEventArgs e)

        {

            ToolStrip toolStrip = e.ToolStrip;

            Graphics g = e.Graphics;

            if (toolStrip is ToolStripDropDown &&

               e.Item is ToolStripMenuItem)

            {

                bool bDrawLogo = NeedDrawLogo(toolStrip);

                int offsetMargin = bDrawLogo ? OffsetMargin : ;

                Rectangle rect = e.ImageRectangle;

                if (e.Item.RightToLeft == RightToLeft.Yes)

                {

                    rect.X -= offsetMargin + ;

                }

                else

                {

                    rect.X += offsetMargin + ;

                }

                rect.Width = ;

                rect.Y += ;

                rect.Height -= ;

                using (SmoothingModeGraphics sg = new SmoothingModeGraphics(g))

                {

                    using (GraphicsPath path = new GraphicsPath())

                    {

                        path.AddRectangle(rect);

                        using (PathGradientBrush brush = new PathGradientBrush(path))

                        {

                            brush.CenterColor = Color.White;

                            brush.SurroundColors = new Color[] { ControlPaint.Light(ColorTable.BackNormal) };

                            Blend blend = new Blend();

                            blend.Positions = new float[] { 0f, 0.3f, 1f };

                            blend.Factors = new float[] { 0f, 0.5f, 1f };

                            brush.Blend = blend;

                            g.FillRectangle(brush, rect);

                        }

                    }

                    using (Pen pen = new Pen(ControlPaint.Light(ColorTable.BackNormal)))

                    {

                        g.DrawRectangle(pen, rect);

                    }

                    ControlPaintEx.DrawCheckedFlag(g, rect, ColorTable.Fore);

                }

            }

            else

            {

                base.OnRenderItemCheck(e);

            }

        }

        protected override void OnRenderArrow(

            ToolStripArrowRenderEventArgs e)

        {

            if (e.Item.Enabled)

            {

                e.ArrowColor = ColorTable.Fore;

            }

            ToolStrip toolStrip = e.Item.Owner;

            if (toolStrip is ToolStripDropDown &&

                e.Item is ToolStripMenuItem)

            {

                bool bDrawLogo = NeedDrawLogo(toolStrip);

                int offsetMargin = bDrawLogo ?  : ;

                Rectangle rect = e.ArrowRectangle;

                if (e.Item.RightToLeft == RightToLeft.Yes)

                {

                    rect.X -= offsetMargin;

                }

                else

                {

                    rect.X += offsetMargin;

                }

                e.ArrowRectangle = rect;

            }

            base.OnRenderArrow(e);

        }

        protected override void OnRenderSeparator(

            ToolStripSeparatorRenderEventArgs e)

        {

            ToolStrip toolStrip = e.ToolStrip;

            Rectangle rect = e.Item.ContentRectangle;

            Graphics g = e.Graphics;

            if (toolStrip is ToolStripDropDown)

            {

                bool bDrawLogo = NeedDrawLogo(toolStrip);

                int offsetMargin = bDrawLogo ? 

                    OffsetMargin *  : OffsetMargin;

                if (e.Item.RightToLeft != RightToLeft.Yes)

                {

                    rect.X += offsetMargin + ;

                }

                rect.Width -= offsetMargin + ;

            }

            RenderSeparatorLine(

               g,

               rect,

               ColorTable.DropDownImageSeparator,

               ColorTable.BackNormal,

               SystemColors.ControlLightLight,

               e.Vertical);

        }

        internal void RenderSeparatorLine(

            Graphics g,

            Rectangle rect,

            Color baseColor,

            Color backColor,

            Color shadowColor,

            bool vertical)

        {

            float angle;

            if (vertical)

            {

                angle = 90F;

            }

            else

            {

                angle = 180F;

            }

            using (LinearGradientBrush brush = new LinearGradientBrush(

                    rect,

                    baseColor,

                    backColor,

                    angle))

            {

                Blend blend = new Blend();

                blend.Positions = new float[] { 0f, .2f, .5f, .8f, 1f };

                blend.Factors = new float[] { 1f, .3f, 0f, .3f, 1f };

                brush.Blend = blend;

                using (Pen pen = new Pen(brush))

                {

                    if (vertical)

                    {

                        g.DrawLine(pen, rect.X, rect.Y, rect.X, rect.Bottom);

                    }

                    else

                    {

                        g.DrawLine(pen, rect.X, rect.Y, rect.Right, rect.Y);

                    }

                    brush.LinearColors = new Color[] {

                        shadowColor, ColorTable.BackNormal };

                    pen.Brush = brush;

                    if (vertical)

                    {

                        g.DrawLine(pen, rect.X + , rect.Y, rect.X + , rect.Bottom);

                    }

                    else

                    {

                        g.DrawLine(pen, rect.X, rect.Y + , rect.Right, rect.Y + );

                    }

                }

            }

        }

        internal bool NeedDrawLogo(ToolStrip toolStrip)

        {

            ToolStripDropDown dropDown = toolStrip as ToolStripDropDown;

            bool bDrawLogo =

                (dropDown.OwnerItem != null &&

                dropDown.OwnerItem.Owner is MenuStrip) ||

                (toolStrip is ContextMenuStrip);

            return bDrawLogo;

        }

    }

}

实现MenuStrip和ContextMenuStrip重绘并不是很难的事情,这里就不过多的介绍,C# 使用GDI+绘制漂亮的MenuStrip和ContextMenuStrip皮肤就为你介绍到这里,希望你能喜欢。

声明:

本文版权归作者和CS 程序员之窗所有,欢迎转载,转载必须保留以下版权信息,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

作者:Starts_2000

出处:CS 程序员之窗 http://www.csharpwin.com。

你可以免费使用或修改提供的源代码,但请保留源代码中的版权信息,详情请查看:

CS程序员之窗开源协议 http://www.csharpwin.com/csol.html。

C# 使用GDI+绘制漂亮的MenuStrip和ContextMenuStrip皮肤的更多相关文章

  1. 通过GDI+绘制 验证码

    只为了记录下自己的学习历程,方便日后查看 现在开始言归正传,以下为其完整代码附上 using System; using System.Collections.Generic; using Syste ...

  2. C#利用GDI+绘制旋转文字等效果

    C#中利用GDI+绘制旋转文本的文字,网上有很多资料,基本都使用矩阵旋转的方式实现.但基本都只提及按点旋转,若要实现在矩形范围内旋转文本,资料较少.经过琢磨,可以将矩形内旋转转化为按点旋转,不过需要经 ...

  3. MFC 用gdi绘制填充多边形区域

    MFC 用gdi绘制填充多边形区域 这里的代码是实现一个三角形的绘制,并用刷子填充颜色 在OnPaint()函数里面 运用的是给定的三角形的三个点,很多个点可以绘制多边形 CBrush br(RGB( ...

  4. GDI绘制时钟效果,与系统时间保持同步,基于Winform

    2018年工作之余,想起来捡起GDI方面的技术,特意在RichCodeBox项目中做了两个示例程序,其中一个就是时钟效果,纯C#开发.这个CSharpQuartz是今天上午抽出一些时间,编写的,算是偷 ...

  5. 『备注』GDI+ 绘制文本有锯齿,透明背景文本绘制

    背景: GDI+ 绘制文本 时,如果 背景是透明的 —— 则会出现 锯齿. //其实,我不用这三个 属性 好多年了 //而且,这三个属性 在关键时刻还有可能 帮倒忙 //关键是:这三个属性,鸟用都没有 ...

  6. C#GDI+ 绘制线段(实线或虚线)、矩形、字符串、圆、椭圆

    C#GDI+ 绘制线段(实线或虚线).矩形.字符串.圆.椭圆 绘制基本线条和图形 比较简单,直接看代码. Graphics graphics = e.Graphics; //绘制实线 )) { pen ...

  7. C# GDI绘制仪表盘(纯代码实现)

    纯代码实现GDI绘制仪表盘,效果在代码下面. public partial class HalfDashboardUc : UserControl { /// <summary> /// ...

  8. 使用echarts绘制漂亮的渐变键盘仪表盘

    echarts官方示例和默认样式都比较难看,经过一顿捣鼓实现比较漂亮的渐变仪表盘. 第一步:设置轴线 将图表轴线.label.分割线.隐藏,只保留刻度,然后修改刻度样式达到最终效果.不过要注意的是ax ...

  9. 如何使用GDI绘制半透明矩形

    /*使用GDI绘制半透明矩形*/ void CDirectXDraw::DrawHalfOpacityRect(HDC hdc,CRect rect) { CDC dc; dc.Attach(hdc) ...

随机推荐

  1. virtualenv 和 virtualenvwrapper 实践

    virtualenv 首先来聊一下 virtualenv 是个什么鬼. 在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题:亦或者是在开发过程中不想让物理环境里充 ...

  2. miracast 协议wifi display

    看wifi direct display标准的地方: http://www.wi-fi.org/discover-wi-fi/specifications Miracast依赖的Wi-Fi技术项[②] ...

  3. django部署到最后 主页上出现的坏请求解决办法

    ALLOWED_HOSTS = ['*'] 不然会出现400的坏请求 到此为止 环境总算配置完毕历时2天半重新熟悉了大量apache 和 linux下的命令

  4. jQuery - Chaining

    jQuery - Chaining @(编程) 通过 jQuery,您可以把动作/方法链接起来. Chaining 允许我们在一条语句中允许多个 jQuery 方法(在相同的元素上). jQuery ...

  5. HDU 2859 Phalanx (dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2859 给你一个n*n的矩阵,问你最大的对称度是多少(左下右上为对称线) dp[i][j]表示i行j列元 ...

  6. Java Service Wrapper配置详解

    #encoding=UTF-8 # Configuration files must begin with a line specifying the encoding # of the the fi ...

  7. jquery操作复选框(checkbox)

    1.获取单个checkbox选中项(三种写法)$("input:checkbox:checked").val()或者$("input:[type='checkbox']: ...

  8. C:常量、变量 、 表达式 、运算符、 枚举

    常量 变量 表达式 运算符 枚举 1.布尔类型只有真和假 2运算符 >,<,<=,>=,==,!=.判断两个数是否相等要使用双等号‘==’.逻辑运算符的表达式结果非真即假,&a ...

  9. C++学习之const整理总结

    1什么是const? (const类型)常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的.(但可以偷梁换柱进行更新) 2为什么引入const? const 推出的初始 ...

  10. 使用MySQL中的EXPLAIN解释命令来检查SQL

    我们看到许多客户的系统因为SQL及数据库设计的很差所以导致许多性能上的问题,这些问题不好解决,但是可以采用一套简单的策略来检查生产系统,发现并纠正一些共性问题. 很显然,您应该尽最大努力设计出最好的数 ...