Page 1 sur 1
Ajout d'élément dans le systemmenu
Publié : sam. 22/mai/2004 14:09
par Le Soldat Inconnu
Salut,
j'ai fait ceci :
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 3.81
;
; Explication du programme :
; Ajouter des éléments dans le SystemMenu
Procedure WinCallback(WindowID, Message, wParam, lParam)
Result.l = #PB_ProcessPureBasicEvents
If Message = #WM_MENUSELECT
Debug "sélection d'un élément " + Str(wParam)
EndIf
ProcedureReturn Result
EndProcedure
; Création de la fenêtre et dela GadgetList
If OpenWindow(0, 0, 0, 300, 300, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Test") = 0 Or CreateGadgetList(WindowID()) = 0
End
EndIf
SetWindowCallback(@WinCallback())
Menu = GetSystemMenu_(WindowID(), 0)
AppendMenu_(Menu, #MF_STRING, 0, "Test")
Repeat
Event = WaitWindowEvent()
If Event = #PB_EventMenu
Select EventMenuID() ; menu et barre d'outils
EndSelect
EndIf
Until Event = #PB_EventCloseWindow
End
ça ajoute un élément nommé "test" dans le systemmenu (clic droit sur le bouton du prog dans la barre des taches)
mais je n'arrive pas à choper l'évènement comme quoi j'ai cliqué sur cet élément. un petit coup de main, merci

Publié : sam. 22/mai/2004 14:37
par fweil
Va peut-être t'aider un peu :
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 3.81
;
; Explication du programme :
; Ajouter des éléments dans le SystemMenu
Global MaValeur.l
Procedure WinCallback(WindowID, Message, wParam, lParam)
Result.l = #PB_ProcessPureBasicEvents
Select Message
Case #WM_MENUSELECT
Debug "sélection d'un élément " + Str(wParam & $0000FFFF) + " " + Str(wParam & $FFFF0000)
ItemSelectionne = wParam & $0000FFFF
If ItemSelectionne = MaValeur
Debug "Gagné, si c'est ça c'est six et sept et un"
; Il ne reste plus qu'à attendre que l'utilisateur relache le bouton gauche par exemple #WM_LBUTTONUP
EndIf
EndSelect
ProcedureReturn Result
EndProcedure
; Création de la fenêtre et dela GadgetList
MaValeur = 671
If OpenWindow(0, 0, 0, 300, 300, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Test") = 0 Or CreateGadgetList(WindowID()) = 0
End
EndIf
SetWindowCallback(@WinCallback())
Menu = GetSystemMenu_(WindowID(), 0)
Debug AppendMenu_(Menu, #MF_STRING, MaValeur, "Test")
Repeat
Event = WaitWindowEvent()
If Event = #PB_EventMenu
Select EventMenuID() ; menu et barre d'outils
EndSelect
EndIf
Until Event = #PB_EventCloseWindow
End
Publié : sam. 22/mai/2004 14:52
par fweil
Bon en fait je te poste la version complète sinon tu vas peut-être tourner en bourrique :
Le pb c'est que si tu es dans un menu, les évènements souris sont captés par la popup.
Donc pas moyen de mettre une capture d'évènement sur les boutons même si on sait quel item du menu a été choisi.
Eventuellement on pourrait traiter cela dans la partie Event_Menu du prog principal, mais c'est mieux de le placer dans le callback.
Dans ce cas, il faut seulement identifier l'état de réponse du popup, qui passe à 0, -65536 quand on relache le bouton sur un item !
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 3.81
;
; Explication du programme :
; Ajouter des éléments dans le SystemMenu
Global MaValeur.l, DrapeauGagne.l
Procedure WinCallback(WindowID, Message, wParam, lParam)
Result.l = #PB_ProcessPureBasicEvents
Select Message
Case #WM_MENUSELECT
Debug "sélection d'un élément " + Str(wParam & $0000FFFF) + " " + Str(wParam & $FFFF0000)
ItemSelectionne = wParam & $0000FFFF
If ItemSelectionne = MaValeur
DrapeauGagne = #TRUE
; Il ne reste plus qu'à attendre que l'utilisateur relache le bouton gauche par exemple #WM_LBUTTONUP
EndIf
If DrapeauGagne And ItemSelectionne = 0 And wParam & $FFFF0000 = -65536
DrapeauGagne = #FALSE
Debug "Gagné, si c'est ça c'est six et sept et un"
EndIf
EndSelect
ProcedureReturn Result
EndProcedure
; Création de la fenêtre et dela GadgetList
MaValeur = 671
If OpenWindow(0, 0, 0, 300, 300, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Test") = 0 Or CreateGadgetList(WindowID()) = 0
End
EndIf
SetWindowCallback(@WinCallback())
Menu = GetSystemMenu_(WindowID(), 0)
Debug AppendMenu_(Menu, #MF_STRING, MaValeur, "Test")
Repeat
Event = WaitWindowEvent()
If Event = #PB_EventMenu
Select EventMenuID() ; menu et barre d'outils
EndSelect
EndIf
Until Event = #PB_EventCloseWindow
End
Enfin tout simple quoi !
Publié : sam. 22/mai/2004 15:19
par nico
C'est le code que j'avais posté sur le forum Anglais:
Code : Tout sélectionner
Global id.l
Procedure MyWindowCallback(WindowID,message,wParam,lParam)
result=#PB_ProcessPureBasicEvents
Select message
Case #WM_SYSCOMMAND
Select wParam
Case id
MessageRequester("About", "Cool Menu example 1", 0)
Case id+1
MessageRequester("About", "Cool Menu example 2", 0)
EndSelect
EndSelect
ProcedureReturn result
EndProcedure
Hwnd_window0=OpenWindow(0,200,200,200,200,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget,"Menu System")
id.l=15
hwnd_systeme=GetSystemMenu_(Hwnd_window0,#False)
AppendMenu_(hwnd_systeme,#Mft_String,id,"Mon Menu 1")
AppendMenu_(hwnd_systeme,#Mft_String,id+1,"Mon Menu 2")
SetWindowCallback(@MyWindowCallback())
Repeat
Select WindowEvent()
Case #PB_Event_CloseWindow
Quit=1
;------------------------------------
; The rest of your code here
;------------------------------------
EndSelect
Until Quit = 1
End
Publié : sam. 22/mai/2004 15:24
par fweil
nico,
La différence c'est que tu appelles SYSCOMMAND qui est spécifique au popup sysmenu. Dans ce cas ton code est + efficace puisqu'il s'agissait de traper les évènements de sysmenu
Publié : sam. 22/mai/2004 16:23
par Le Soldat Inconnu
merci

Publié : dim. 06/juin/2004 0:01
par Le Soldat Inconnu
mon code, je mets les éléments au milieu du menu au lieu de les mettre à la fin
Code : Tout sélectionner
Procedure WindowCallback(WindowID, message, wParam, lParam)
result = #PB_ProcessPureBasicEvents
Select message
Case #WM_SYSCOMMAND
Select wParam
Case 20
MessageRequester("Info", "Menu 1", 0)
Case 21
MessageRequester("Info", "Menu 2", 0)
EndSelect
EndSelect
ProcedureReturn result
EndProcedure
OpenWindow(0, 200, 200, 200, 200, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget, "SystemMenu")
SysMenu = GetSystemMenu_(WindowID(), #False)
DefType.MENUITEMINFO MenuInfo
MenuInfo\cbSize = SizeOf(MENUITEMINFO)
MenuInfo\fmask = $2 | $40
; On insert une séparation
MenuInfo\fType = #MFT_SEPARATOR
InsertMenuItem_(SysMenu, 5, #MF_BYPOSITION, MenuInfo)
; On insert du texte
MenuInfo\fType = #MFT_STRING
MenuInfo\fState = #MFS_DEFAULT
MenuInfo\wID = 20 ; ID du menu
Texte.s = "Menu 1"
MenuInfo\dwTypeData = @Texte
MenuInfo\cch = Len(Texte) + 1
InsertMenuItem_(SysMenu, 6, #MF_BYPOSITION, MenuInfo)
; On insert du texte
MenuInfo\fType = #MFT_STRING
MenuInfo\fState = #MFS_DEFAULT
MenuInfo\wID = 21 ; ID du menu
Texte.s = "Menu 2"
MenuInfo\dwTypeData = @Texte
MenuInfo\cch = Len(Texte) + 1
InsertMenuItem_(SysMenu, 7, #MF_BYPOSITION, MenuInfo)
SetWindowCallback(@WindowCallback())
Repeat
Event = WindowEvent()
Until Event = #WM_CLOSE
Publié : dim. 06/juin/2004 10:57
par Backup
cool !
tu deviens un "Maitre" de la prog "interface graphique fenetré" Windows
tu va bientot etre embauché chez Microsoft !!

Publié : dim. 06/juin/2004 11:08
par nico
On peut aussi faire comme ça:
Code : Tout sélectionner
Global id.l
Procedure MyWindowCallback(WindowID,message,wParam,lParam)
result=#PB_ProcessPureBasicEvents
Select message
Case #WM_SYSCOMMAND
Select wParam
Case id+1
MessageRequester("About", "Cool Menu example 1", 0)
Case id+2
MessageRequester("About", "Cool Menu example 2", 0)
EndSelect
EndSelect
ProcedureReturn result
EndProcedure
Hwnd_window0=OpenWindow(0,200,200,200,200,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget,"Menu System")
id.l=15
hwnd_systeme=GetSystemMenu_(Hwnd_window0,#False)
insertmenu_(hwnd_systeme,5,#MF_BYPOSITION|#MFT_SEPARATOR,id,"")
insertmenu_(hwnd_systeme,6,#MF_BYPOSITION|#MFT_STRING,id+1,"Mon Menu 1")
insertmenu_(hwnd_systeme,7,#MF_BYPOSITION|#MFT_STRING,id+2,"Mon Menu 2")
SetWindowCallback(@MyWindowCallback())
Repeat
Select WindowEvent()
Case #PB_Event_CloseWindow
Quit=1
;------------------------------------
; The rest of your code here
;------------------------------------
EndSelect
Until Quit = 1
End
