ShowMenu.prg

ShowMenu.prg

Postby karinha » Tue Dec 21, 2021 1:10 pm

Code: Select all  Expand view

// ShowMenu.prg

// Montagem e controle de menus.

#Include "FiveWin.ch"

#define KEYEVENTF_KEYUP 2

MEMVAR oWnd

FUNCTION Main()

   PRIVATE oWnd

   DEFINE WINDOW oWnd TITLE "Teste de ShowMenu()" MDI FROM 0, 0 TO 15, 80    ;
      MENU MenuGer()

   ACTIVATE WINDOW oWnd CENTERED

RETURN NIL
// ** * Fim de Main() = Teste.

STATIC FUNCTION SuaAcao()

   MsgInfo( "Estou em " + oWnd:oMenu:LastItem():cPrompt )

   ShowMenu()

RETURN NIL
// ** * Fim de SuaAcao = Teste.

// Recupera mensagens dos itens do menu do resource/stringable.
STATIC FUNCTION MenuGer()

   LOCAL oMnu

   MENU oMnu
      MENUITEM "SubMenu 1"

      MENU
         MENUITEM "Item 1.1" ACTION SuaAcao()
         MENUITEM "Item 1.2" ACTION SuaAcao()
         SEPARATOR
         MENUITEM "Item 1.3" ACTION SuaAcao()
         MENUITEM "SubMenu 1.1"

         MENU
            MENUITEM "Item 1.1.1" ACTION SuaAcao()
            MENUITEM "Item 1.1.2" ACTION SuaAcao()
            MENUITEM "Item 1.1.3" ACTION SuaAcao()
            MENUITEM "Item 1.1.4" ACTION SuaAcao()
         ENDMENU

         SEPARATOR
         MENUITEM "Item 1.4" ACTION SuaAcao()
      ENDMENU

      SEPARATOR
      MENUITEM "Item 1" ACTION SuaAcao()
      MENUITEM "SubMenu 2"

      MENU
         MENUITEM "Item 2.1" ACTION SuaAcao()
         SEPARATOR
         MENUITEM "Item 2.2" ACTION SuaAcao()
         MENUITEM "SubMenu 2.1"

         MENU
         MENUITEM "Item 2.1.1" ACTION SuaAcao()
         MENUITEM "Item 2.1.2" ACTION SuaAcao()
         MENUITEM "SubMenu 2.1.1"

         MENU
         MENUITEM "Item 2.1.1.1" ACTION SuaAcao()
         MENUITEM "Item 2.1.1.2" ACTION SuaAcao()

            SEPARATOR
            MENUITEM "Item 2.1.1.3" ACTION SuaAcao()
            MENUITEM "Item 2.1.1.4" ACTION SuaAcao()
         ENDMENU

         MENUITEM "Item 2.1.3" ACTION SuaAcao()
            MENUITEM "Item 2.1.4" ACTION SuaAcao()

         ENDMENU

         MENUITEM "Item 2.3" ACTION SuaAcao()

         SEPARATOR
         MENUITEM "SubMenu 2.2"
         MENU
            MENUITEM "Item 2.2.1" ACTION SuaAcao()
            MENUITEM "Item 2.2.2" ACTION SuaAcao()
            MENUITEM "Item 2.2.3" ACTION SuaAcao()
            MENUITEM "Item 2.2.4" ACTION SuaAcao()

         ENDMENU

         MENUITEM "Item 2.4" ACTION SuaAcao()

      ENDMENU

   ENDMENU

RETURN oMnu
// ** * Fim de MenuGer( oM ) = Teste.

// -----------------------------------------------------------------------------
// Reabre o menu que chamou uma rotina.
// 1§ Descobre o caminho para se chegar ate oM:LastItem()
// 2§ Abre o menu simulando a tecla Alt e, em seguida, a
// sequencia de setas para chegar ate oM:LastItem()

FUNCTION ShowMenu( oM, nNiv )

   LOCAL nItem, oLItM, cMov := "", cMv, nChr

   DEFAULT oM := WndMain():oMenu
   DEFAULT nNiv := 0

   oLItM := oM:LastItem()

   FOR nItem := 1 TO Len( oM:aItems )

      IF ValType( oM:aItems[ nItem ]:bAction ) = 'O'

         cMv := ShowMenu( oM:aItems[ nItem ]:bAction, nNiv + 1 )

         IF Right( cMv, 1 ) == "x"

            cMov += Chr( if( nNiv = 0, VK_DOWN, VK_RIGHT ) ) + cMv

            IF nNiv == 0

               cMov := Left( cMov, Len( cMov ) - 1 )

               // MsgInfo( StrTran( StrTran( cMov,Chr(VK_DOWN),"V" ), Chr(VK_RIGHT), ">" ) )

               keybd_event( VK_MENU, 0, 0, 0 )
               keybd_event( VK_MENU, 0, KEYEVENTF_KEYUP, 0 )

               FOR nChr := 1 TO Len( cMov )

                  keybd_event( Asc( SubStr( cMov, nChr, 1 ) ), 0, 0, 0 )
                  keybd_event( Asc( SubStr( cMov, nChr, 1 ) ), 0, KEYEVENTF_KEYUP, 0 )

               NEXT

               RETURN .T.

            ENDIF

            RETURN cMov

         ENDIF

      ELSE

         IF oM:aItems[ nItem ]:nId == oLItM:nId
            RETURN cMov + "x"
         ENDIF

      ENDIF

      IF !Empt( oM:aItems[ nItem ]:cPrompt ) // se não for um separador
         cMov += Chr( if( nNiv = 0, VK_RIGHT, VK_DOWN ) )
      ENDIF

   NEXT

RETURN if( nNiv == 0, .F., "" )
// **

// ***********************************************************
DLL32 FUNCTION keybd_event( bVk as _INT, bScan as _INT, dwFlags ;
      as LONG, dwExtraInfo as LONG ) AS LONG PASCAL LIB "user32.dll"
// ***********************************************************

// -----------------------------------------------------------------------------
// ****   Fim de ShowMenu.prg
 


Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7664
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: ShowMenu.prg

Postby cnavarro » Tue Dec 21, 2021 8:36 pm

Muy bueno Joao, gracias
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
User avatar
cnavarro
 
Posts: 6531
Joined: Wed Feb 15, 2012 8:25 pm
Location: España


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 39 guests