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 :D

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 !! :D

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 
:)