clic droit dans un menu

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
supercdfr
Messages : 105
Inscription : sam. 21/juil./2007 15:16

clic droit dans un menu

Message 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 ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 !! :?
supercdfr
Messages : 105
Inscription : sam. 21/juil./2007 15:16

Message par supercdfr »

Le probleme, c'est que cela ne detecte rien quand on est dans un menu.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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

supercdfr
Messages : 105
Inscription : sam. 21/juil./2007 15:16

Message par supercdfr »

ton code fonctionne impec, mais peut on le faire dans un menu systray ?
Avatar de l’utilisateur
venom
Messages : 3138
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

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




@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Merci Denis :)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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.
kwandjeen
Messages : 204
Inscription : dim. 16/juil./2006 21:44

Message 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 
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Pour l'exemple que j'ai posté, ça fonctionne aussi avec les éléments de sous menu.
supercdfr
Messages : 105
Inscription : sam. 21/juil./2007 15:16

Message par supercdfr »

excellentissime, c'est exactement ce que je recherchais.
Merci les gars.
Répondre