Ejemplo de Formulario Transparente!!!
01/03/2020
Diógenes Vilarroel (Hotmail) - 2007
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
Jorge
Tengo una pregunta, soy nuevo en fox, si creo un formulario con el asistente
donde meto o como programo lo siguiente:
DEFINE CLASS tform As Form #DEFINE LWA_COLORKEY 1 #DEFINE LWA_ALPHA 2 #DEFINE GWL_EXSTYLE -20 #DEFINE WS_EX_LAYERED 0x80000
Ya que no meti todo el codigo en un .prg si no lo creo con el asistente .
Nota: el resto del codigo ya lo tengo en el formulario y en los botones
pero me falta por que me manda el siguiente error:
variable 'GWL_EXTYLE' is not found.
espero y me puedan ayudar.
Diógenes Vilarroel (Hotmail)
Saludos.
Debes crear un archivo ".h", por ejemplo: include.h y en él debes colocar
todas las directrices #DEFINE
Luego en el diseño del formulario, vas al menu "Formulario" y seleccionas la
opcion "Incluir archivo...". Seleccionas el archivo ".h" y listo. Ejecuta tu
formulario.Post by Jorge Tengo una pregunta, soy nuevo en fox, si creo un formulario con el asistente
DEFINE CLASS tform As Form #DEFINE LWA_COLORKEY 1 #DEFINE LWA_ALPHA 2 #DEFINE GWL_EXSTYLE -20 #DEFINE WS_EX_LAYERED 0x80000Ya que no meti todo el codigo en un .prg si no lo creo con el asistente . Nota: el resto del codigo ya lo tengo en el formulario y en los botones variable 'GWL_EXTYLE' is not found. espero y me puedan ayudar.
Jorge Vega
El segmento
DEFINE CLASS tform As Form #DEFINE LWA_COLORKEY 1 #DEFINE LWA_ALPHA 2 #DEFINE GWL_EXSTYLE -20 #DEFINE WS_EX_LAYERED 0x80000lo puedes instanciar en el metodo init de tu formulario también
Vea también
Referencias
Autor: Diógenes Vilarroel
Narkive