Diógenes Vilarroel (Hotmail)
2006-11-15 15:26:27 UTC
Saludos.
Este ejemplo lo encontre en
http://www.codefox.net/modules.php?name=News&file=article&sid=126
Le agregue algunas instrucciones para que funcione porque no corre tal como
lo indica en la dirección anterior. Mas abajo el código ajustado. Ver "&&
Agregado".
Funciona de maravilla en VFP 6 en adelante. Pero tiene una limitante y es
que solo funciona en formularios de nivel superior. Es decir, no funciona
con la propiedad ShowWindow igual a "0" o en "1". Ver "&& Ojo".
Sobre este código, alguien tiene idea de como hacer para que funcione solo
en la ventana de una aplicacion con la propiedad ShowWindow=0 ?
El truco esta en la funcion FindWindow que devuelve un puntero "hWnd" de la
ventana que se solicita "this.hWnd=FindWindow(0, this.caption)". El resto lo
hace las funciones GetWindowLong, SetWindowLong y SetLayeredWindowAttributes
que necesitan del puntero "hWnd".
Otra pregunta: Como puedo agregar un boton en la barra superior del
formulario al lado de los botones de minimizar, maximizar y cerrar ?
Gracias por la ayuda.
**********
oForm = CREATEOBJECT("Tform")
oForm.Visible = .T.
READ EVENTS
DEFINE CLASS tform As Form
#DEFINE LWA_COLORKEY 1
#DEFINE LWA_ALPHA 2
#DEFINE GWL_EXSTYLE -20
#DEFINE WS_EX_LAYERED 0x80000
Autocenter=.T.
Caption="Transparent Form"
ShowWindow=2 && Ojo
hwnd=.f. && Agregado
ADD OBJECT cmdSet As CommandButton WITH;
Left=10, Top=10, Height=27, Width=80, Caption="Set"
ADD OBJECT cmdClear As CommandButton WITH;
Left=100, Top=10, Height=27, Width=80, Caption="Clear"
PROCEDURE Init
DECLARE INTEGER FindWindow IN WIN32API INTEGER, STRING && Agregado
DECLARE INTEGER GetWindowLong IN user32;
INTEGER hWnd, INTEGER nIndex
DECLARE INTEGER SetWindowLong IN user32;
INTEGER hWnd, INTEGER nIndex, INTEGER dwNewLong
DECLARE INTEGER SetLayeredWindowAttributes IN user32;
INTEGER hwnd, INTEGER crKey,;
SHORT bAlpha, INTEGER dwFlags
this.hWnd=FindWindow(0, this.caption) && agregado
PROCEDURE Destroy
CLEAR EVENTS
PROCEDURE SetMode
LOCAL nExStyle
nExStyle = GetWindowLong(THIS.HWnd, GWL_EXSTYLE)
nExStyle = BITOR(nExStyle, WS_EX_LAYERED)
= SetWindowLong(THIS.HWnd, GWL_EXSTYLE, nExStyle)
= SetLayeredWindowAttributes(THIS.HWnd, 0,;
128, LWA_ALPHA)
PROCEDURE ClearMode
LOCAL nExStyle
nExStyle = GetWindowLong(THIS.HWnd, GWL_EXSTYLE)
nExStyle = BITXOR(nExStyle, WS_EX_LAYERED)
= SetWindowLong(THIS.HWnd, GWL_EXSTYLE, nExStyle)
PROCEDURE cmdSet.Click
ThisForm.SetMode
PROCEDURE cmdClear.Click
ThisForm.ClearMode
ENDDEFINE
Este ejemplo lo encontre en
http://www.codefox.net/modules.php?name=News&file=article&sid=126
Le agregue algunas instrucciones para que funcione porque no corre tal como
lo indica en la dirección anterior. Mas abajo el código ajustado. Ver "&&
Agregado".
Funciona de maravilla en VFP 6 en adelante. Pero tiene una limitante y es
que solo funciona en formularios de nivel superior. Es decir, no funciona
con la propiedad ShowWindow igual a "0" o en "1". Ver "&& Ojo".
Sobre este código, alguien tiene idea de como hacer para que funcione solo
en la ventana de una aplicacion con la propiedad ShowWindow=0 ?
El truco esta en la funcion FindWindow que devuelve un puntero "hWnd" de la
ventana que se solicita "this.hWnd=FindWindow(0, this.caption)". El resto lo
hace las funciones GetWindowLong, SetWindowLong y SetLayeredWindowAttributes
que necesitan del puntero "hWnd".
Otra pregunta: Como puedo agregar un boton en la barra superior del
formulario al lado de los botones de minimizar, maximizar y cerrar ?
Gracias por la ayuda.
**********
oForm = CREATEOBJECT("Tform")
oForm.Visible = .T.
READ EVENTS
DEFINE CLASS tform As Form
#DEFINE LWA_COLORKEY 1
#DEFINE LWA_ALPHA 2
#DEFINE GWL_EXSTYLE -20
#DEFINE WS_EX_LAYERED 0x80000
Autocenter=.T.
Caption="Transparent Form"
ShowWindow=2 && Ojo
hwnd=.f. && Agregado
ADD OBJECT cmdSet As CommandButton WITH;
Left=10, Top=10, Height=27, Width=80, Caption="Set"
ADD OBJECT cmdClear As CommandButton WITH;
Left=100, Top=10, Height=27, Width=80, Caption="Clear"
PROCEDURE Init
DECLARE INTEGER FindWindow IN WIN32API INTEGER, STRING && Agregado
DECLARE INTEGER GetWindowLong IN user32;
INTEGER hWnd, INTEGER nIndex
DECLARE INTEGER SetWindowLong IN user32;
INTEGER hWnd, INTEGER nIndex, INTEGER dwNewLong
DECLARE INTEGER SetLayeredWindowAttributes IN user32;
INTEGER hwnd, INTEGER crKey,;
SHORT bAlpha, INTEGER dwFlags
this.hWnd=FindWindow(0, this.caption) && agregado
PROCEDURE Destroy
CLEAR EVENTS
PROCEDURE SetMode
LOCAL nExStyle
nExStyle = GetWindowLong(THIS.HWnd, GWL_EXSTYLE)
nExStyle = BITOR(nExStyle, WS_EX_LAYERED)
= SetWindowLong(THIS.HWnd, GWL_EXSTYLE, nExStyle)
= SetLayeredWindowAttributes(THIS.HWnd, 0,;
128, LWA_ALPHA)
PROCEDURE ClearMode
LOCAL nExStyle
nExStyle = GetWindowLong(THIS.HWnd, GWL_EXSTYLE)
nExStyle = BITXOR(nExStyle, WS_EX_LAYERED)
= SetWindowLong(THIS.HWnd, GWL_EXSTYLE, nExStyle)
PROCEDURE cmdSet.Click
ThisForm.SetMode
PROCEDURE cmdClear.Click
ThisForm.ClearMode
ENDDEFINE