Tentando fazer um primeiro menu com WVW

Outras bibliotecas visuais e IDEs para Harbour/xHarbour (xHGTK/HbWxW/GtWvT/GtWvW/WvWtools.etc)

Moderador: Moderadores

Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

Tentando fazer um primeiro menu com WVW

Mensagem por Mário Isa »

Alo Galera,
Consegui finalmente compilar um programinha com a WVW /

Agora prá entender os menus vamos lá :

tenho um exemplo aqui ....
hMenu = WVW_CreateMenu( )
hPopupMenu = WVW_CreateMenu( )
WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_DEMO_GET, "~GET demo" )
WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_DEMO_BROWSE, "~BROWSE demo" )
WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_DEMO_CONSOLE, "~CONSOLE demo (F3)" )
//WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_DEMO_COLOR, "~COLOR demo" )
WVW_AppendMenu( hPopupMenu, MF_SEPARATOR )
WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_DEMO_EXIT, "E~xit" )
WVW_AppendMenu( hMenu , MF_ENABLED + MF_POPUP , hPopupMenu , "~Demos", )

hPopupMenu = WVW_CreateMenu( )
WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_TOOLBAR_ENABLE, "~Enable Toolbar" )
WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_TOOLBAR_DISABLE, "~Disable Toolbar" )
WVW_AppendMenu( hPopupMenu, MF_SEPARATOR )
WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_TOOLBAR_RESET, "~Reset Toolbar" )
WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_TOOLBAR_DELETE, "~Delete Toolbar" )
WVW_AppendMenu( hMenu , MF_ENABLED + MF_POPUP , hPopupMenu , "~Toolbar", )

hPopupMenu = WVW_CreateMenu( )
WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_WINDOW_SPACING_DECREASE, "~Decrease Line Spacing (F9)" )
WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_WINDOW_SPACING_INCREASE, "~Increase Line Spacing (F10)" )
WVW_AppendMenu( hPopupMenu, MF_SEPARATOR )
WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_WINDOW_SPACING_DEFAULT, "~Set As Default Line Spacing (F11)" )
WVW_AppendMenu( hMenu , MF_ENABLED + MF_POPUP , hPopupMenu , "~Window", )

hPopupMenu = WVW_CreateMenu( )
WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_HELP_HELP, "~Help (F1)" )
WVW_AppendMenu( hPopupMenu, MF_SEPARATOR )
WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_HELP_INFO, "~Info (F2)" )
WVW_AppendMenu( hMenu , MF_ENABLED + MF_POPUP , hPopupMenu , "~Help", )

WVW_SetMenu(, hMenu )

* end menu definitions *************************************
Deixa ver se entendi:

Aqui:
hMenu = WVW_CreateMenu( )
Ele está dando origem ao um menu (que deve ser o principal)

Aqui :
hPopupMenu = WVW_CreateMenu( )
Ele deve estar dando origem a um sub-menu (ou a um menu pop-up?) mas isso não seria só quando clicasse com o outro botão do mouse?

Aqui:
WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_DEMO_GET, "~GET demo" )
Ele está inserindo uma opção dentro do menu secundário hPopupMenu

E aqui:
WVW_AppendMenu( hMenu , MF_ENABLED + MF_POPUP , hPopupMenu , "~Demos", )
Ele deve estar inserindo uma opção dentro do menu primário.

Mas, logo em seguida, ele repete novamente:
hPopupMenu = WVW_CreateMenu( )
Então ele está inserindo novas opções dentro do mesmo hPopupMenu ?
Ele não deveria pegar uma outra variável tipo hPopupMenu1 ou 2 ou 3 e assim sucessivamente?

Depois de tudo, no final ele faz:
WVW_SetMenu(, hMenu )
Isso deve ser prá finalizar o menu....

Mas cadê as instruções para falar qual função que ele vai executar quando o usuário escolher por exemplo:
Console Demo ?? que função ele vai executar? onde eu entro com isso?

Vamos rever a montagem do menu para esta opção então:
WVW_AppendMenu( hPopupMenu, MF_ENABLED + MF_STRING, IDM_DEMO_CONSOLE, "~CONSOLE demo (F3)" )
Vejamos

WVW_AppendMenu( hPopupMenu, (esta é a variável do menu)
MF_ENABLE + (isso eu nem sei ainda de onde veio)
MF_STRING (isso eu também ainda vou tentar descobrir)
IDM_DEMO_CONSOLE, (isso é um número que ele definiu lá atrás)
"~Console demo (F3)" (Isso é o string que vai aparecer no menu)


e pronto! Onde está o action(algumacoisa()) ?? prá ele executar a função?

Por enquanto é esta dúvida:

Obrigado
Mário
Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

Re: Tentando fazer um primeiro menu com WVW

Mensagem por Mário Isa »

Bom / este .prg q estou falando é o
WVWTEST9.PRG

Eu acabei descobrindo como é que ele faz:


Neste pedacinho aqui:

Código: Selecionar todos

.
.
.

  SETINKEYAFTERBLOCK({|nkey| nAfterInkey(nkey)})
   WVW_SETMOUSEMOVE(,.t.)                           //required by wvwmouse
   kF1 := SetKey( K_F1, {|| xHelp() } )
   kF2 := SetKey( K_F2, {|| xDebugInfo() } )
   kF3 := SetKey( K_F3, {|| Demo_Console() } )

   kF9 := SetKey( K_F9, {|| WVW_SetLineSpacing(NIL, WVW_SetLineSpacing()-2) } )
   kF10 := SetKey( K_F10, {|| WVW_SetLineSpacing(NIL, WVW_SetLineSpacing()+2) } )
   kF11 := SetKey( K_F11, {|| WVW_SetDefLineSpacing( WVW_SetLineSpacing() ) } )

   * start menu definitions *************************************

   hWnd := WVW_GETWINDOWHANDLE()
   hMenu = WVW_CreateMenu( )
.
.
.

Mas vejamos:

Aqui ele faz:

Código: Selecionar todos

SETINKEYAFTERBLOCK({|nkey| nAfterInkey(nkey)})
Eu penso que este setinkeyafterblock é alguma coisa onde ele fica ali "segurando" / ou aguardando / alguma coisa ser teclada /

Acho que é semelhante ao inkey(0) no clipper ou no xhb / acertei?

Mas ele faz isso antes de definir o menu / Veja que logo mais abaixo ele faz:

Código: Selecionar todos

hMenu = WVW_CreateMenu( )
E daí prá frente monta o menu

De qualquer forma> na função nafterinkey ele faz:

Código: Selecionar todos

function nAfterInkey(nkey)
* check if nkey is:
* (1) menu command, or
* (2) mouse button action
local bAction
  if nkey==WVW_DEFAULT_MENUKEYEVENT
     * MenuKeyEvent
     return nMenuChecker(WVW_GETLASTMENUEVENT())
  //was: elseif ASCAN({K_LBUTTONDOWN, K_LBUTTONUP, K_MOUSEMOVE}, nKey) > 0
  elseif ASCAN({K_LBUTTONDOWN, K_LBUTTONUP, K_MOUSEMOVE, K_MMLEFTDOWN,;
                K_LDBLCLK}, nKey) > 0
     * MouseEvent
     return wvwm_nMouseChecker(nkey)
  elseif (bAction := SETKEY(nKey)) != NIL
     eval(bAction, PROCNAME(), PROCLINE(), READVAR())
     return 0
  endif
return nkey //nAfterInkey(nkey)
Veja que nesta função ele faz referência à função nMenuChecker()

E é na nMenuChecker() que ele vai definir o que ele vai executar

Código: Selecionar todos

function nMenuChecker(nMenuEvent)
local nkey := 0
   xDisableMenus(0, 4)
   //xDisableToolbar(0)

   do case
      case nMenuEvent==IDM_DEMO_GET
         * lboxmessage("Demo GET")
         Demo_Get()
      case nMenuEvent==IDM_DEMO_BROWSE
         * lboxmessage("Demo BROWSE")
         Demo_Browse()
      case nMenuEvent==IDM_DEMO_CONSOLE

 .
.
.



Ótimo / entendido / entendi como é que ele faz /

Só ficou a dúvida lá de cima:
Mas ele faz isso antes de definir o menu?
Porque é que ele faz

Código: Selecionar todos

SETINKEYAFTERBLOCK({|nkey| nAfterInkey(nkey)})
antes de:

Código: Selecionar todos

hMenu = WVW_CreateMenu( )
      hPopupMenu = WVW_CreateMenu( )
......
Alguem para me ajudar?
Mário
angeiras
Usuário Nível 3
Usuário Nível 3
Mensagens: 134
Registrado em: 21 Nov 2005 20:53
Localização: Olinda/PE

Re: Tentando fazer um primeiro menu com WVW

Mensagem por angeiras »

Boa noite,

Pelo que entendi, o uso da função SETINKEYAFTER() informa que antes de passar a tecla pressionada para o inkey(), o código é enviado para a função definida em SETINKEYAFTER().

No meu caso defini assim :

Código: Selecionar todos

SetInkeyAfterBlock({|nkey| ProcessaKey( nkey ) })
e ProcessaKey assim :

Código: Selecionar todos

****************************
FUNCTION PROCESSAKEY( nkey )
****************************
   local bAction

   if nkey == WVW_DEFAULT_MENUKEYEVENT
      return ProcessaMenu( WVW_GetLastMenuEvent() )
   elseif ( bAction := setkey(nKey) ) # NIL
      eval( bAction, Procname(), Procline(), Readvar() )
      return 0
  endif
RETURN nkey
Dessa forma quando uma tecla de menu é pressionada o controle vai para a função ProcessaMenu que tem as chamadas das rotinas definidas pelo Menu. Se foi uma tecla de função (F2...F12) chama o code block, senão retorna o código para o inkey() processar.

Acho que é assim.

[]s
M.Angeiras
Clipper 5.2e + sixcdx + catools + nanfor
xHarbour 1.0.0 + gtwvw / xHarbour 1.2.1 + Fivewin
Responder