Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations Chris Miller on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Transparent Forms 1

Status
Not open for further replies.

paveway

Programmer
Jan 6, 1999
17
AU
I don't know if someone has asked this question but how do i get transparent forms.&nbsp;&nbsp;What i have is a splash screen (which is a form with a bitmap on it (via the picture property)) and the picture has a border around it which is roughly oval in shape.&nbsp;&nbsp;What i want is to only show the oval shape and disregard the white background around it.&nbsp;&nbsp;If anyone has played the game subspace i want something similar to the opening title screen except only a single bitmap not the letters. <br>Thanks
 
Here's some code. I can't site a source for it but its a pretty good demo for what you need.<br><br>At the module level:<br><br>Option Explicit<br><br>Type POINTAPI<br>&nbsp;&nbsp;&nbsp;&nbsp;X As Long<br>&nbsp;&nbsp;&nbsp;&nbsp;Y As Long<br>End Type<br><br>' Change region of a window:<br>Declare Function SetWindowRgn Lib &quot;user32&quot; (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long<br>' Precanned region creation functions:<br>Declare Function CreateEllipticRgn Lib &quot;gdi32&quot; (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long<br>Declare Function CreateRectRgn Lib &quot;gdi32&quot; (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long<br>Declare Function CreateRoundRectRgn Lib &quot;gdi32&quot; (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long<br>' Polygon region creation functions:<br>Declare Function CreatePolygonRgn Lib &quot;gdi32&quot; (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long<br>Declare Function CreatePolyPolygonRgn Lib &quot;gdi32&quot; (lpPoint As POINTAPI, lpPolyCounts As Long, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long<br>' Polygon type:<br>Public Const WINDING = 2<br>' Region combination:<br>Declare Function CombineRgn Lib &quot;gdi32&quot; (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long<br>&nbsp;&nbsp;&nbsp;&nbsp;' Region combination types:<br>&nbsp;&nbsp;&nbsp;&nbsp;Public Const RGN_AND = 1<br>&nbsp;&nbsp;&nbsp;&nbsp;Public Const RGN_COPY = 5<br>&nbsp;&nbsp;&nbsp;&nbsp;Public Const RGN_DIFF = 4<br>&nbsp;&nbsp;&nbsp;&nbsp;Public Const RGN_MAX = RGN_COPY<br>&nbsp;&nbsp;&nbsp;&nbsp;Public Const RGN_MIN = RGN_AND<br>&nbsp;&nbsp;&nbsp;&nbsp;Public Const RGN_OR = 2<br>&nbsp;&nbsp;&nbsp;&nbsp;Public Const RGN_XOR = 3<br>&nbsp;&nbsp;&nbsp;&nbsp;' Region combination return values:<br>&nbsp;&nbsp;&nbsp;&nbsp;Public Const COMPLEXREGION = 3<br>&nbsp;&nbsp;&nbsp;&nbsp;Public Const SIMPLEREGION = 2<br>&nbsp;&nbsp;&nbsp;&nbsp;Public Const NULLREGION = 1<br><br>' GDI Clear up:<br>Declare Function DeleteObject Lib &quot;gdi32&quot; (ByVal hObject As Long) As Long<br><br><br>At the Form level:<br><br><br>Option Explicit<br><br>' Shape options:<br>Private Enum EWSShapes<br>&nbsp;&nbsp;&nbsp;&nbsp;wshpNone = 0<br>&nbsp;&nbsp;&nbsp;&nbsp;wshpRoundRectangle = 1<br>&nbsp;&nbsp;&nbsp;&nbsp;wshpEllipse = 2<br>&nbsp;&nbsp;&nbsp;&nbsp;wshpStar = 3<br>&nbsp;&nbsp;&nbsp;&nbsp;wshpLadder = 4<br>&nbsp;&nbsp;&nbsp;&nbsp;wshpHoled = 5<br>&nbsp;&nbsp;&nbsp;&nbsp;wshpWhat = 6<br>End Enum<br>Private m_eShape As EWSShapes<br><br>' Write text on the form:<br>Private Declare Function DrawText Lib &quot;user32&quot; Alias &quot;DrawTextA&quot; (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long<br>Private Type RECT<br>&nbsp;&nbsp;&nbsp;&nbsp;left As Long<br>&nbsp;&nbsp;&nbsp;&nbsp;top As Long<br>&nbsp;&nbsp;&nbsp;&nbsp;right As Long<br>&nbsp;&nbsp;&nbsp;&nbsp;bottom As Long<br>End Type<br><br>' Move the windows with the keys:<br>Private Declare Function SendMessage Lib &quot;user32&quot; Alias &quot;SendMessageA&quot; (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long<br>&nbsp;&nbsp;&nbsp;&nbsp;Private Const SC_MOVE = &HF010&<br>&nbsp;&nbsp;&nbsp;&nbsp;Private Const WM_SYSCOMMAND = &H112<br><br>' Move the window with the mouse:<br>Private Declare Function SetCapture Lib &quot;user32&quot; (ByVal hWnd As Long) As Long<br>Private Declare Function ReleaseCapture Lib &quot;user32&quot; () As Long<br>Private Declare Function GetCursorPos Lib &quot;user32&quot; (lpPoint As POINTAPI) As Long<br>Private m_bMoving As Boolean<br>Private m_sXOffset As Single<br>Private m_sYOffset As Single<br><br>Private Property Get TitleBar() As Boolean<br>&nbsp;&nbsp;&nbsp;&nbsp;TitleBar = (Me.Caption &lt;&gt; &quot;&quot;)<br>End Property<br>Private Property Let TitleBar(ByVal bTitlebar As Boolean)<br>&nbsp;&nbsp;&nbsp;&nbsp;If (TitleBar &lt;&gt; bTitlebar) Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If (bTitlebar) Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Me.Caption = &quot;WindowShaper&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Me.Caption = &quot;&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br>&nbsp;&nbsp;&nbsp;&nbsp;End If<br>End Property<br>Private Property Get Shape() As EWSShapes<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Shape = m_eShape<br>End Property<br>Private Property Let Shape(ByVal eShape As EWSShapes)<br>Dim hRgn As Long<br>Dim lW As Long<br>Dim lH As Long<br>Dim i As Integer<br>Dim hR1 As Long, hR2 As Long, lR As Long<br>Dim lL As Long, lT As Long, lW1 As Long, lH1 As Long<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;If (eShape &lt;&gt; m_eShape) Then<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For i = wshpNone To wshpWhat<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mnuShape(i).Checked = (i = eShape)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Next i<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' Get size in pixels:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lW = Me.Width \ Screen.TwipsPerPixelX<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lH = Me.Height \ Screen.TwipsPerPixelY<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' Create a region of the appropriate shape:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Select Case eShape<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case wshpNone<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' Select a Region = 0 to reset:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hRgn = 0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case wshpRoundRectangle<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' Simple region:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hRgn = CreateRoundRectRgn(0, 0, lW, lH, 64, 64)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case wshpEllipse<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' Simple region:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hRgn = CreateEllipticRgn(0, 0, lW, lH)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case wshpStar<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' A polygon region:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dim tStar(0 To 10) As POINTAPI<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' This is not geometrically correct, but gives the idea...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tStar(0).X = lW \ 2: tStar(0).Y = 0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tStar(1).X = (lW * 2) \ 3: tStar(1).Y = lH \ 3<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tStar(2).X = lW: tStar(2).Y = tStar(1).Y<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tStar(3).X = (lW * 9) \ 12: tStar(3).Y = (lH * 7) \ 12<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tStar(4).X = lW: tStar(4).Y = lH<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tStar(5).X = lW \ 2: tStar(5).Y = (lH * 9) \ 12<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tStar(6).X = 0: tStar(6).Y = tStar(4).Y<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tStar(7).X = (lW * 3) \ 12: tStar(7).Y = tStar(3).Y<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tStar(8).X = 0: tStar(8).Y = tStar(2).Y<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tStar(9).X = lW \ 3: tStar(9).Y = tStar(1).Y<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LSet tStar(10) = tStar(0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hRgn = CreatePolygonRgn(tStar(0), 11, WINDING)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case wshpLadder<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' OR Combine two rectangular regions:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hR1 = CreateRectRgn(0, 0, lW / 2, lH / 2)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hR2 = CreateRectRgn(lW / 2, lH / 2, lW, lH)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hRgn = CreateRectRgn(0, 0, 0, 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' NB the destination must be a valid region handle before this is called:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lR = CombineRgn(hRgn, hR1, hR2, RGN_OR)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteObject hR1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteObject hR2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case wshpHoled<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' Difference Combine two rectangular regions:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hR1 = CreateRectRgn(0, 0, lW, lH)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hR2 = CreateRectRgn(lW / 4, lH / 4, lW * 3 / 4, lH * 3 / 4)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hRgn = CreateRectRgn(0, 0, 0, 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lR = CombineRgn(hRgn, hR1, hR2, RGN_DIFF)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteObject hR1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteObject hR2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case wshpWhat<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' OR a random set of regions together for rather bizarre shape:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hRgn = CreateRectRgn(0, 0, 0, 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For i = 1 To 5<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lL = (Rnd * lW + 1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lT = (Rnd * lH + 1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lW1 = (Rnd * lW + 1) \ 2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lH1 = (Rnd * lH + 1) \ 2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Select Case (i Mod 3)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hR1 = CreateEllipticRgn(lL, lT, lL + lW1, lL + lH1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case 2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hR1 = CreateRoundRectRgn(lL, lT, lL + lW1, lT + lH1, lW1 \ 5, lH1 \ 5)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case Else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hR1 = CreateRectRgn(lL, lT, lL + lW1, lT + lH1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End Select<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lR = CombineRgn(hRgn, hR1, hRgn, RGN_OR)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteObject hR1<br> &nbsp;&nbsp;&nbsp;&nbsp;Next i<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End Select<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' Change the region:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetWindowRgn Me.hWnd, hRgn, 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' We don't need to manage the hRgn object -<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' Windows does this for us.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' Store the shape:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_eShape = eShape<br>&nbsp;&nbsp;&nbsp;&nbsp;End If<br>End Property<br><br>Private Sub Form_Load()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Randomize Timer<br>End Sub<br><br>Private Sub Form_LostFocus()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form_MouseUp vbLeftButton, 0, 0, 0<br>End Sub<br><br>Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)<br>&nbsp;&nbsp;&nbsp;&nbsp;Select Case True<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case (Button And vbLeftButton) = vbLeftButton<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' Set flag saying we're moving:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_bMoving = True<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' Determine where the mouse is relative to the top,left of the form:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' The vertical border of the form has a width Width-ScaleWidth\2:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_sXOffset = X + (Me.Width - Me.ScaleWidth) \ 2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' Approximate the horizontal offset due to title bar & horizontal border:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_sYOffset = Y + (Me.Height - Me.ScaleHeight) - (Me.Width - Me.ScaleWidth) \ 2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' Ensure all messages go to this window:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCapture Me.hWnd<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case (Button And vbRightButton) = vbRightButton<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Me.PopupMenu mnuTop<br>&nbsp;&nbsp;&nbsp;&nbsp;End Select<br>End Sub<br><br>Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)<br>Dim tP As POINTAPI<br>&nbsp;&nbsp;&nbsp;&nbsp;If (m_bMoving) Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' If we're moving, then place the form on the screen where the mouse is,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' taking into account where we initially clicked on the form:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetCursorPos tP<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Me.Move tP.X * Screen.TwipsPerPixelX - m_sXOffset, tP.Y * Screen.TwipsPerPixelY - m_sYOffset<br>&nbsp;&nbsp;&nbsp;&nbsp;End If<br>End Sub<br><br>Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)<br>&nbsp;&nbsp;&nbsp;&nbsp;If (m_bMoving) Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' Clear capture.&nbsp;&nbsp;We also call this during LostFocus just in case<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReleaseCapture<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_bMoving = False<br>&nbsp;&nbsp;&nbsp;&nbsp;End If<br>End Sub<br><br><br>Private Sub Form_Paint()<br>Dim sText As String<br>Dim tR As RECT<br>Dim lH As Long<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;' Show a caption on the form:<br>&nbsp;&nbsp;&nbsp;&nbsp;Me.Cls<br>&nbsp;&nbsp;&nbsp;&nbsp;sText = &quot;Right Click for some Shape Related fun!&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;tR.right = Me.ScaleWidth \ Screen.TwipsPerPixelX<br>&nbsp;&nbsp;&nbsp;&nbsp;tR.bottom = Me.ScaleHeight \ Screen.TwipsPerPixelY<br>&nbsp;&nbsp;&nbsp;&nbsp;DrawText Me.hdc, sText, Len(sText), tR, (1& Or &H10&)<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>End Sub<br><br>Private Sub Form_Resize()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form_Paint<br>End Sub<br><br>Private Sub mnuRight_Click(Index As Integer)<br>Dim lP As Long<br>&nbsp;&nbsp;&nbsp;&nbsp;Select Case Index<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case 0&nbsp;&nbsp;' Move<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' Emulates clicking the Move option in a system menu:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lP = ((Me.left \ Screen.TwipsPerPixelX) And &HFFFF&)&nbsp;&nbsp;&nbsp;&nbsp;' horiz pos is loword<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lP = lP + (Me.top \ Screen.TwipsPerPixelY \ &H10000)&nbsp;&nbsp;&nbsp;&nbsp;' vert pos is hiword<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMessage Me.hWnd, WM_SYSCOMMAND, SC_MOVE, lP<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case 2&nbsp;&nbsp;' Title bar<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mnuRight(2).Checked = Not (mnuRight(2).Checked)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TitleBar = mnuRight(2).Checked<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case 5&nbsp;&nbsp;' Exit<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Unload Me<br>&nbsp;&nbsp;&nbsp;&nbsp;End Select<br>End Sub<br><br>Private Sub mnuShape_Click(Index As Integer)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Shape = Index<br>End Sub<br><br><br><br> <p> <br><a href=mailto: > </a><br><a href= temporary Vorpalcom home page</a><br>Send me suggestions or comments on my current software project.
 
Hi Alt255.

I've tried to get this working - But I can't.

I've cut and pasted the first part to a module, called Module1 and the second half to a form.

It crashes when I right click for the menu(?) saying the variable mnuTop has not been declared.

Any suggestions?

Shane Brennan
Shane.Brennan@tcat.ac.uk

 
Many apologies. mnuTop is a subroutine that, apparently, didn't get submitted with the rest of the post.

I wish somebody had pointed that out back in April when I had the code in my hands.

Sorry again. I'll see if I can't find the *rest* of the code.
VCA.gif

Alt255@Vorpalcom.Intranets.com
 
Very sorry about that. I can't find the rest of the code but the following will make a form transparent without all the fancy stuff offered by the other method.


'Module level....
[tt]
Declare Function GetWindowRect Lib _
&quot;user32&quot; (ByVal hwnd As Long, lpRect As RECT) As Long
Declare Function GetClientRect Lib _
&quot;user32&quot; (ByVal hwnd As Long, lpRect As RECT) As Long
Declare Function CombineRgn Lib _
&quot;gdi32&quot; (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, _
ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
Declare Function CreateRectRgn Lib &quot;gdi32&quot; _
(ByVal X1 As Long, ByVal Y1 As Long, _
ByVal X2 As Long, ByVal Y2 As Long) As Long

Declare Function ScreenToClient Lib &quot;user32&quot; _
(ByVal hwnd As Long, lpPoint As POINTAPI) As Long

Declare Function SetWindowRgn Lib &quot;user32&quot; _
(ByVal hwnd As Long, ByVal hRgn As Long, _
ByVal bRedraw As Boolean) As Long

Public Const RGN_AND = 1
Public Const RGN_COPY = 5
Public Const RGN_DIFF = 4
Public Const RGN_OR = 2
Public Const RGN_XOR = 3

Type POINTAPI
X As Long
Y As Long
End Type

Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Public Sub MakeTransparent(frm As Form)
Dim rctClient As RECT, rctFrame As RECT
Dim hClient As Long, hFrame As Long
GetWindowRect frm.hwnd, rctFrame
GetClientRect frm.hwnd, rctClient
Dim lpTL As POINTAPI, lpBR As POINTAPI
lpTL.X = rctFrame.Left
lpTL.Y = rctFrame.Top
lpBR.X = rctFrame.Right
lpBR.Y = rctFrame.Bottom
ScreenToClient frm.hwnd, lpTL
ScreenToClient frm.hwnd, lpBR

With rctFrame
.Left = lpTL.X
.Top = lpTL.Y
.Right = lpBR.X
.Bottom = lpBR.Y
End With

With rctClient
.Left = Abs(rctFrame.Left)
.Top = Abs(rctFrame.Top)
.Right = rctClient.Right + Abs(rctFrame.Left)
.Bottom = rctClient.Bottom + Abs(rctFrame.Top)
End With

With rctFrame
.Right = rctFrame.Right + Abs(rctFrame.Left)
.Bottom = rctFrame.Bottom + Abs(rctFrame.Top)
.Top = 0
.Left = 0
End With

hClient = CreateRectRgn(rctClient.Left, rctClient.Top, rctClient.Right, rctClient.Bottom)
hFrame = CreateRectRgn(rctFrame.Left, rctFrame.Top, rctFrame.Right, rctFrame.Bottom)

CombineRgn hFrame, hClient, hFrame, RGN_XOR

Dim C As Control, rctControl As RECT, hControl As Long
For Each C In frm
On Error Resume Next
GetWindowRect C.hwnd, rctControl

lpTL.X = rctControl.Left
lpTL.Y = rctControl.Top
lpBR.X = rctControl.Right
lpBR.Y = rctControl.Bottom

ScreenToClient frm.hwnd, lpTL
ScreenToClient frm.hwnd, lpBR

With rctControl
.Left = lpTL.X + rctClient.Left
.Top = lpTL.Y + rctClient.Top
.Right = lpBR.X + rctClient.Left
.Bottom = lpBR.Y + rctClient.Top
End With

hControl = CreateRectRgn(rctControl.Left, rctControl.Top, rctControl.Right, rctControl.Bottom)
CombineRgn hFrame, hControl, hFrame, RGN_OR
Next C

SetWindowRgn frm.hwnd, hFrame, True
End Sub
[/tt]
'Form level.....
[tt]
Private Sub Form_Load()
MakeTransparent Me
End Sub
[/tt]
VCA.gif

Alt255@Vorpalcom.Intranets.com
 
When I use this procedure, I get a transparent form, but I can not display Transparent Image controls. For some reason Image &amp; label controls are ignored by this procedure?

Any suggestions?
 
When I use this procedure, I get a transparent form, but I can not display Transparent Image controls. For some reason Image &amp; label controls are ignored by this procedure?

It's like the Image control is treated as not a control by the lines:

Dim C As Control, rctControl As RECT, hControl As Long

For Each C In frm


Any suggestions?
 
Hmmm, I don't think Image boxes have an hwnd property available in VB. Makes it tough to use them with the code I posted for your purposes.

I'll give it some thought but I'm hoping one of the pros in this forum will step in and lead the way. :)

VCA.gif

Alt255@Vorpalcom.Intranets.com
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top