Link to home
Start Free TrialLog in
Avatar of LennyGray
LennyGrayFlag for United States of America

asked on

How do I place a label behind a label

I want to place one label behind the other so that I will get a shadowed effect. In Access, I was able to make the background of a two labels transparent and I would place the blue text label in on top of a white text label to get a shadowed effect for a label. I am having difficulty getting the desired effect.

Can this be done on a form in VB.NET in Visual Studio 2008? Is there a way to simply get a shadowed effect to text in another way?

Thanks,
Lenny Gray
Avatar of Jaime Olivares
Jaime Olivares
Flag of Peru image

I think this requirement deserves a custom control, inherited from the regular Label control.
You have to override the OnPaint event.
Avatar of Jorge Paulino
You can do this in the Paint event of the label:
 

Private Sub Label1_Paint(...) Handles Label1.Paint
   e.Graphics.DrawString(Label1.Text, Label1.Font, Brushes.Blue, 2, 2) ' you have to play with this values
End Sub

Open in new window

Avatar of LennyGray

ASKER

Can you give me sample code for the custom control?

I use this technique quite frequently in my Access applications and I'd like to start building a library of routines to call.

Your code would be both educational and functional.

Please assume nothing in your example because I am a VBA programmer with a lot of experience but I am very new to VB.NET. I will need a lot of "hand-holding" while I learn this language.

Thanks.


Lenny
put the following code in a separated vb file, at your designer's toolbox a new custom control should appear, use it as a regular label
Imports System.Windows.Forms
 
Public Class ShadowLabel
    Inherits Label
 
    Private BackBrush As Brush
 
    Protected Overrides Sub OnCreateControl()
        MyBase.OnCreateControl()
        BackBrush = New SolidBrush(Me.BackColor)
    End Sub
 
    Protected Overrides Sub OnBackColorChanged(ByVal e As System.EventArgs)
        MyBase.OnBackColorChanged(e)
        BackBrush.Dispose()
        BackBrush = New SolidBrush(Me.BackColor)
    End Sub
 
    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        Dim r As RectangleF = e.ClipRectangle
        Dim sf As New StringFormat
 
        Select Case Me.TextAlign
            Case ContentAlignment.BottomCenter
                sf.LineAlignment = StringAlignment.Center
                sf.Alignment = StringAlignment.Far
            Case ContentAlignment.BottomLeft
                sf.LineAlignment = StringAlignment.Near
                sf.Alignment = StringAlignment.Far
            Case ContentAlignment.BottomRight
                sf.LineAlignment = StringAlignment.Far
                sf.Alignment = StringAlignment.Far
            Case ContentAlignment.MiddleCenter
                sf.LineAlignment = StringAlignment.Center
                sf.Alignment = StringAlignment.Center
            Case ContentAlignment.MiddleLeft
                sf.LineAlignment = StringAlignment.Near
                sf.Alignment = StringAlignment.Center
            Case ContentAlignment.MiddleRight
                sf.LineAlignment = StringAlignment.Far
                sf.Alignment = StringAlignment.Center
            Case ContentAlignment.TopCenter
                sf.LineAlignment = StringAlignment.Center
                sf.Alignment = StringAlignment.Near
            Case ContentAlignment.TopLeft
                sf.LineAlignment = StringAlignment.Near
                sf.Alignment = StringAlignment.Near
            Case ContentAlignment.TopRight
                sf.LineAlignment = StringAlignment.Far
                sf.Alignment = StringAlignment.Near
        End Select
 
        e.Graphics.FillRectangle(Me.BackBrush, e.ClipRectangle)
        e.Graphics.DrawString(Me.Text, Me.Font, Brushes.White, r, sf)
        r.Offset(-1, -1)
        e.Graphics.DrawString(Me.Text, Me.Font, Brushes.Blue, r, sf)
    End Sub
End Class

Open in new window

What do you mean by "put the following code in a separated vb file, at your designer's toolbox a new custom control should appear, use it as a regular label".

I put this into a class in my application but it did not show up in the toolbox, so I am doing something dumb.

Sorry for my lack of experience with this.

Lenny
ASKER CERTIFIED SOLUTION
Avatar of Jaime Olivares
Jaime Olivares
Flag of Peru image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Thanks...It worked!!

I did not know to add it to the project.

I have a long way to go.

Thanks again!

Lenny Gray