DWUTKA at marlow.com
DWUTKA at marlow.com
Tue Jun 22 17:28:11 CDT 2004
-----Original Message-----
From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com]On Behalf Of Steve Conklin
(Developer at UltraDNT)
Sent: Tuesday, June 22, 2004 12:11 PM
To: 'Access Developers discussion and problem solving'
Subject: RE: [AccessD] Just for fun! Playing With Regions!
Drew, this is way cool.
I haven't even read the code yet, but is it do-able to have this work
the other way, that is, have the Access application shrink down and into
itself (sort of like an old tube tv turning off)?
Steve
<snip>
Sure can. Put the following into a module:
Option Compare Database
Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long,
ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As
Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long,
lpRect As RECT) As Long
Private Declare Function CreateEllipticRgn 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 CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal
Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Const RGN_XOR = 3
Private Const RGN_AND = 1
Function TVTubeOut(ByVal intHwnd As Long)
Dim X As Long
Dim rt As RECT
Dim rtCircle As RECT
Dim dwReturn As Long
Dim InitialRegion As Long
Dim i As Long
Dim intMax As Long
dwReturn = GetWindowRect(intHwnd, rt)
rt.Bottom = rt.Bottom - rt.Top
rt.Top = 0
rt.Right = rt.Right - rt.Left
rt.Left = 0
InitialRegion = CreateRectRgn(rt.Left, rt.Top, rt.Right, rt.Bottom)
rtCircle.Bottom = rt.Bottom
rtCircle.Top = rt.Top
rtCircle.Right = rt.Right
rtCircle.Left = rt.Left
If rt.Bottom > rt.Right Then
intMax = rt.Bottom
Else
intMax = rt.Right
End If
Do Until rtCircle.Top >= rtCircle.Bottom
X = CreateEllipticRgn(rtCircle.Left, rtCircle.Top, rtCircle.Right,
rtCircle.Bottom)
InitialRegion = CreateRectRgn(rt.Left, rt.Top, rt.Right, rt.Bottom)
dwReturn = CombineRgn(InitialRegion, InitialRegion, X, RGN_AND)
SetMainWindowRegion InitialRegion, intHwnd
rtCircle.Bottom = rtCircle.Bottom - 1
rtCircle.Top = rtCircle.Top + 1
rtCircle.Left = rtCircle.Left + 1
rtCircle.Right = rtCircle.Right - 1
DeleteObject X
DeleteObject InitialRegion
Loop
DeleteObject X
DeleteObject InitialRegion
End Function
Private Function SetMainWindowRegion(cRgn As Long, intHwnd As Long)
Dim dwReturn As Long
dwReturn = SetWindowRgn(intHwnd, cRgn, True)
End Function
And you can call it with:
Private Sub Command8_Click()
TVTubeOut Me.hwnd
DoCmd.Close acForm, Me.Name
End Sub
Private Sub Command9_Click()
TVTubeOut Application.hWndAccessApp
DoCmd.Quit
End Sub
One closes the form, one closes Access.
Drew