Jump to content
Fivewin Brasil

Desaparecimento do menu


Arthur Silvestre

Recommended Posts

Bom dia pessoal, tenho uma necessidade que é a seguinte: Quando clicar no menu ele não suma.

Uso a classe Tmenu() e como padrão e todos sabemos, sempre que eu clicar em item o menu some a ativa o bAction referente ao menuitem que você definiu.

Alguem sabe aonde está o comando para dar um 'hide()' no menu ? por que tudo deve ser programado inclusive isso. Ou alguem teria uma solução para sempre retornar o 'foco' no menuitem em q eu selecionei da ultima vez ?

Link to comment
Share on other sites

Testei, acho que até usei, mas não acho nenhuma referencia.

**-----------------------------------------------------------------------------**
** Finalidade : voltar o menu de onde foi chamado
**-----------------------------------------------------------------------------**
FUNCTION PCS_VoltaMenu( oM, nNiv )
#include "fivewin.ch"
#define KEYEVENTF_KEYUP 2
**-----------------------------------------------------------------------------**
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 :=VoltaMenu( 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 )
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"

Link to comment
Share on other sites

Testei, acho que até usei, mas não acho nenhuma referencia.

**-----------------------------------------------------------------------------**

** Finalidade : voltar o menu de onde foi chamado

**-----------------------------------------------------------------------------**

FUNCTION PCS_VoltaMenu( oM, nNiv )

#include "fivewin.ch"

#define KEYEVENTF_KEYUP 2

**-----------------------------------------------------------------------------**

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 :=VoltaMenu( 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 )

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"

Amigo, esses parametros oM e nNiv são referentes a que objetos ?

Link to comment
Share on other sites

É isso aí. Aqui o Menu é cadastrável, ou seja, montamos em tempo de execução de acordo com o cadastro dele (leitura em tabela)

Ao escolher um programa no MENU, salvamos que programa foi esse

depois em um LOOP, é usado os comando de Keybd_event para ir navegando até posicionar onde havia sido clicado antes da chamada do programa

a rotina aqui é muito particular pra postar tudo, mas é basicamente isso (difícil até eu entender sem uns debugs)

      If WX = 1
         Keybd_event(18,,0,0) //Foco no menu -- tecla menu
         Keybd_event( Asc(cLet),,0 ) //Tecla uma letra específica para posicionar no menu
         Keybd_event(32,,0) //space para "abrir"
         For WX2 = 1 to nPos
            Keybd_event(nLado,,0)
            Keybd_event(32,,0)
         Next
      Else
         nPos:= nBaixo(aAux[WX])
         For WX2 = 1 to (nPos-1)
            Keybd_event(40,,0) //tecla seta para baixo
            Keybd_event(32,,0) //space para abrir
         Next
         If empty(aAux[WX,1])
            Keybd_event(39,,0) //tecla seta para direita
            Keybd_event(32,,0) //space
         EndIf
      EndIf

Acho que com isso dá pra ter uma ideia que o negócio eh feita usando o teclado via programação ^^

não sei se ajudei ou se confundi mais

Link to comment
Share on other sites


#Include "FiveWin.Ch"

Function Main()

LOCAL oWnd

DEFINE WINDOW oWnd TITLE "Testando as Teclas - Caixa Alta e Baixa"

oWnd:bKeyDown = { | nKey | MsgInfo( "Caixa Baixa: " + Str( nKey ) ) }
oWnd:bKeyChar = { | nKey | MsgInfo( "Caixa Alta.: " + Str( nKey ) ) }

ACTIVATE WINDOW oWnd

Return Nil

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