Dibujando un botón transparente

Estoy tratando de crear un botón transparente en C # (.NET 3.5 SP1) para usar en mi aplicación WinForms. He intentado todo para que el botón sea transparente (debería mostrar el fondo degradado debajo del botón), pero simplemente no funciona.

Aquí está el código que estoy usando:

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

}

El problema es que el botón parece estar agarrando la memoria de la interfaz de usuario aleatoria de algún lugar y llenándose con un búfer de la interfaz de usuario de Visual Studio (cuando está en modo de diseño). En el tiempo de ejecución, está agarrando un búfer de cero y es completamente negro.

Mi objetivo final es pintar una imagen en un botón invisible en lugar del rectángulo. El concepto debe permanecer igual sin embargo. Cuando el usuario se desplaza sobre el botón, se dibuja una forma de tipo botón.

¿Algunas ideas?

EDITAR: Gracias a todos, lo siguiente trabajó para mí:

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

Respuestas a la pregunta(4)

Su respuesta a la pregunta