#include "Fivewin.ch"
STATIC oWnd
STATIC cRuta := "C:\DEUMARE\ICONS\" // pon aquí una tu ruta, si quieres para tus iconos, imagenes
STATIC oMenu
function Main()
LOCAL oFont
DEFINE FONT oFont NAME "Segoe UI Light" SIZE 0,-12
DEFINE WINDOW oWnd MDI TITLE "Test Buttons Bar Mdi"
*ACTIVATE WINDOW oWnd ON INIT ( oWnd:oMenu:End(), oWnd:oMenu:=NIL, Child() ) MAXIMIZED // prueba sin menu MDI
ACTIVATE WINDOW oWnd ON INIT Child() MAXIMIZED
oFont:End()
RETURN(NIL)
//-----------------------------------------------------------------------------
function BuildMenu()
local oMenu2
MENU oMenu2 POPUP
MENUITEM "&Salir" ACTION oWnd:End()
SEPARATOR
MENUITEM "&Clientes" ACTION IF( Activa_MDI("Clientes") , ,Modulo_clientes() )
MENUITEM "&Proveedores" ACTION IF( Activa_MDI("Proveedores"), ,Modulo_proveedores() )
MENUITEM "&Artículos" ACTION IF( Activa_MDI("Artículos") , ,Modulo_articulos() )
ENDMENU
RETURN(oMenu2)
//------------------------------------------------------------------------------
STATIC FUNCTION CHILD()
LOCAL oWnd2, oBar, oBar2
LOCAL aBotones:=ARRAY(2)
LOCAL oFont
oMenu:=BuildMenu()
DEFINE FONT oFont NAME "Segoe UI Light" SIZE 0,-12
DEFINE WINDOW oWnd2 MDICHILD OF oWnd TITLE "Menú" COLOR CLR_BLACK, RGB(242,242,242)
DEFINE BUTTONBAR oBar OF oWnd2 BUTTONSIZE 40,40
oBar:SetColor(CLR_BLACK, RGB(247,247,247))
oBar:bRClicked := {|| nil }
@01,000 BTNBMP aBotones[1] FILE cRuta+"EXIT_W11.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oWnd:End()
aBotones[1]:cToolTip=CRLF+" Salir "+CRLF+" "
@01,040 BTNBMP aBotones[2] FILE cRuta+"W10_MENU.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oMenu:Activate(40,41,oBar,.f.)
aBotones[2]:cToolTip=CRLF+" Menú principal "+CRLF+" "
ACTIVATE WINDOW oWnd2 MAXIMIZED
oFont:End()
return nil
///////////////////////////////////////////////////////////////////////////////
// MODULOS QUE SUELEN IR EN PRG DIFERENTES
FUNCTION MODULO_CLIENTES()
LOCAL oWndC, oBar, oBar2
LOCAL aBotones:=ARRAY(2)
LOCAL aSubBotones:={}
LOCAL oFont
DEFINE FONT oFont NAME "Segoe UI Light" SIZE 0,-12
DEFINE WINDOW oWndC MDICHILD OF oWnd TITLE "Clientes" COLOR CLR_BLACK, CLR_RED
DEFINE BUTTONBAR oBar OF oWndC BUTTONSIZE 40,40
oBar:SetColor(CLR_BLACK, RGB(247,247,247))
oBar:bRClicked := {|| nil }
@01,000 BTNBMP aBotones[1] FILE cRuta+"EXIT_W11.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oWndC:End()
aBotones[1]:cToolTip=CRLF+" Salir "+CRLF+" "
@01,040 BTNBMP aBotones[2] FILE cRuta+"W10_MENU.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oMenu:Activate(40,41,oBar,.f.)
aBotones[2]:cToolTip=CRLF+" Menú principal "+CRLF+" "
@41,0 BUTTONBAR oBar2 SIZE 1400,30 BUTTONSIZE 40,30 OF oWndC
oBar2:SetColor(CLR_BLACK, RGB(195,195,195))
oBar2:bRClicked := {|| nil }
@150,50 SAY "Aquí mis controles para el módulo de CLIENTES" OF oWndC PIXEL COLOR CLR_WHITE, CLR_RED
ACTIVATE WINDOW oWndC ON PAINT aSubBotones:=ACT_BOT_MODULOS(aSubBotones,oBar2) MAXIMIZED
oFont:End()
return nil
//-----------------------------------------------------------------------------
FUNCTION MODULO_PROVEEDORES()
LOCAL oWndPr, oBar, oBar2
LOCAL aBotones:=ARRAY(2)
LOCAL aSubBotones:={}
LOCAL oFont
DEFINE FONT oFont NAME "Segoe UI Light" SIZE 0,-12
DEFINE WINDOW oWndPr MDICHILD OF oWnd TITLE "Proveedores" COLOR CLR_BLACK, CLR_GREEN
DEFINE BUTTONBAR oBar OF oWndPr BUTTONSIZE 40,40
oBar:SetColor(CLR_BLACK, RGB(247,247,247))
oBar:bRClicked := {|| nil }
@01,000 BTNBMP aBotones[1] FILE cRuta+"EXIT_W11.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oWndPr:End()
aBotones[1]:cToolTip=CRLF+" Salir "+CRLF+" "
@01,040 BTNBMP aBotones[2] FILE cRuta+"W10_MENU.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oMenu:Activate(40,41,oBar,.f.)
aBotones[2]:cToolTip=CRLF+" Menú principal "+CRLF+" "
@41,0 BUTTONBAR oBar2 SIZE 1400,30 BUTTONSIZE 40,30 OF oWndPr
oBar2:SetColor(CLR_BLACK, RGB(195,195,195))
oBar2:bRClicked := {|| nil }
@150,50 SAY "Aquí mis controles para el módulo de PROVEEDORES" OF oWndPr PIXEL COLOR CLR_WHITE, CLR_GREEN
ACTIVATE WINDOW oWndPr ON PAINT aSubBotones:=ACT_BOT_MODULOS(aSubBotones,oBar2) MAXIMIZED
oFont:End()
return nil
//-----------------------------------------------------------------------------
FUNCTION MODULO_ARTICULOS()
LOCAL oWndA, oBar, oBar2
LOCAL aBotones:=ARRAY(2)
LOCAL aSubBotones:={}
LOCAL oFont
DEFINE FONT oFont NAME "Segoe UI Light" SIZE 0,-12
DEFINE WINDOW oWndA MDICHILD OF oWnd TITLE "Artículos" COLOR CLR_BLACK, CLR_YELLOW
DEFINE BUTTONBAR oBar OF oWndA BUTTONSIZE 40,40
oBar:SetColor(CLR_BLACK, RGB(247,247,247))
oBar:bRClicked := {|| nil }
@01,000 BTNBMP aBotones[1] FILE cRuta+"EXIT_W11.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oWndA:End()
aBotones[1]:cToolTip=CRLF+" Salir "+CRLF+" "
@01,040 BTNBMP aBotones[2] FILE cRuta+"W10_MENU.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oMenu:Activate(40,41,oBar,.f.)
aBotones[2]:cToolTip=CRLF+" Menú principal "+CRLF+" "
@41,0 BUTTONBAR oBar2 SIZE 1400,30 BUTTONSIZE 40,30 OF oWndA
oBar2:SetColor(CLR_BLACK, RGB(195,195,195))
oBar2:bRClicked := {|| nil }
@150,50 SAY "Aquí mis controles para el módulo de ARTICULOS" OF oWndA PIXEL COLOR CLR_BLACK, CLR_YELLOW
ACTIVATE WINDOW oWndA ON PAINT aSubBotones:=ACT_BOT_MODULOS(aSubBotones,oBar2) MAXIMIZED
oFont:End()
return nil
//-----------------------------------------------------------------------------
// FUNCTION Botones_modulos() crea los BtnBmp si no existen
// FUNCTION Act_Bot_Modulos() actualiza los BtnBmp.
// FUNCTION Es_Activa_MDI() devuelve verdadero o falso si la ventana esta creada
// FUNCTION Activa_mdi() Da el foco a la ventana
// FUNCTION Alinear_derecha() Alinea correctamente a la deerecha el texto del BtnBmp (en mi version no lo hace correctamente)
FUNCTION Botones_modulos(oBar,oFont)
LOCAL aoBt:=ARRAY(3)
@2,002 BTNBMP aoBt[1] OF oBar FILE cRuta+"BOTON_VERDE.BMP" PROMPT ALINEAR_DERECHA("Clientes",oFont,oBar,70) ;
UPDATE NOBORDER SIZE 98,24 ACTION IF( Activa_MDI("Clientes"), ,Modulo_clientes() ) FONT oFont LEFT
@2,102 BTNBMP aoBt[2] OF oBar FILE cRuta+"BOTON_VERDE.BMP" PROMPT ALINEAR_DERECHA("Proveedores",oFont,oBar,70) ;
UPDATE NOBORDER SIZE 98,24 ACTION IF( Activa_MDI("Proveedores"), ,Modulo_clientes() ) FONT oFont LEFT
@2,202 BTNBMP aoBt[3] OF oBar FILE cRuta+"BOTON_VERDE.BMP" PROMPT ALINEAR_DERECHA("Artículos", oFont, oBar,70) ;
UPDATE NOBORDER SIZE 98,24 ACTION IF( Activa_MDI("Artículos"), ,Modulo_clientes() ) FONT oFont LEFT
return(aoBt)
//------------------------------------------------------------------------------
FUNCTION ACT_BOT_MODULOS(aoBt, oBar,oFont)
LOCAL nPosicion:=1
LOCAL cCaption:= UPPER(oBar:oWnd:cCaption)
// Si los btnbmp no existen, los crea
IF EMPTY(aoBt)
aoBt:=Botones_modulos(oBar,oFont)
ENDIF
// ORDENAMOS DE IZQUIERDA A DERECHA
// SALDRAN EN EL ORDEN NATURAL, PERO TAMBIEN PUEDES CREAR UN ORDEN DE CREACION
IF Es_Activa_MDI("Clientes")=.t.
aoBt[1]:nLeft:=nPosicion
nPosicion:=nPosicion+100
IF UPPER("Clientes")=cCaption
aoBt[1]:SetFile(cRuta+"BOTON_VERDE.BMP")
ELSE
aoBt[1]:SetFile(cRuta+"BOTON_ROJO.BMP")
ENDIF
aoBt[1]:Show()
ELSE
aoBt[1]:Hide()
ENDIF
IF Es_Activa_MDI("Proveedores")=.t.
aoBt[2]:nLeft:=nPosicion
nPosicion:=nPosicion+100
IF UPPER("Proveedores")=cCaption
aoBt[2]:SetFile(cRuta+"BOTON_VERDE.BMP")
ELSE
aoBt[2]:SetFile(cRuta+"BOTON_ROJO.BMP")
ENDIF
aoBt[2]:Show()
ELSE
aoBt[2]:Hide()
ENDIF
IF Es_Activa_MDI("Artículos")=.t.
aoBt[3]:nLeft:=nPosicion
nPosicion:=nPosicion+100
IF UPPER("Artículos")=cCaption
aoBt[3]:SetFile(cRuta+"BOTON_VERDE.BMP")
ELSE
aoBt[3]:SetFile(cRuta+"BOTON_ROJO.BMP")
ENDIF
aoBt[3]:Show()
ELSE
aoBt[3]:Hide()
ENDIF
RETURN( aoBt )
//--------------------------------------------------------------------------------
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(oWnd:oWndClient:aWnd)
IF UPPER( oWnd:oWndClient:aWnd[i]:cCaption )=cTitle
lSuccess:=.t.
ENDIF
NEXT
RETURN lSuccess
//-------------------------------------------------------------------------------
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(oWnd:oWndClient:aWnd)
IF UPPER( oWnd:oWndClient:aWnd[i]:cCaption )=cTitle
oWnd:oWndClient:aWnd[i]:SetFocus()
lSuccess:=.t.
ENDIF
NEXT
RETURN lSuccess
//-----------------------------------------------------------------------------
FUNCTION ALINEAR_DERECHA(cTexto,oFont,oWnd,nTamano)
cTexto:=ALLTRIM(cTexto)
DO WHILE .T.
IF oWnd:GetWidth( cTexto ,oFont )<nTamano
cTexto:=" "+cTexto
ELSE
EXIT
ENDIF
ENDDO
RETURN(cTexto)