views:

2201

answers:

3

I'm filling the background of some VB.NET 2005 WinForms form with a nice pretty gradient fill (by overriding the OnPaint event). This works fine but the various labels etc on the form show with a solid background even after I set the BackColor to Color.Transparent. Setting the transparency key of the form itself seems to affect this but I cannot get the labels to have a truely transparent BackColor, is there an easy way to get around this or am I looking at custom controls etc?

+1  A: 

Add a new class to your project and paste the code shown below. Build. Drop the new control from the top of your toolbox onto your form.

Public Class TransparentLabel
    Inherits Label

    Public Sub New()
        Me.SetStyle(ControlStyles.Opaque, True)
        Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, False)
    End Sub

    Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
        Get
            Dim cp As CreateParams = MyBase.CreateParams
            cp.ExStyle = cp.ExStyle Or &H20  ' Turn on WS_EX_TRANSPARENT
            Return cp
        End Get
    End Property
End Class

The flicker might be noticeable, no fix.

Hans Passant
+1  A: 

After some experimentation I've found that the following works for gradiant filling form backgrounds and preserving label transparency:

Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

    Dim formGraphics As Graphics = e.Graphics
    Dim gradientBrush As New LinearGradientBrush(New Point(0, Height), New Point(0, 0), Me.AppSettings.FormGradiantFrom, Me.AppSettings.FormGradiantTo)

    formGraphics.FillRectangle(gradientBrush, ClientRectangle)

End Sub

And in the form load event:

SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.DoubleBuffer Or _
               ControlStyles.ResizeRedraw Or ControlStyles.UserPaint, True)
Simon
I implemented the solution described but I got a problem: when I drag my form, the background it captured in the previous position is dragged to the new position...
Jader Dias
A: 

Hi, the first code works very fine! But with the additional part i've got a problem:

I get the error ""AppSettings" is no member of "myproject.transparentLabel" in the line Dim gradientBrush ...

Im'm using "Visual Basic 2008 Express"

Do you have any idea?

Another question: I cannot change the text of this TransparentLabel at runtime with TransparentLabel.Text = "blah blah..." Error BC30469 (i cannot translate from german!) Any idea, how i can solve this?

ciao Klaus