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