如何替換掉.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上看了老外的一個討論后得到啟示才解決這個問題。感謝萬能的谷歌!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM