Page 1 of 1
¿Es posible modificar el menú de un diálogo?
Posted: Mon Dec 07, 2020 11:51 am
by AngelSalom
Hola amigos, desde testdlg.prg en samples intenté modificar el menú del icono del diálogo pero no lo consigo :
Se trata de :
Sobre el ejemplo :
Code: Select all
// Our first DialogBox sample
#include "FiveWin.ch"
function Main()
local oDlg, oIco, cTest := "Hello world! "
DEFINE ICON oIco FILE "..\icons\fivewin.ico"
DEFINE DIALOG oDlg TITLE "I am a DialogBox" COLOR "W+/B" ;
ICON oIco
@ 1, 3 GET cTest
@ 3, 5 BUTTON "&Ok" SIZE 40, 12 ;
ACTION oDlg:Move (200,200) DEFAULT
@ 3, 16 BUTTON "&Cancel" SIZE 40, 12 ACTION oDlg:End()
ACTIVATE DIALOG oDlg CENTERED ;
VALID MsgYesNo( "Do you want to end ?" )
return nil
Traté con :
Sin éxito.
¿Alguna idea?
Re: ¿Es posible modificar el menú de un diálogo?
Posted: Mon Dec 07, 2020 5:06 pm
by cnavarro
Inclui esa posibilidad e incluso eliminar items
Code: Select all
// ---------------------------------------------------------------------//
// MNUNEW05.PRG
// Prueba de nuevas caracteristicas en menus
//
//
// ---------------------------------------------------------------------//
#include "Fivewin.ch"
Static oWnd
Static oFontMenu
Static oBr
Function Main()
Local cFont := "Segoe UI Symbol" //"Arial" //"Calibri"
Local cFontH := -14 //-10 //-12 //-16 //-18 //-20
Local oBar
Local cTitle
Local oIcon
local cBrush := "..\bitmaps\backgrnd\confetti.bmp"
local cVar1 := "中国版"
local nHt := 0
//local cVar := "தமிழ் (India)"
//local oGet
Fw_SetUnicode( .T. )
SetResDebug( .T. )
//? Len( cVar1 ), HB_UTF8LEN( cVar1 ), Len( cFont ), HB_UTF8LEN( cFont )
if !IsWin8() .and. !IsWindows10()
cFont := "Calibri"
endif
DEFINE BRUSH oBr FILE cBrush //RESIZE
DEFINE FONT oFontMenu NAME cFont SIZE 0, cFontH
DEFINE ICON oIcon FILE "..\icons\menu.ico"
cTitle := " Pruebas de Menus: Font - " + if( !Empty( oFontMenu ), oFontMenu:cFaceName, "" ) +;
if( !Empty( oFontMenu ), Str( oFontMenu:nHeight ), "" ) + " - Redefine SYSMENU - 5"
//? GetTextWidth( 0, cVar1, oFontMenu:hFont, @nHt ), GetTextWidthW( 0, cVar1, oFontMenu:hFont )
//? nHt, GetTextHeight( 0, cVar1, oFontMenu:hFont )
//DEFINE WINDOW oWnd FROM 3, 6 TO 30, 100 ; //MDI ;
DEFINE DIALOG oWnd FROM 3,6 TO 30, 100 ;
TITLE cTitle COLOR CLR_WHITE, METRO_OLIVE //VSCROLL
//oWnd:SetFont( oFontMenu )
oWnd:SetIcon( oIcon )
// @ 1, 2 GET oGet VAR cVar OF oWnd NOBORDER //PICTURE "@X"
// SET MESSAGE OF oWnd TO "Prueba de Controles" FONT oFontMenu ;
// COLORS CLR_WHITE, RGB( 116, 149, 193 ) ; //RGB( 31, 117, 70 ) ;
// NOINSET CLOCK DATE KEYBOARD NOBORDER
ACTIVATE DIALOG oWnd CENTERED ON INIT BuildMnu0()
//ACTIVATE WINDOW oWnd MAXIMIZED ON INIT BuildMnu0()
if !Empty( oFontMenu )
While oFontMenu:nCount > 0
oFontMenu:End()
Enddo
endif
RELEASE BRUSH oBr
oIcon:End()
if File( "checkres.txt" )
FErase( "checkres.txt" )
endif
CheckRes()
Return nil
// ---------------------------------------------------------------------//
Function BuildMnu0()
local oMnu
REDEFINE SYSMENU oMnu OF oWnd FONT oFontMenu //2007 //COLORS 2013
//IMGMENU "..\bitmaps\AlphaBmp\lock.bmp"
//BRUSH "..\bitmaps\backgrnd\confetti.bmp"
SEPARATOR
MENUITEM "SubMenu" CHARICON 57605
MENU 2007 //FONT oFontMenu COLORS //2013
MENUITEM "Segundo Item" CHARICON 57696
SEPARATOR
MENUITEM "Tercer Item" CHARICON 57736
ENDMENU
SEPARATOR
MENUITEM "தமிழ் (India)"
MENU // COLORS BRUSH "..\bitmaps\backgrnd\confetti.bmp"
//LOGOMENU "..\bitmaps\menu4v.bmp"
MENUITEM "FIVEDIT" SEPARATOR BOLD //RESOURCE "new16" BOLD
MENUITEM "Methods" HSYSBITMAP 32761
MENUITEM "Datas" HSYSBITMAP 32760
MENUITEM "Messages" HSYSBITMAP 32744
MENUITEM "Messages" HSYSBITMAP 32743
MENUITEM "ClassData" CHARICON "M"
//SEPARATOR
MENUITEM "SCINTILLA" SEPARATOR BREAK BOLD //RESOURCE "dupline16" BOLD
MENUITEM "Methods de Object" CHECKED //HSYSBITMAP 32738
MENUITEM "Datas Values" HSYSBITMAP 32739
MENUITEM "Messages Data" CHARICON 57731 //HSYSBITMAP 32740
MENUITEM "Messages Method" HSYSBITMAP 32741
MENUITEM "ClassData Object" HSYSBITMAP 32742
ENDMENU
SEPARATOR
MENUITEM "中国版 (China)" CHECKED
SEPARATOR
MENUITEM "&Reset Menu" ACTION oMnu:Reset()
ENDSYSMENU
Return oMnu
// ---------------------------------------------------------------------//
Re: ¿Es posible modificar el menú de un diálogo?
Posted: Mon Dec 07, 2020 5:44 pm
by AngelSalom
Excelente ejemplo Cristóbal como siempre.
Aunque observo que se añade el menú al ya existente del sistema , ¿es posible dejar únicamente el menú que definimos nosotros desde código?
Gracias!
Re: ¿Es posible modificar el menú de un diálogo?
Posted: Mon Dec 07, 2020 5:51 pm
by cnavarro
Si claro, juega un poco con esta function que te permite disable ( la X de cierre ) y eliminar items. Llamala antes de añadir tu systemmenu ( has de hacer una mezcla entre este ejemplo y el anterior ) o después, ves las posibilidades que tiene, y, por favor, pon después aquí tus conclusiones.
Ojo, el comportamiento de los sysmenus es distinto si se trata de dialogs o de windows creo recordar ( me refiero al orden en el que son guardados los items que ya trae por defecto )
Code: Select all
#include "FiveWin.ch"
#define MF_BYPOSITION 1024 // 0x0400
#define MF_DISABLED 2
Function Main()
Local oDlg, ;
lExit := .F.,;
oIcon
Define ICON oIcon FILE "..\ICONS\FiveWin.Ico"
Define Dialog oDlg Title "Test" ICON oIcon
@ 30, 10 Button "Exit" Of oDlg Size 30, 15 Pixel Action ( lExit := .T., oDlg:End() )
ACTIVATE Dialog oDlg Centered ON Init DisableX( oDlg, .T.) ;
Valid lExit
Return Nil
//----------------------------------------------------------------------------//
FUNCTION DisableX(oWin, lDisable)
LOCAL hMenu := 0
LOCAL nCount := 0
DEFAULT lDisable := .T.
IF lDisable
hMenu = GetSystemMenu(oWin:hWnd, .F.)
nCount = GetMItemCount(hMenu)
? nCount
IF oWin:ClassName() = "TDIALOG"
//RemoveMenu(hMenu, 1, nOR( MF_BYPOSITION, MF_DISABLED) )
//RemoveMenu(hMenu, 1, nOR( MF_BYPOSITION, 0 ) )
RemoveMenu(hMenu, 0, nOR( MF_BYPOSITION, 0 ) )
RemoveMenu(hMenu, 0, nOR( MF_BYPOSITION, 0 ) )
//RemoveMenu(hMenu, 2, nOR( MF_BYPOSITION, MF_DISABLED) )
//RemoveMenu(hMenu, 0, nOR( MF_BYPOSITION, MF_DISABLED) )
ELSE
RemoveMenu(hMenu, nCount - 1, nOR( MF_BYPOSITION, MF_DISABLED) )
RemoveMenu(hMenu, nCount - 2, nOR( MF_BYPOSITION, MF_DISABLED) )
ENDIF
ELSE
GetSystemMenu( oWin:hWnd, .T. )
ENDIF
RETURN nil
Re: ¿Es posible modificar el menú de un diálogo?
Posted: Mon Dec 07, 2020 6:33 pm
by AngelSalom
Perfecto, hago algunas pruebas y comento.
Re: ¿Es posible modificar el menú de un diálogo?
Posted: Fri Dec 11, 2020 9:06 am
by AngelSalom
Pues funcionó perfecto, aquí el ejemplo que me facilitaste del menú y utilizando el DisableX
Code: Select all
// ---------------------------------------------------------------------//
// MNUNEW05.PRG
// Prueba de nuevas caracteristicas en menus
//
//
// ---------------------------------------------------------------------//
#include "Fivewin.ch"
#define MF_BYPOSITION 1024 // 0x0400
#define MF_DISABLED 2
Static oWnd
Static oFontMenu
Static oBr
Function Main()
Local cFont := "Segoe UI Symbol"
Local cFontH := -14
Local oBar
Local cTitle
Local oIcon
local cVar1 := "中国版"
local nHt := 0
Fw_SetUnicode( .T. )
SetResDebug( .T. )
if !IsWin8() .and. !IsWindows10()
cFont := "Calibri"
endif
DEFINE FONT oFontMenu NAME cFont SIZE 0, cFontH
DEFINE ICON oIcon FILE "..\icons\menu.ico"
cTitle := " Pruebas de Menus: Font - " + if( !Empty( oFontMenu ), oFontMenu:cFaceName, "" ) +;
if( !Empty( oFontMenu ), Str( oFontMenu:nHeight ), "" ) + " - Redefine SYSMENU - 5"
DEFINE DIALOG oWnd FROM 3,6 TO 30, 100 ;
TITLE cTitle COLOR CLR_WHITE, METRO_OLIVE
oWnd:SetIcon( oIcon )
ACTIVATE DIALOG oWnd CENTERED ON INIT ( DisableX( oWnd, .T.) , BuildMnu0() )
if !Empty( oFontMenu )
While oFontMenu:nCount > 0
oFontMenu:End()
Enddo
endif
RELEASE BRUSH oBr
oIcon:End()
if File( "checkres.txt" )
FErase( "checkres.txt" )
endif
CheckRes()
Return nil
// ---------------------------------------------------------------------//
Function BuildMnu0()
local oMnu
REDEFINE SYSMENU oMnu OF oWnd FONT oFontMenu
SEPARATOR
MENUITEM "SubMenu" CHARICON 57605
MENU 2007
MENUITEM "Segundo Item" CHARICON 57696
SEPARATOR
MENUITEM "Tercer Item" CHARICON 57736
ENDMENU
SEPARATOR
MENUITEM "தமிழ் (India)"
MENU
MENUITEM "FIVEDIT" SEPARATOR BOLD
MENUITEM "Methods" HSYSBITMAP 32761
MENUITEM "Datas" HSYSBITMAP 32760
MENUITEM "Messages" HSYSBITMAP 32744
MENUITEM "Messages" HSYSBITMAP 32743
MENUITEM "ClassData" CHARICON "M"
MENUITEM "SCINTILLA" SEPARATOR BREAK BOLD
MENUITEM "Methods de Object" CHECKED
MENUITEM "Datas Values" HSYSBITMAP 32739
MENUITEM "Messages Data" CHARICON 57731
MENUITEM "Messages Method" HSYSBITMAP 32741
MENUITEM "ClassData Object" HSYSBITMAP 32742
ENDMENU
SEPARATOR
MENUITEM "中国版 (China)" CHECKED
SEPARATOR
MENUITEM "&Reset Menu" ACTION oMnu:Reset()
ENDSYSMENU
Return oMnu
// ---------------------------------------------------------------------//
FUNCTION DisableX(oWin, lDisable)
LOCAL hMenu := 0
LOCAL nCount := 0
DEFAULT lDisable := .T.
IF lDisable
hMenu = GetSystemMenu(oWin:hWnd, .F.)
nCount = GetMItemCount(hMenu)
? nCount
IF oWin:ClassName() = "TDIALOG"
RemoveMenu(hMenu, 0, nOR( MF_BYPOSITION, 0 ) )
RemoveMenu(hMenu, 0, nOR( MF_BYPOSITION, 0 ) )
ELSE
RemoveMenu(hMenu, nCount - 1, nOR( MF_BYPOSITION, MF_DISABLED) )
RemoveMenu(hMenu, nCount - 2, nOR( MF_BYPOSITION, MF_DISABLED) )
ENDIF
ELSE
GetSystemMenu( oWin:hWnd, .T. )
ENDIF
RETURN nil
Se consigue un menú de sistema totalmente personalizado, fabuloso Cristóbal, gracias.
Re: ¿Es posible modificar el menú de un diálogo?
Posted: Fri Dec 11, 2020 11:29 am
by AngelSalom
Re: ¿Es posible modificar el menú de un diálogo?
Posted: Fri Dec 11, 2020 4:33 pm
by cnavarro
Aqui puedes ver la información necesaria ( hay en esta pagina un ejemplo especialmente significativo: no dejes de ver y probar el ejemplo MNUSELECT.PRG )
http://wiki.fivetechsoft.com/doku.php?i ... ldown_menu
Re: ¿Es posible modificar el menú de un diálogo?
Posted: Sat Dec 26, 2020 9:56 pm
by cnavarro
En la próxima versión, la barra del menú Bar, admite brush también