*******************************************************************************
* 1) give to the form a backcolor that can't be found on any of form's objects
* 2) in form's init event, apply the makeirregular method from C:\Program Files (x86)\Microsoft
* Visual FoxPro 9\Samples\Solution\Toledo\Irregular.scx
*******************************************************************************
PUBLIC ofrm
ofrm = CREATEOBJECT("MyForm")
ofrm.show()
DEFINE CLASS myform as Form
Caption = "Transparent Form Sample"
backcolor = RGB(128,255,255)
showwindow = 2
nflags = 0
ADD OBJECT command1 AS commandbutton WITH ;
Top = 3, ;
Left = 280, ;
Height = 27, ;
Width = 84, ;
Caption = "opaque", ;
Name = "Command1"
ADD OBJECT label1 AS label WITH ;
Caption = "Label1", ;
Height = 17, ;
Left = 21, ;
Top = 13, ;
Width = 40, ;
Name = "Label1"
ADD OBJECT text1 AS textbox WITH ;
Height = 23, ;
Left = 87, ;
Top = 8, ;
Width = 168, ;
Name = "Text1"
ADD OBJECT label2 AS label WITH ;
Caption = "Label2", ;
Height = 17, ;
Left = 22, ;
Top = 48, ;
Width = 40, ;
Name = "Label2"
ADD OBJECT combo1 AS combobox WITH ;
Height = 24, ;
Left = 88, ;
Top = 42, ;
Width = 164, ;
Name = "Combo1"
ADD OBJECT grid1 AS grid WITH ;
Height = 157, ;
Left = 12, ;
Top = 84, ;
Width = 349, ;
Name = "Grid1"
PROCEDURE init
Thisform.Makeirr(Thisform.HWnd,Thisform.BackColor,1) && transparent
ENDPROC
PROCEDURE command1.click
Thisform.Makeirr(Thisform.HWnd,Thisform.BackColor,2) && transparent
ThisForm.Picture = ''
ENDPROC
PROCEDURE makeirr
*************************************************************************
* To create a non-rectangular form, a transparent color needs to be set.
* Anything drawn using this color will be transparent, and any
* mouse clicks in these regions will pass through to the visible form.
*
* This technique only works in Windows 2000/XP but it is much more efficient
* than previous techniques of setting a bounding region for the form.
*
* This can be used to create non-rectangluar forms, to create hovering agents,
* or simply to confuse your coworkers <g>.
*
* Although this function makes a form transparent, the Form must be setup
* accept these changes. First, the ShowWindow property MUST BE set to
* 2 'As Top-Level Form'. Otherwise the window cannot be drawn layered.
* Second, if you want to turn off the window's frame, since it will not be
* drawn transparent, you can set the following properties:
* BorderStyle = 0
* Caption = ""
* Closable = .F.
* ControlBox = .F.
* TitleBar = 0
*
*************************************************************************
*-- Pass in the window handle (Thisform.HWIND) and the color to make transparent.
LPARAMETERS nHWND, nColor, nAction
DECLARE INTEGER SetLayeredWindowAttributes IN win32api;
INTEGER HWND, INTEGER crKey, INTEGER bAlpha, INTEGER dwFlags
*These functions get and set a window's attributes
DECLARE INTEGER SetWindowLong IN user32.DLL ;
INTEGER hWnd, INTEGER nIndex, INTEGER dwNewLong
DECLARE INTEGER GetWindowLong IN user32.DLL ;
INTEGER hWnd, INTEGER nIndex
*Constants for SetLayeredWindowAttributs
#DEFINE LWA_COLORKEY 1
#DEFINE LWA_ALPHA 2
*Constants for SetWindowLong and GetWindowLong
#DEFINE GWL_EXSTYLE -20
#DEFINE WS_EX_LAYERED 0x00080000
LOCAL lnFlags
*The form's window must be set to Layered, so that it is drawn
* in a separate layer.
do case
case nAction = 1 && Make Transparent
lnFlags = GetWindowLong(nHWND, GWL_EXSTYLE) && Gets the existing flags from the window
thisform.nFlags = lnFlags
lnFlags = BITOR(lnFlags, WS_EX_LAYERED) && Appends the Layered flag to the existing ones
SetWindowLong(nHWND, GWL_EXSTYLE, lnFlags) && Sets the new flags to the window
SetLayeredWindowAttributes(nHWND, nColor, 0, LWA_COLORKEY)
case nAction = 2 && Make Opaque
SetWindowLong(nHWND, GWL_EXSTYLE, thisform.nFlags) && Sets the original flags to the window
SetLayeredWindowAttributes(nHWND, nColor, 0, 0)
endcase
ENDPROC
ENDDEF
No comments:
Post a Comment