kapiaba Posted December 21, 2021 Report Share Posted December 21, 2021 // 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. toya 1 Quote Link to comment Share on other sites More sharing options...
Ladinilson Posted December 21, 2021 Report Share Posted December 21, 2021 Tens a imagem Kapi para vermos como fica? Quote Link to comment Share on other sites More sharing options...
kapiaba Posted December 21, 2021 Author Report Share Posted December 21, 2021 Oi? É só compilar. BUILDX SHOWMENU. Abs. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.