How to create a transparent control in VB 2008
How to create a transparent control in VB 2008
Introduction
This article provides the code required to implement control transparency in VB 2008.
Background
The transparency option in VB 2008 is not as useful as it could be because the Transparency
setting causes the application to hide all of the graphics under the control, all the way through to the form background.
Using the code
The code provided below can be copied directly into your project. It works by using the “CopyFromScreen
” method of the Graphics
object to copy a snapshot of the screen area directly behind the given control into a bitmap. This bitmap is then assigned as the BackImage
of the control.
Public Sub SetBackgroundTransparent(ByRef theCtl As Control)
'This routine makes a control appear to be transparent
'Transparency in VB2008 is implemented in a bit of an odd way.
'When the backcolor is set to Transparent, the control
'erases everything behind it except the form
'so if you have a number of layered controls,
'you appear to see a "hole" in the display
'This routine works by taking a snapshot of the area behind
'the control and copying this as a bitmap to the
'backimage of the control.
'The control isn't truly transparent, but it appears to be.
'Incoming variable: the control to be made transparent
Dim intSourceX As Integer
Dim intSourceY As Integer
Dim intBorderWidth As Integer
Dim intTitleHeight As Integer
Dim bmp As Bitmap
Dim MyGraphics As Graphics
'get the X and Y corodinates of the control,
'allowing for the border and titlebar dimensions
intBorderWidth = (Me.Width - Me.ClientRectangle.Width) / 2
intTitleHeight = ((Me.Height - (2 * intBorderWidth)) - _
Me.ClientRectangle.Height)
intSourceX = Me.Left + intBorderWidth + theCtl.Left
intSourceY = Me.Top + intTitleHeight + intBorderWidth + theCtl.Top
'Hide the control otherwise we end up getting a snapshot of the control
theCtl.Visible = False
'Give the UI some time to hide the control
Application.DoEvents()
'Take a snapshot of the screen in the region behind the control
bmp = New Bitmap(theCtl.Width, theCtl.Height)
MyGraphics = Graphics.FromImage(bmp)
MyGraphics.CopyFromScreen(intSourceX, intSourceY, 0, 0, bmp.Size)
MyGraphics.Dispose()
'use this clip as a the back image of the label
theCtl.BackgroundImageLayout = ImageLayout.None
theCtl.BackgroundImage = bmp
'show the control with its new backimage
theCtl.Visible = True
'Give the UI some time to show the control
Application.DoEvents()
End Sub