Tuesday, May 21, 2019

Make a Form Transparent in Visual Foxpro



*******************************************************************************
* 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 &amp;&amp; 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 &amp;&amp; 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