Gracias a ti, Antonio.
Por culpa de fivewin, paso buenos ratos programando. Aunque me dedico a otros menesteres. Ahora, que hay poco trabajo, al menos me puedo entretener.
Os pongo y video y el código fuente completo.
Está hecho con FiveWin 6.12 y el rmake original. Sin ninguna clase modificada.
PULSE EN LA IMAGEN PARA VER EL VIDEO (No sé cómo ponerlo para que se reproduzca solo)
Code: Select all
#include "FiveWin.Ch"
//----------------------------------------------------------------------------//
// PRUEBA DE BOTONES EN UN ENTORNO MDI, CON VENTANAS SIEMPRE MAXIMIZADAS
// CAMBIA LA IMAGEN DE LOS BOTONES, PARA INDICAR SI EL MODULO ESTA ACTIVO
// JESUS MARIN deumare@gmail.com 12/11/2020
//----------------------------------------------------------------------------//
STATIC oWndP
function Main()
local oBar, oIco
DEFINE WINDOW oWndP MDI TITLE "Ejemplo botones tipo W10"
ACTIVATE WINDOW oWndP ON INIT ( oWndP:oMenu:End(), Child() ) MAXIMIZED
return nil
//----------------------------------------------------------------------------//
static function Child()
LOCAL oWnd, oBar, oBt1
DEFINE WINDOW oWnd MDICHILD OF oWndP TITLE "MENU" COLOR CLR_BLACK, RGB(242,242,242)
DEFINE BUTTONBAR oBar OF oWnd BUTTONSIZE 40,40
oBar:SetColor(CLR_HGRAY, CLR_WHITE)
oBar:bRClicked := {|| nil }
@00,000 BTNBMP oBt1 FILE "EXIT_W10.BMP" SIZE 40,40 ACTION oWndP:End() OF oBar UPDATE NOBORDER
oBt1:cToolTip=CRLF+" Salir "+CRLF+" "
oBt1:SetColor(CLR_WHITE, CLR_WHITE )
Botones_generales_2020(oBar)
ACTIVATE WINDOW oWnd MAXIMIZED
return nil
//----------------------------------------------------------------------------//
FUNCTION Botones_generales_2020(oBar)
LOCAL oBt:=ARRAY(3)
LOCAL cFile
//-------------------------------------------------------------------------
IF Es_Activa_MDI("Proveedores")=.t.
cFile:="W10_PROVE_SEL.BMP"
ELSE
cFile:="W10_PROVE.BMP"
ENDIF
@00,040 BTNBMP oBt[1] OF oBar FILE cFile UPDATE NOBORDER SIZE 40,40 ACTION IF( Activa_MDI("Proveedores"), ,PRG_PROVEEDOR(oWndP) )
//-------------------------------------------------------------------------
IF Es_Activa_MDI("Clientes")=.t.
cFile:="W10_CLIENTES_SEL.BMP"
ELSE
cFile:="W10_CLIENTES.BMP"
ENDIF
@00,080 BTNBMP oBt[2] OF oBar FILE cFile UPDATE NOBORDER SIZE 40,40 ACTION IF( Activa_MDI("Clientes"), , PRG_CLIENTES(oWndP) )
//-------------------------------------------------------------------------
IF Es_Activa_MDI("Articulos")=.t.
cFile:="W10_ARTICUL_SEL.BMP"
ELSE
cFile:="W10_ARTICUL.BMP"
ENDIF
@00,120 BTNBMP oBt[3] OF oBar FILE cFile UPDATE NOBORDER SIZE 40,40 ACTION IF( Activa_MDI("Articulos"), , PRG_ARTICULOS(oWndP) )
oBt[1]:cToolTip=CRLF+" Mantenimiento de Proveedores "+CRLF+" "
oBt[2]:cToolTip=CRLF+" Mantenimiento de Clientes "+CRLF+" "
oBt[3]:cToolTip=CRLF+" Mantenimiento de Artículos "+CRLF+" "
oBt[1]:SetColor(, CLR_WHITE )
oBt[2]:SetColor(, CLR_WHITE )
oBt[3]:SetColor(, CLR_WHITE )
return(oBt)
//-------------------------------------------------------------------------//
FUNCTION Activa_MDI(cTitle) // Esta funcion selecionada una ventana MDI si ya esta abierta.
LOCAL i:=0, lSuccess:=.f.
cTitle:=upper(cTitle)
FOR i=1 TO LEN(oWndP:oWndClient:aWnd)
IF UPPER( oWndP:oWndClient:aWnd[i]:cCaption )=cTitle
oWndP:oWndClient:aWnd[i]:SetFocus()
lSuccess:=.t.
ENDIF
NEXT
RETURN lSuccess
//---------------------------------------------------------------------------//
// Esta funcion actualiza los botones, para ver si están abiertos o no los modulos
// cuando una ventana recibe el foco, revisará y cambiara si procede.
// Sin el timer previo no funciona. Parece que recibe el foco antes de finalizar la otra ventana
FUNCTION ACT_BOT_2020(aBotones)
LOCAL oTimer
DEFINE TIMER oTimer INTERVAL 500 ACTION aBotones:=ACT_BOT_2020B(aBotones)
ACTIVATE TIMER oTimer
return(aBotones)
FUNCTION ACT_BOT_2020B(aBotones)
IF Es_Activa_MDI("Proveedores")=.T.
aBotones[1]:SetFile("W10_PROVE_SEL.BMP")
ELSE
aBotones[1]:SetFile("W10_PROVE.BMP")
ENDIF
IF Es_Activa_MDI("Clientes")=.T.
aBotones[2]:SetFile("W10_CLIENTES_SEL.BMP")
ELSE
aBotones[2]:SetFile("W10_CLIENTES.BMP")
ENDIF
IF Es_Activa_MDI("Arti")=.T.
aBotones[3]:SetFile("W10_ARTICUL_SEL.BMP")
ELSE
aBotones[3]:SetFile("W10_ARTICUL.BMP")
ENDIF
return(aBotones)
//-----------------------------------------------------------------------------//
FUNCTION Es_Activa_MDI(cTitle) // Esta devuelve .f. o .t. si una ventana MDI si ya esta abierta.
LOCAL i:=0, lSuccess:=.f.
cTitle:=upper(cTitle)
FOR i=1 TO LEN(oWndP:oWndClient:aWnd)
IF UPPER( oWndP:oWndClient:aWnd[i]:cCaption )=cTitle
lSuccess:=.t.
ENDIF
NEXT
RETURN lSuccess
//-----------------------------------------------------------------------------//
function MyError( o )
MsgInfo( o:Description )
return nil
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// MODULOS DE PROGRAMA. PUEDE IR EN OTRO .PRG
FUNCTION PRG_PROVEEDOR()
LOCAL oWnd, oBar, oBt1
LOCAL oFont
LOCAL aBotones:=ARRAY(3)
DEFINE FONT oFont NAME "Segoe UI Light" SIZE 0,-30
DEFINE WINDOW oWnd MDICHILD OF oWndP TITLE "PROVEEDORES" COLOR CLR_BLACK, RGB(242,242,242)
DEFINE BUTTONBAR oBar OF oWnd BUTTONSIZE 40,40
oBar:SetColor(CLR_HGRAY, CLR_WHITE)
oBar:bRClicked := {|| nil }
@00,000 BTNBMP oBt1 FILE "EXIT_W10.BMP" SIZE 40,40 ACTION oWnd:End() OF oBar UPDATE NOBORDER
oBt1:cToolTip=CRLF+" Salir "+CRLF+" "
oBt1:SetColor(CLR_WHITE, CLR_WHITE )
aBotones:=Botones_generales_2020(oBar)
@60,10 SAY "PROVEEDORES" OF oWnd FONT oFont SIZE 1000,50 PIXEL COLOR CLR_BLUE
ACTIVATE WINDOW oWnd MAXIMIZED VALID PRO_END(oFont) ;
ON INIT ( oWnd:bGotFocus:={ || aBotones:=ACT_BOT_2020(aBotones) } )
return nil
//-----------------------------------------------------------------------------
FUNCTION PRO_END(oFont)
oFont:End()
return(.t.)
///////////////////////////////////////////////////////////////////////////////
FUNCTION PRG_CLIENTES()
LOCAL oWnd, oBar, oBt1
LOCAL oFont
LOCAL aBotones:=ARRAY(3)
DEFINE FONT oFont NAME "Segoe UI Light" SIZE 0,-30
DEFINE WINDOW oWnd MDICHILD OF oWndP TITLE "CLIENTES" COLOR CLR_BLACK, RGB(242,242,242)
DEFINE BUTTONBAR oBar OF oWnd BUTTONSIZE 40,40
oBar:SetColor(CLR_HGRAY, CLR_WHITE)
oBar:bRClicked := {|| nil }
@00,000 BTNBMP oBt1 FILE "EXIT_W10.BMP" SIZE 40,40 ACTION oWnd:End() OF oBar UPDATE NOBORDER
oBt1:cToolTip=CRLF+" Salir "+CRLF+" "
oBt1:SetColor(CLR_WHITE, CLR_WHITE )
aBotones:=Botones_generales_2020(oBar)
@60,10 SAY "CLIENTES" OF oWnd FONT oFont SIZE 1000,50 PIXEL COLOR CLR_RED
ACTIVATE WINDOW oWnd MAXIMIZED VALID CLI_END(oFont) ;
ON INIT oWnd:bGotFocus:={ || aBotones:=ACT_BOT_2020(aBotones) }
return nil
//----------------------------------------------------------------------------
FUNCTION CLI_END(oFont)
oFont:End()
return(.t.)
///////////////////////////////////////////////////////////////////////////////
FUNCTION PRG_ARTICULOS()
LOCAL oWnd, oBar, oBt1
LOCAL oFont
LOCAL aBotones:=ARRAY(3)
DEFINE FONT oFont NAME "Segoe UI Light" SIZE 0,-30
DEFINE WINDOW oWnd MDICHILD OF oWndP TITLE "ARTICULOS" COLOR CLR_BLACK, RGB(242,242,242)
DEFINE BUTTONBAR oBar OF oWnd BUTTONSIZE 40,40
oBar:SetColor(CLR_HGRAY, CLR_WHITE)
oBar:bRClicked := {|| nil }
@00,000 BTNBMP oBt1 FILE "EXIT_W10.BMP" SIZE 40,40 ACTION oWnd:End() OF oBar UPDATE NOBORDER
oBt1:cToolTip=CRLF+" Salir "+CRLF+" "
oBt1:SetColor(CLR_WHITE, CLR_WHITE )
aBotones:=Botones_generales_2020(oBar)
@60,10 SAY "ARTICULOS" OF oWnd FONT oFont SIZE 1000,50 PIXEL COLOR CLR_GREEN
ACTIVATE WINDOW oWnd MAXIMIZED VALID ART_END(oFont) ;
ON INIT oWnd:bGotFocus:={ || aBotones:=ACT_BOT_2020(aBotones) }
return nil
//------------------------------------------------------------------------------
FUNCTION ART_END(oFont)
oFont:End()
return(.t.)