Ajout d'élément dans le systemmenu

Programmation d'applications complexes
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Ajout d'élément dans le systemmenu

Message 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 ;)
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)]
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message 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
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message 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 !
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message 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
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

merci :D
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)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

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

Message par Backup »

cool !

tu deviens un "Maitre" de la prog "interface graphique fenetré" Windows
tu va bientot etre embauché chez Microsoft !! :D
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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 
:)
Répondre