Eine transparente Schaltfläche zeichnen

Ich versuche, eine transparente Schaltfläche in C # (.NET 3.5 SP1) zu erstellen, die in meiner WinForms-Anwendung verwendet wird. Ich habe alles versucht, um die Schaltfläche transparent zu machen (es sollte den Verlaufshintergrund unter der Schaltfläche anzeigen), aber es funktioniert einfach nicht.

Hier ist der Code, den ich benutze:

public class ImageButton : ButtonBase, IButtonControl
{
    public ImageButton()
    {
        this.SetStyle(
            ControlStyles.SupportsTransparentBackColor | 
            ControlStyles.OptimizedDoubleBuffer | 
            ControlStyles.AllPaintingInWmPaint | 
            ControlStyles.ResizeRedraw | 
            ControlStyles.UserPaint, true);
        this.BackColor = Color.Transparent;
    }

    protected override void OnPaint(PaintEventArgs pevent)
    {
        Graphics g = pevent.Graphics;
        g.FillRectangle(Brushes.Transparent, this.ClientRectangle);
        g.DrawRectangle(Pens.Black, this.ClientRectangle);
    }


    // rest of class here...

}

Das Problem ist, dass die Schaltfläche scheinbar irgendwo zufälligen Arbeitsspeicher der Benutzeroberfläche abruft und sich selbst mit Puffer aus der Benutzeroberfläche von Visual Studio füllt (wenn sie sich im Entwurfsmodus befindet). Zur Laufzeit wird ein Puffer mit dem Wert Null abgerufen, und er ist vollständig schwarz.

Mein letztendliches Ziel ist es, ein Bild auf eine unsichtbare Schaltfläche anstelle des Rechtecks ​​zu malen. Das Konzept sollte jedoch gleich bleiben. Wenn der Benutzer den Mauszeiger über die Schaltfläche hält, wird eine Form vom Typ Schaltfläche gezeichnet.

Irgendwelche Ideen?

EDIT: Vielen Dank an alle, das Folgende hat für mich funktioniert:

public class ImageButton : Control, IButtonControl
{
    public ImageButton()
    {
        SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        SetStyle(ControlStyles.Opaque, true);
        SetStyle(ControlStyles.ResizeRedraw, true);
        this.BackColor = Color.Transparent;

    }

    protected override void OnPaint(PaintEventArgs pevent)
    {
        Graphics g = pevent.Graphics;
        g.DrawRectangle(Pens.Black, this.ClientRectangle);
    }


    protected override void OnPaintBackground(PaintEventArgs pevent)
    {
        // don't call the base class
        //base.OnPaintBackground(pevent);
    }


    protected override CreateParams CreateParams
    {
        get
        {
            const int WS_EX_TRANSPARENT = 0x20;
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= WS_EX_TRANSPARENT;
            return cp;
        }
    }

    // rest of class here...
}

Antworten auf die Frage(4)

Ihre Antwort auf die Frage