Jump to content
Fivewin Brasil

SHOWMENU.PRG


kapiaba

Recommended Posts

// 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.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...