Drawing a transparent button

后端 未结 4 1478
不知归路
不知归路 2020-11-29 07:35

I\'m trying to create a transparent button in C# (.NET 3.5 SP1) to use in my WinForms application. I\'ve tried everything to get the button to be transparent (it should show

相关标签:
4条回答
  • 2020-11-29 08:05

    In winforms there are some tricks to allow a control having its background correctly painted when using transparency. You can add this code to the OnPaint or OnPaintBackground to get the controls you have in the background being painted:

    if (this.Parent != null)
    {
     GraphicsContainer cstate = pevent.Graphics.BeginContainer();
     pevent.Graphics.TranslateTransform(-this.Left, -this.Top);
     Rectangle clip = pevent.ClipRectangle;
     clip.Offset(this.Left, this.Top);
     PaintEventArgs pe = new PaintEventArgs(pevent.Graphics, clip);
    
     //paint the container's bg
     InvokePaintBackground(this.Parent, pe);
     //paints the container fg
     InvokePaint(this.Parent, pe);
     //restores graphics to its original state
     pevent.Graphics.EndContainer(cstate);
    }
    else
      base.OnPaintBackground(pevent); // or base.OnPaint(pevent);...
    
    0 讨论(0)
  • 2020-11-29 08:05

    I know this question is old, but if someone doesn't want to create a control to do this I came up with this code from a different article and changed it an extension method.

    public static void ToTransparent(this System.Windows.Forms.Button Button,
         System.Drawing.Color TransparentColor)
    {
        Bitmap bmp = ((Bitmap)Button.Image);
        bmp.MakeTransparent(TransparentColor);
        int x = (Button.Width - bmp.Width) / 2;
        int y = (Button.Height - bmp.Height) / 2;
        Graphics gr = Button.CreateGraphics();
        gr.DrawImage(bmp, x, y);
    }
    

    And the call like:

    buttonUpdate.ToTransparent(Color.Magenta);
    
    0 讨论(0)
  • 2020-11-29 08:09

    WinForms (and underlying User32) does not support transparency at all. WinForms however can simulate transparency by using control style you provide - SupportsTransparentBackColor, but in this case all that "transparent" control does, it to allow drawing parent its background.

    ButtonBase uses some windows styles that prevent working this mechanism. I see two solutions: one is to derive your control from Control (instead of ButtonBase), and second is to use Parent's DrawToBitmap to get background under your button, and then draw this image in OnPaint.

    0 讨论(0)
  • 2020-11-29 08:12

    I'm not sure ButtonBase supports transparency... have you checked that out?

    I've written a number of transparent controls, but I have always inherited from Control or UserControl.

    When you want to block out a control painting it's background - you should override OnPaintBackground instead of OnPaint and not call the base class.

    Filling a rectangle with Brushes.Transparent is funny though - you're painting with an invisible color over what's aready there. Or to put it another way: it does nothing!

    0 讨论(0)
提交回复
热议问题