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