He convertido las funciones en una clase llamada TMdiChildFolder, que se apoya en otra TBtnBmpFolder.
Incluyo ahora los dos .prg de lo que se muestra en el video.
1) Se crea la base del programa. Ventana principal
2) Las tres opciones de menu. Ventana MDI, Ventana MDI con Icono, Ventana Mdi con icono, barra de herramientas..
La única diferencia sobre la programación en MDICHILD tradicional es que en vez de poner :
DEFINE WINDOW MDICHILD oMDI OF ....
tienes que poner
DEFINE WINDOW MDICHILDFOLDER oMDI OF ....
Tengo algunas ideas para añadir, como poner un boton [x] para cerrar una ventana al pasar el ratón por cada pestaña y que desaparezca al salir el ratón de la pestaña. [ LO EDITO ] Ya funciona, al pasar el ratón por la solapa de la ventana activa aparece el boton cerrar.
Probar abrir 100 ventanas, para ver la carga de memoria, etc.... [ LO EDITO : He abierto multiples ventanas. Al parecer a las 90 ventanas, se cae. Lo miraré ]
También poner todas las imagenes en una DLL (a ver si algún buen samaritano me puede guiar de la mano para hacerlo).
En fin, falta probarlo, logicamente y depurar código.
Me gustaría publicarlo, si os parece bién, una vez lo prueben dos o tres de vosotros.
LOS PRG`s DEL VIDEO :
TestMdiFolder.prg
- Code: Select all Expand view RUN
- #include "Fivewin.ch"
STATIC oWnd
function Main()
errorsys()
SetHandleCount(80)
SET DATE TO ITALIAN
SET CENTURY ON
SET EPOCH TO 2000
SET DECIMALS TO 2
SET DATE FORMAT "dd/mm/yyyy"
DEFINE WINDOW oWnd PIXEL MDI STYLE nOR( WS_POPUP, WS_BORDER )
ACTIVATE WINDOW oWnd ON INIT ( My_maximized(oWnd) , Menu(oWnd) ) ;
VALID MsgNoYes("Desea cerrar el programa","Atención")
RETURN(NIL)
// ESTA FUNCION MAXIMIZA LA VENTANA PERO TENIENDO EN CUENTA DONDE ESTA LA BARRA DE WINDOWS
FUNCTION My_maximized(oWnd)
Local aCoors := GetCoors( FindWindow("Shell_TrayWnd","") )
oWnd:Move(0,0,aCoors[4],aCoors[1],.t.)
RETURN(NIL)
Menu.prg
- Code: Select all Expand view RUN
- #include "Fivewin.ch"
#include "MdiChildFolder.ch"
//-----------------------------------------------------------------------------
FUNCTION MENU(oWndPrincipal)
LOCAL oWnd
local oBt1, oBt2, oBt3
DEFINE WINDOW MDICHILDFOLDER oWnd OF oWndPrincipal TITLE "Menu"
@100,80 BTNBMP oBt1 PROMPT "Abrir MDI Folder" of oWnd SIZE 200,100 ACTION NUEVAMDI(oWndPrincipal)
oBt1:SetColor( CLR_WHITE, CLR_BLUE)
@200,80 btnbmp oBt2 PROMPT "Abrir MDI Folder con Icono" OF oWnd SIZE 200,100 ACTION NUEVAMDI_ICONO(oWndPrincipal)
oBt2:SetColor( CLR_WHITE, CLR_RED)
@300,80 btnbmp oBt3 PROMPT "Abrir MDI Folder con ButtonBar" OF oWnd SIZE 200,100 ACTION NUEVAMDI_BAR(oWndPrincipal)
oBt3:SetColor( CLR_WHITE, CLR_GREEN)
ACTIVATE WINDOW oWnd
return nil
FUNCTION NUEVAMDI(oWndPrincipal)
LOCAL oMDI, oFont, oSay
LOCAL oIco
LOCAL aBtn[5]
DEFINE FONT oFont NAME "Segoe UI Light" SIZE 0,-80 BOLD
DEFINE WINDOW MDICHILDFOLDER oMDI OF oWndPrincipal TITLE "MDI"
// PODEMOS COLOCAR NUESTROS CONTROLES A PARTIR DE LA FILA 40
@43,005 BTNBMP aBtn[1] OF oMDI FILE "W11_CLOSE.bmp" SIZE 30,30 ACTION oMdi:End() NOBORDER
aBtn[1]:cToolTip="Cerrar ventana"
@42,040 IMAGE FILE "SEPARADOR.JPG" SIZE 1,33 OF oMdi PIXEL NOBORDER
@43,045 BTNBMP aBtn[2] FILE "W11_GO_FIRST.BMP" SIZE 30,30 OF oMDI UPDATE NOBORDER //ACTION GoToMenu(oBar22)
aBtn[2]:bAction := { || oMdi:GoToMenu() }
aBtn[2]:cToolTip="Solapa Menú"
aBtn[2]:nClrPane := RGB(240,240,240)
@43,075 BTNBMP aBtn[3] FILE "W11_SELECT.BMP" SIZE 30,30 OF oMDI UPDATE NOBORDER //ACTION MenuFolders(oWNDC)
aBtn[3]:bAction := { || oMdi:MenuFolders() }
aBtn[3]:cToolTip="Seleccionar ventana"
aBtn[3]:nClrPane := RGB(240,240,240)
@43,105 BTNBMP aBtn[4] FILE "W11_MDI_LEFT.BMP" SIZE 30,30 OF oMDI UPDATE NOBORDER //ACTION MenuFolders(oWNDC)
aBtn[4]:bACTION := { || oMdi:Mover_Ventanas_no_visibles(-1) }
aBtn[4]:cToolTip="Mover solapas a la izquierda"
aBtn[4]:nClrPane := RGB(240,240,240)
@43,135 BTNBMP aBtn[5] FILE "W11_MDI_RIGHT.BMP" SIZE 30,30 OF oMDI UPDATE NOBORDER //ACTION MenuFolders(oWNDC)
aBtn[5]:bACTION := { || oMdi:Mover_Ventanas_no_visibles(1) }
aBtn[5]:cToolTip="Mover solapas a la derecha"
aBtn[5]:nClrPane := RGB(240,240,240)
@42,165 IMAGE FILE "SEPARADOR.JPG" SIZE 1,33 OF oMDI PIXEL NOBORDER
@180,1 SAY oSay prompt "I'M "+oMdi:cCaption SIZE 1350,400 COLOR CLR_BLUE pixel FONT oFont CENTER
ACTIVATE WINDOW oMDI ON PAINT (oSay:nWidth:=oMdi:nWidth, oSay:Refresh() )
return nil
//-----------------------------------------------------------------------------
FUNCTION NUEVAMDI_ICONO(oWndPrincipal)
LOCAL oMDI, oFont, oSay
LOCAL oIco
LOCAL aBtn[5]
DEFINE FONT oFont NAME "Segoe UI Light" SIZE 0,-80 BOLD
DEFINE WINDOW MDICHILDFOLDER oMDI OF oWndPrincipal TITLE "Clientes" ICON "W11_CLIENTES.BMP"
// PODEMOS COLOCAR NUESTROS CONTROLES A PARTIR DE LA FILA 40
@43,005 BTNBMP aBtn[1] OF oMDI FILE "W11_CLOSE.bmp" SIZE 30,30 ACTION oMdi:End() NOBORDER
aBtn[1]:cToolTip="Cerrar ventana"
@42,040 IMAGE FILE "SEPARADOR.JPG" SIZE 1,33 OF oMdi PIXEL NOBORDER
@43,045 BTNBMP aBtn[2] FILE "W11_GO_FIRST.BMP" SIZE 30,30 OF oMDI UPDATE NOBORDER //ACTION GoToMenu(oBar22)
aBtn[2]:bAction := { || oMdi:GoToMenu() }
aBtn[2]:cToolTip="Solapa Menú"
aBtn[2]:nClrPane := RGB(240,240,240)
@43,075 BTNBMP aBtn[3] FILE "W11_SELECT.BMP" SIZE 30,30 OF oMDI UPDATE NOBORDER //ACTION MenuFolders(oWNDC)
aBtn[3]:bAction := { || oMdi:MenuFolders() }
aBtn[3]:cToolTip="Seleccionar ventana"
aBtn[3]:nClrPane := RGB(240,240,240)
@43,105 BTNBMP aBtn[4] FILE "W11_MDI_LEFT.BMP" SIZE 30,30 OF oMDI UPDATE NOBORDER //ACTION MenuFolders(oWNDC)
aBtn[4]:bACTION := { || oMdi:Mover_Ventanas_no_visibles(-1) }
aBtn[4]:cToolTip="Mover solapas a la izquierda"
aBtn[4]:nClrPane := RGB(240,240,240)
@43,135 BTNBMP aBtn[5] FILE "W11_MDI_RIGHT.BMP" SIZE 30,30 OF oMDI UPDATE NOBORDER //ACTION MenuFolders(oWNDC)
aBtn[5]:bACTION := { || oMdi:Mover_Ventanas_no_visibles(1) }
aBtn[5]:cToolTip="Mover solapas a la derecha"
aBtn[5]:nClrPane := RGB(240,240,240)
@42,165 IMAGE FILE "SEPARADOR.JPG" SIZE 1,33 OF oMDI PIXEL NOBORDER
@180,1 SAY oSay prompt "I'M "+oMdi:cCaption+CRLF+" with Icon" SIZE 1350,400 COLOR CLR_BLUE pixel FONT oFont CENTER
ACTIVATE WINDOW oMDI ON PAINT (oSay:nWidth:=oMdi:nWidth, oSay:Refresh() )
return nil
//-----------------------------------------------------------------------------
FUNCTION NUEVAMDI_BAR(oWndPrincipal)
LOCAL oMDI, oFont, oSay
LOCAL oIco
LOCAL aBtn[5]
LOCAL oBar
DEFINE FONT oFont NAME "Segoe UI Light" SIZE 0,-80 BOLD
DEFINE WINDOW MDICHILDFOLDER oMDI OF oWndPrincipal TITLE "Clientes" ICON "W11_CLIENTES.BMP"
@40,1 BUTTONBAR oBar SIZE 1400,40 OF oMdi
oBar:SetColor( CLR_BLACK, RGB(240,240,240) )
// PODEMOS COLOCAR NUESTROS CONTROLES EN EL BUTTONBAR
@3,005 BTNBMP aBtn[1] OF oBar FILE "W11_CLOSE.bmp" SIZE 30,30 ACTION oMdi:End() NOBORDER
aBtn[1]:cToolTip="Cerrar ventana"
@2,040 IMAGE FILE "SEPARADOR.JPG" SIZE 1,33 OF oBar PIXEL NOBORDER
@3,045 BTNBMP aBtn[2] FILE "W11_GO_FIRST.BMP" SIZE 30,30 OF oBar UPDATE NOBORDER //ACTION GoToMenu(oBar22)
aBtn[2]:bAction := { || oMdi:GoToMenu() }
aBtn[2]:cToolTip="Solapa Menú"
aBtn[2]:nClrPane := RGB(240,240,240)
@3,075 BTNBMP aBtn[3] FILE "W11_SELECT.BMP" SIZE 30,30 OF oBar UPDATE NOBORDER //ACTION MenuFolders(oWNDC)
aBtn[3]:bAction := { || oMdi:MenuFolders() }
aBtn[3]:cToolTip="Seleccionar ventana"
aBtn[3]:nClrPane := RGB(240,240,240)
@3,105 BTNBMP aBtn[4] FILE "W11_MDI_LEFT.BMP" SIZE 30,30 OF oBar UPDATE NOBORDER //ACTION MenuFolders(oWNDC)
aBtn[4]:bACTION := { || oMdi:Mover_Ventanas_no_visibles(-1) }
aBtn[4]:cToolTip="Mover solapas a la izquierda"
aBtn[4]:nClrPane := RGB(240,240,240)
@3,135 BTNBMP aBtn[5] FILE "W11_MDI_RIGHT.BMP" SIZE 30,30 OF oBar UPDATE NOBORDER //ACTION MenuFolders(oWNDC)
aBtn[5]:bACTION := { || oMdi:Mover_Ventanas_no_visibles(1) }
aBtn[5]:cToolTip="Mover solapas a la derecha"
aBtn[5]:nClrPane := RGB(240,240,240)
@2,165 IMAGE FILE "SEPARADOR.JPG" SIZE 1,33 OF oBar PIXEL NOBORDER
@180,1 SAY oSay prompt "I'M "+oMdi:cCaption+CRLF+"with Icon ..."+CRLF+"and.. Fivewin ButtonBar" SIZE 1350,400 COLOR CLR_BLUE pixel FONT oFont CENTER
@100,10 BTNBMP PROMPT "Abrir dialogo" OF oMdi SIZE 100,25 ACTION DIALOGO(oMdi)
ACTIVATE WINDOW oMDI ON PAINT (oSay:nWidth:=oMdi:nWidth, oSay:Refresh() )
return nil
STATIC FUNCTION DIALOGO(oMdi)
Local oDlg
DEFINE DIALOG oDlg TITLE "Test ...." FROM 100,100 TO 400,400 OF oMdi PIXEL
@ 50,60 SAY "I`m a Dialog" OF oDlg PIXEL
@120,10 BUTTON "Close" of oDlg SIZE 80,20 ACTION oDlg:End() PIXEL
ACTIVATE DIALOG oDlg CENTER
RETURN(NIL)
Y como final el include MdiChildFolder.ch utilizado
- Code: Select all Expand view RUN
- # include "fivewin.ch"
#xcommand DEFINE WINDOW MDICHILDFOLDER [<oWnd>] ;
[ MDICHILD ] ;
[ FROM <nTop>, <nLeft> TO <nBottom>, <nRight> ] ;
[ TITLE <cTitle> ] ;
[ BRUSH <oBrush> ] ;
[ CURSOR <oCursor> ] ;
[ MENU <oMenu> ] ;
[ MENUINFO <nMenuInfo> ] ;
[ ICON <oIco> ] ;
[ OF <oParent> ] ;
[ <vscroll: VSCROLL, VERTICAL SCROLL> ] ;
[ <hscroll: HSCROLL, HORIZONTAL SCROLL> ] ;
[ <color: COLOR, COLORS> <nClrFore> [,<nClrBack>] ] ;
[ <pixel: PIXEL> ] ;
[ STYLE <nStyle> ] ;
[ <HelpId: HELPID, HELP ID> <nHelpId> ] ;
[ BORDER <border: NONE, SINGLE> ] ;
[ <NoSysMenu: NOSYSMENU, NO SYSMENU> ] ;
[ <NoCaption: NOCAPTION, NO CAPTION, NO TITLE> ] ;
[ <NoIconize: NOICONIZE, NOMINIMIZE> ] ;
[ <NoMaximize: NOZOOM, NO ZOOM, NOMAXIMIZE, NO MAXIMIZE> ] ;
=> ;
[<oWnd> := ] TMdiChildFolder():New( <nTop>, <nLeft>, <nBottom>, <nRight>,;
<cTitle>, <nStyle>, <oMenu>, <oParent>, <oIco>, <.vscroll.>, <nClrFore>,;
<nClrBack>, <oCursor>, <oBrush>, <.pixel.>, <.hscroll.>,;
<nHelpId>, [Upper(<(border)>)], !<.NoSysMenu.>, !<.NoCaption.>,;
!<.NoIconize.>, !<.NoMaximize.>, [<nMenuInfo>] )
#xcommand @ <nRow>, <nCol> BTNBMPFOLDER [<oBtn>] ;
[ <resource: NAME, RESNAME, RESOURCE> <cResName1> ;
[,<cResName2>[,<cResName3>] ] ] ;
[ <file: FILE, FILENAME, DISK> <cBmpFile1> ;
[,<cBmpFile2>[,<cBmpFile3>] ] ] ;
[ SIZE <nWidth>, <nHeight> ] ;
[ ACTION <uAction,...> ] ;
[ <of:OF, WINDOW, DIALOG> <oWnd> ] ;
[ MESSAGE <cMsg> ] ;
[ WHEN <uWhen> ] ;
[ <adjust: ADJUST> ] ;
[ <lUpdate: UPDATE> ] ;
[ PROMPT <cPrompt> ] ;
[ FONT <oFont> ] ;
[ <lNoBorder: NOBORDER> ] ;
[ <layout: CENTER, TOP, LEFT, BOTTOM, RIGHT> ] ;
=> ;
[ <oBtn> := ] TBtnBmpFolder():New( <nRow>, <nCol>, <nWidth>, <nHeight>,;
<cResName1>, <cResName2>, <cBmpFile1>, <cBmpFile2>,;
[{|Self|<uAction>}], <oWnd>, <cMsg>, <{uWhen}>, <.adjust.>,;
<.lUpdate.>, <cPrompt>, <oFont>, [<cResName3>], [<cBmpFile3>],;
!<.lNoBorder.>, [ Upper(<(layout)>) ] )
P.d.: Se aceptan sugerencias, ideas .....