How to Make Transparent Forms
Posted on January 5, 2009
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | 'Forms - How to Make Transparent Forms Option Explicit Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, _ ByVal X2 As Long, ByVal Y2 As Long) As Long Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, _ ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, _ ByVal bRedraw As Long) As Long Public Sub TransparentForm(frm As Form) frm.ScaleMode = vbPixels Const RGN_DIFF = 4 Const RGN_OR = 2 Dim outer_rgn As Long Dim inner_rgn As Long Dim wid As Single Dim hgt As Single Dim border_width As Single Dim title_height As Single Dim ctl_left As Single Dim ctl_top As Single Dim ctl_right As Single Dim ctl_bottom As Single Dim control_rgn As Long Dim combined_rgn As Long Dim ctl As Control If frm.WindowState = vbMinimized Then Exit Sub ' Create the main form region. wid = frm.ScaleX(frm.Width, vbTwips, vbPixels) hgt = frm.ScaleY(frm.Height, vbTwips, vbPixels) outer_rgn = CreateRectRgn(0, 0, wid, hgt) border_width = (wid - frm.ScaleWidth) / 2 title_height = hgt - border_width - frm.ScaleHeight inner_rgn = CreateRectRgn(border_width, title_height, wid - border_width, hgt - border_width) ' Subtract the inner region from the outer. combined_rgn = CreateRectRgn(0, 0, 0, 0) CombineRgn combined_rgn, outer_rgn, inner_rgn, RGN_DIFF ' Create the control regions. For Each ctl In frm.Controls If ctl.Container Is frm Then ctl_left = frm.ScaleX(ctl.Left, frm.ScaleMode, vbPixels) + border_width ctl_top = frm.ScaleX(ctl.Top, frm.ScaleMode, vbPixels) + title_height ctl_right = frm.ScaleX(ctl.Width, frm.ScaleMode, vbPixels) + ctl_left ctl_bottom = frm.ScaleX(ctl.Height, frm.ScaleMode, vbPixels) + ctl_top control_rgn = CreateRectRgn(ctl_left, ctl_top, ctl_right, ctl_bottom) CombineRgn combined_rgn, combined_rgn, control_rgn, RGN_OR End If Next ctl 'Restrict the window to the region. SetWindowRgn frm.hWnd, combined_rgn, True End Sub 'To call this function add the following code: Private Sub Form_Resize() TransparentForm Me End Sub |