Rysowanie przezroczystego przycisku

Próbuję utworzyć przezroczysty przycisk w C # (.NET 3.5 SP1) do użycia w mojej aplikacji WinForm. Próbowałem wszystkiego, aby przycisk był przezroczysty (powinien pokazywać tło gradientu pod przyciskiem), ale po prostu nie działa.

Oto kod, którego używam:

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...

}

Problem polega na tym, że przycisk wydaje się przechwytywać przypadkową pamięć interfejsu użytkownika skądś i wypełnia się jakimś buforem z interfejsu użytkownika Visual Studio (w trybie projektowania). W czasie wykonywania pobiera bufor zerowy i jest całkowicie czarny.

Moim głównym celem jest namalowanie obrazu na niewidzialnym przycisku zamiast prostokąta. Koncepcja powinna pozostać taka sama. Gdy użytkownik najedzie kursorem na przycisk, zostanie narysowany kształt przycisku.

Jakieś pomysły?

EDYCJA: Dzięki wszystkim, następujące dla mnie działały:

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...
}

questionAnswers(4)

yourAnswerToTheQuestion