Buenas tardes Leandro ( y buenas tardes a todos )

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
Menu.prg
Y como final el include MdiChildFolder.ch utilizado
P.d.: Se aceptan sugerencias, ideas .....

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
#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
#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)# 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)>) ] )Jes煤s Mar铆n
deumare@gmail.com
deumare@gmail.com

