zoukankan      html  css  js  c++  java
  • 如何替换掉.net toolStrip控件溢出按钮背景图

      在使用.net toolStrip控件的时候,  toolStrip里面的item宽度超过本身宽度时,会出现一个溢出按钮:OverflowButton,这个按钮是控件的一个属性,其实也是继承自ToolStripDropDownItem,默认样式如下图:

    如何才能替换成像chrome书签栏一样的向右小箭头呢?

    本以为直接使用toolStrip.OverflowButton.BackgroundImage=Image.FromFile("OverflowArrowVertical.png")就能解决,可是这样好像没有任何效果。

      toolStrip的Renderer属性,能够让用户使用自定义的外观,只需要继承ToolStripRenderer类,重写其中的方法就能定义自己的样式,toolStrip的RenderMode是一个枚举值:

    public enum ToolStripRenderMode
        {
            // 摘要:
            //     Indicates that the System.Windows.Forms.ToolStrip.RenderMode is not determined
            //     by the System.Windows.Forms.ToolStripManager or the use of a System.Windows.Forms.ToolStripRenderer
            //     other than System.Windows.Forms.ToolStripProfessionalRenderer, System.Windows.Forms.ToolStripSystemRenderer
            [Browsable(false)]
            Custom = 0,
            //
            // 摘要:
            //     Indicates the use of a System.Windows.Forms.ToolStripSystemRenderer to paint.
            System = 1,
            //
            // 摘要:
            //     Indicates the use of a System.Windows.Forms.ToolStripProfessionalRenderer
            //     to paint.
            Professional = 2,
            //
            // 摘要:
            //     Indicates that the System.Windows.Forms.ToolStripManager.RenderMode or System.Windows.Forms.ToolStripManager.Renderer
            //     determines the painting style.
            ManagerRenderMode = 3,
        }

      可以看到,.net本身提供了4种样式,要实现图标替换,只需要继承任意一个样式并重写OnRenderOverflowButtonBackground方法即可。代码如下:

    public class DrawOverflowButtonRenderer : System.Windows.Forms.ToolStripProfessionalRenderer
        {
            Image ofArrowVertical;
            public DrawOverflowButtonRenderer(Image pic)
            {
                ofArrowVertical = pic;
            }
    
            protected override void OnRenderOverflowButtonBackground(ToolStripItemRenderEventArgs e)
            {
                if (e.ToolStrip.OverflowButton.Enabled)
                {
                    if (e.ToolStrip.OverflowButton.Pressed)
                    {
                        LinearGradientBrush lgb = new LinearGradientBrush(e.ToolStrip.OverflowButton.Bounds, ofPressedColor1, ofPressedColor2, ofPressedAngle);
                        e.Graphics.FillRectangle(lgb, e.Graphics.ClipBounds);
                        lgb.Dispose();
    
                    }
                    else if (e.ToolStrip.OverflowButton.Selected)
                    {
                        LinearGradientBrush lgb = new LinearGradientBrush(e.ToolStrip.OverflowButton.Bounds, ofHighlightColor1, ofHighlightColor2, ofHighlightAngle);
                        e.Graphics.FillRectangle(lgb, e.Graphics.ClipBounds);
                        lgb.Dispose();
                    }    
                }
                e.Graphics.DrawImage(ofArrowVertical, new Rectangle(0, e.ToolStrip.OverflowButton.Height - ofArrowVertical.Height, e.ToolStrip.OverflowButton.Bounds.Width, e.ToolStrip.OverflowButton.Bounds.Height));
            }
        }

      调用:this.toolStrip1.Renderer = new DrawOverflowButtonRenderer(Image.FromFile("OverflowArrowVertical.png"))便能替换图标了,最终效果:

      这个问题纠结了好久,各种谷歌百度,论坛提问都没人解决,平时伸手党惯了,这个控件不行就用其他控件替代,最终还是用英文在google搜了一把,在codeproject上看了老外的一个讨论后得到启示才解决这个问题。感谢万能的谷歌!

  • 相关阅读:
    从运维角度浅谈 MySQL 数据库优化
    好的架构不是设计出来的,而是演进出来的
    京东咚咚架构演进
    大型网站的架构
    MySQL开发规范
    MySQL 5.6的72个新特性(译)
    MySQL数据库运维的五大指标
    MySQL5.0、5.1、5.5、5.6功能进化
    MySQL各版本的区别
    ajax该什么时候用
  • 原文地址:https://www.cnblogs.com/xienb/p/3524941.html
Copyright © 2011-2022 走看看