FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour ¿Es posible modificar el menú de un diálogo?
Posts: 728
Joined: Fri Oct 07, 2005 07:38 AM
¿Es posible modificar el menú de un diálogo?
Posted: Mon Dec 07, 2020 11:51 AM
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 (fw): Select all Collapse
// 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 :

Code (fw): Select all Collapse
oDlg:SetMenu ( oMenu )


Sin éxito.

¿Alguna idea?
Angel Salom
Visionwin Software - https://www.visionwin.com
------------------------------------------------------------
fwh 19.05 - harbour 3.2 - bcc 7.4
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: ¿Es posible modificar el menú de un diálogo?
Posted: Mon Dec 07, 2020 05:06 PM
Inclui esa posibilidad e incluso eliminar items
Code (fw): Select all Collapse
// ---------------------------------------------------------------------//
// 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

// ---------------------------------------------------------------------//
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 728
Joined: Fri Oct 07, 2005 07:38 AM
Re: ¿Es posible modificar el menú de un diálogo?
Posted: Mon Dec 07, 2020 05:44 PM
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!
Angel Salom
Visionwin Software - https://www.visionwin.com
------------------------------------------------------------
fwh 19.05 - harbour 3.2 - bcc 7.4
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: ¿Es posible modificar el menú de un diálogo?
Posted: Mon Dec 07, 2020 05:51 PM
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 (fw): Select all Collapse
#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
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 728
Joined: Fri Oct 07, 2005 07:38 AM
Re: ¿Es posible modificar el menú de un diálogo?
Posted: Mon Dec 07, 2020 06:33 PM

Perfecto, hago algunas pruebas y comento.

Angel Salom
Visionwin Software - https://www.visionwin.com
------------------------------------------------------------
fwh 19.05 - harbour 3.2 - bcc 7.4
Posts: 728
Joined: Fri Oct 07, 2005 07:38 AM
Re: ¿Es posible modificar el menú de un diálogo?
Posted: Fri Dec 11, 2020 09:06 AM
Pues funcionó perfecto, aquí el ejemplo que me facilitaste del menú y utilizando el DisableX

Code (fw): Select all Collapse
// ---------------------------------------------------------------------//
// 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.
Angel Salom
Visionwin Software - https://www.visionwin.com
------------------------------------------------------------
fwh 19.05 - harbour 3.2 - bcc 7.4
Posts: 728
Joined: Fri Oct 07, 2005 07:38 AM
Re: ¿Es posible modificar el menú de un diálogo?
Posted: Fri Dec 11, 2020 11:29 AM
Con el sistema de menús del que disponemos se pueden hacer cosas interesantes !!! :-) :-)

Angel Salom
Visionwin Software - https://www.visionwin.com
------------------------------------------------------------
fwh 19.05 - harbour 3.2 - bcc 7.4
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: ¿Es posible modificar el menú de un diálogo?
Posted: Fri Dec 11, 2020 04:33 PM

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

Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: ¿Es posible modificar el menú de un diálogo?
Posted: Sat Dec 26, 2020 09:56 PM
En la próxima versión, la barra del menú Bar, admite brush también
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces

Continue the discussion