Buenos dias Leandro.
Te adjunto el .prg con algunas mejoras.
1) ahora no es necesario crear los botones en la ventana MDI. Al pintarse la ventana, si no existe, los crea.
2) Se han añadido imagenes (boton rojo y verde) para que se aprecie mejor que ventana está activa.
3) Otras mejoras menores.
4) He puesto el menu MDI de la ventana principal para que veas que se integra perfectamente.
Code: Select all | Expand
#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)