Page 1 sur 1

clic droit dans un menu

Publié : sam. 08/nov./2008 14:44
par supercdfr
Peut on faire reagir un clique droit quand on est dans un menu ?
Le clic gauche lance le menu, mais est-ce que l'on peut savoir si l'on appuie sur le clic droit ?

Publié : sam. 08/nov./2008 15:43
par Backup
faudrai faire un truc du genre

Code : Tout sélectionner

Event_mouse = WindowEvent()
        If  Event_mouse = #WM_RBUTTONDOWN
mais avec le menu c'est chaud !! :?

Publié : sam. 08/nov./2008 16:54
par supercdfr
Le probleme, c'est que cela ne detecte rien quand on est dans un menu.

Publié : sam. 08/nov./2008 18:14
par Le Soldat Inconnu
Il va falloir fouiller, voici l'idée en gros :

Retrouver un code qui permet de savoir l'élément du menu sous la souris.
Donc chercher un code qui fait "Menu avec aide contextuel dans la barre d'état"
il me semble qu'il y a ca sur CodeArchiv

Ensuite une fois qu'on sait l'élément actif dans le menu, il faut faire un thread dans le programme

CreateThread( ...

Qui espionne la souris (pas avec un #WM_... mais une api qui renvoie directement l'état des boutons de la souris)
c'est :
GetAsyncKeyState_(#VK_LBUTTON)
voir ce post
http://www.purebasic.fr/french/viewtopi ... highlight=

et ensuite a toi de jouer je dirais.

il ne s'agit que d'une voie à explorer, c'est comme ca que je ferais. J'espère qu'elle va marcher

Publié : sam. 08/nov./2008 18:16
par Anonyme2
Voilà un petit code à l'arache.

Je n'ai pas fait de tests si on a un sous-menu, je pense que ça ne marchera pas , il faudra améliorer le code.

La boite de message affiche l'identifiant de l'élément du menu sélectionné avec le bouton droit.

Je n'ai pas récupéré l'état de l'élément sélectionné, celui qui est désactivé retourne aussi la valeur.

A toi d'améliorer; pour de l'aide, peut-être demain, ce soir je sors.

Code : Tout sélectionner

Procedure WinCallback(Window, message, wparam, lparam)
     result = #PB_ProcessPureBasicEvents
     Select message
          Case #WM_MENURBUTTONUP
               lpmii.MENUITEMINFO\cbSize = SizeOf(MENUITEMINFO)
               lpmii\fMask = #MIIM_ID
               If GetMenuItemInfo_(lparam, wParam, #MF_BYPOSITION, @lpmii)
                    MessageRequester("Menu ", "Element cliqué : " + Str(lpmii\wID), 16)
               EndIf
               EndMenu_()
     EndSelect
     ProcedureReturn result
EndProcedure


If OpenWindow(0, 200, 200, 400, 100, "Bouton droit sur menu Checkmarks", #PB_Window_SystemMenu)
     SetWindowCallback(@WinCallback())
     CreateMenu(0, WindowID(0))
     MenuTitle("Menu  1")
     MenuItem(1, "Elément  1")
     MenuItem(2, "Elément  2")
     MenuItem(3, "Elément  3")
     DisableMenuItem(0, 3, 1)
     MenuItem(4, "Elément  4")
     MenuTitle("Menu  2")
     MenuItem(5, "Elément 1")
     MenuItem(6, "Elément 2")
     MenuItem(7, "Elément 3")
     MenuItem(8, "Elément 4")
     
     Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf


Publié : sam. 08/nov./2008 18:42
par supercdfr
ton code fonctionne impec, mais peut on le faire dans un menu systray ?

Publié : sam. 08/nov./2008 23:04
par venom
salut,

je pense fortement que oui étant donnée que le menu que l'ont crée dans un systray et le même qu'un menu dans une fenêtre.
après a tester.




@++

Publié : dim. 09/nov./2008 1:29
par Backup
Merci Denis :)

Publié : dim. 09/nov./2008 20:33
par Anonyme2
supercdfr a écrit :ton code fonctionne impec, mais peut on le faire dans un menu systray ?
J'ai travaille dessus tout le matin mais ça ne marche toujours pas.
Pas possible d'intercepter les évènements. J'ai utilisé une procedure Hook, tout fonctionne sauf que je n'arrive pas à obtenir l'identifiant de l'élément du menu.

Je chercherais encore mais j'ai pas trop le temps en ce moment.

Publié : dim. 09/nov./2008 21:18
par kwandjeen
Tiens essai ça. Utilise la constante pb pour savoir si l'évènement provient du systray. J'ai peut etre pas tout suivi mais le click droit fonctionne chez moi.

Code : Tout sélectionner

Procedure WinCallback(Window, message, wparam, lparam)
     result = #PB_ProcessPureBasicEvents
     Select message
          Case #WM_MENURBUTTONUP
               lpmii.MENUITEMINFO\cbSize = SizeOf(MENUITEMINFO)
               lpmii\fMask = #MIIM_ID
               If GetMenuItemInfo_(lparam, wParam, #MF_BYPOSITION, @lpmii)
                    MessageRequester("Menu ", "Element cliqué : " + Str(lpmii\wID), 16)
               EndIf
               EndMenu_()
     EndSelect
     ProcedureReturn result
EndProcedure


If OpenWindow(0, 200, 200, 400, 100, "Bouton droit sur menu Checkmarks", #PB_Window_SystemMenu)
     SetWindowCallback(@WinCallback())
     CreateMenu(0, WindowID(0))
     MenuTitle("Menu  1")
     MenuItem(1, "Elément  1")
     MenuItem(2, "Elément  2")
     MenuItem(3, "Elément  3")
     DisableMenuItem(0, 3, 1)
     MenuItem(4, "Elément  4")
     MenuTitle("Menu  2")
     MenuItem(5, "Elément 1")
     MenuItem(6, "Elément 2")
     MenuItem(7, "Elément 3")
     MenuItem(8, "Elément 4")
     If CreatePopupMenu(0)        ; La création du menu contextuel commence...
      MenuTitle("Projet")        ; Vous pouvez utiliser toutes les commandes relatives au menu,
        MenuItem(1, "Ouvrir")    ; comme si c'était un menu normal...
        MenuItem(2, "Enregistrer")
        MenuItem(3, "Enregistrer sous")
        MenuItem(4, "Quitter")
        MenuBar()
        OpenSubMenu("Fic&hiers récents")
          MenuItem(5, "PureBasic.exe")
          MenuItem(6, "Test.txt")
        CloseSubMenu()
      MenuTitle("Editer")
      MenuTitle("Options")
    EndIf
  AddSysTrayIcon(1, WindowID(0), LoadImage(0, "C:\Program Files\PureBasic\Examples\Sources\Data\CdPlayer.ico"))
 
  SysTrayIconToolTip(1, "Icon 1")
 

     Repeat 
           Select WaitWindowEvent()            ; Examine quel type d'évènement est survenu sur la fenêtre
        Case #PB_Event_SysTray
            DisplayPopupMenu(0,WindowID(0))  ; On affiche le menu contextuel

        Case #PB_Event_Menu      ; Un élément du menu a été sélectionné
          Select EventMenu()     ; On recupère le numéro de cet élement...
            Case 1 : Debug "Menu : Ouvrir"
            Case 2 : Debug "Menu : Enregistrer"
            Case 3 : Debug "Menu : Enregistrer sous"
            Case 4 : Quitter = 1
            Case 5 : Debug "Menu : PureBasic.exe"
            Case 6 : Debug "Menu : Text.txt"
          EndSelect
        Case #PB_Event_CloseWindow
          Quitter = 1
      EndSelect
    Until Quitter = 1
EndIf 

Publié : dim. 09/nov./2008 22:00
par Anonyme2
Oui ça marche, je ne pensais pas que ça irais avec les commandes PB :D

D'ailleurs pour le menu systray, pas besoin de callback, tu peux virer la procedure WinCallback et le setwindowcallback

Publié : lun. 10/nov./2008 7:05
par Anonyme2
Pour l'exemple que j'ai posté, ça fonctionne aussi avec les éléments de sous menu.

Publié : lun. 10/nov./2008 16:13
par supercdfr
excellentissime, c'est exactement ce que je recherchais.
Merci les gars.