Personaliser le "SystemMenu"

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Personaliser le "SystemMenu"

Message par gansta93 »

Bonjour,

J'ai bien ce code pour ajouter des menus dans le menu système.

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.92
; 
; Explication du programme :
; Ajouter des éléments dans le SystemMenu
; Le SystemMenu est le menu qui apparait quand on fait clic droit sur le bouton du programme dans la barre des tâches.

; Ce code montre comment ajouter des éléments et des séparations

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


; on ouvre une fenêtre avec un SystemMenu
OpenWindow(0, 200, 200, 200, 200, #PB_Window_SystemMenu, "SystemMenu")

; On récupère le handle du 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)
; Le 5 correspond à la position dans le menu

; On insert un élément dans le SystemMenu
MenuInfo\fType = #MFT_STRING
MenuInfo\fState = #MFS_DEFAULT
MenuInfo\wID = 20 ; ID du menu
Texte.s = "Menu 1" ; Texte de l'élément
MenuInfo\dwTypeData = @Texte
MenuInfo\cch = Len(Texte) + 1
InsertMenuItem_(SysMenu, 6, #MF_BYPOSITION, MenuInfo)
; Le 6 correspond à la position dans le menu

; On insert un élément dans le SystemMenu
MenuInfo\fType = #MFT_STRING
MenuInfo\fState = #MFS_DEFAULT
MenuInfo\wID = 21 ; ID du menu
Texte.s = "Menu 2" ; Texte de l'élément
MenuInfo\dwTypeData = @Texte
MenuInfo\cch = Len(Texte) + 1
InsertMenuItem_(SysMenu, 7, #MF_BYPOSITION, MenuInfo)
; Le 7 correspond à la position dans le menu


SetWindowCallback(@WindowCallback())

Repeat
  Event = WindowEvent()

Until Event = #WM_CLOSE
Mais dans ce code, ce ne sont que des menus simples qui sont ajoutés. Comment ajoute-t-on des sous-menus et ainsi créer comme dans Winamp des menus avec des sous-menus avec d'autres sous-menus etc et tout ça dans le menu système ?

Merci d'avance.
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

Impressionant, le nombre de réponses à ce poste. Je ne sais pas pourquoi, mais je suis prêt à parier qu'il y en a plus d'un qui pouraient répondre à ma question. :-P Je ne comprand pas pourquoi il est nécessair d'être un gros lourdeau pour obtenir une réponse à une question. Mais le plus inquiettant, c pas dans ce cas. Le plus inquiettant, c dans le cas d'un rapport de bug qui reste ignoré, comme plain d'autres choses d'ailleur. Alors peut-être est-ce le Gansta (j'ai pas dis Gangsta) ou le 93 qui ne plaît pas, je ne sais pas. Mais dans ce cas-là, faut l'dire, mais j'voi pas ce qui gène dans mon pseudo, je n'ai insulté personne ici, j'ai toujour été correcte, je pense. Alors pourquoi tant de vents ? Oui, j'suis pas l'seul à qui on en met, mais ce sont toujours les mêmes.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

j'ai modifié le code de LSI
Je ne sais pas si c'est ce que tu cherches

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.92
;
; Explication du programme :
; Ajouter des éléments dans le SystemMenu
; Le SystemMenu est le menu qui apparait quand on fait clic droit sur le bouton du programme dans la barre des tâches.

; Ce code montre comment ajouter des éléments et des séparations


#MIIM_SUBMENU = 4
#MIIM_TYPE    = 16

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)

        Case 111
          MessageRequester("Info", "Sous-Menu 111", 0)

        Case 112
          MessageRequester("Info", "Sous-Menu 112", 0)
      EndSelect
     
  EndSelect
  ProcedureReturn result
EndProcedure


; on ouvre une fenêtre avec un SystemMenu
OpenWindow(0, 200, 200, 200, 200, #PB_Window_SystemMenu, "SystemMenu")

; On récupère le handle du 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)
; Le 5 correspond à la position dans le menu

; On insert un élément dans le SystemMenu
MenuInfo\fType = #MFT_STRING
MenuInfo\fState = #MFS_DEFAULT
MenuInfo\wID = 20 ; ID du menu
Texte.s = "Menu 1" ; Texte de l'élément
MenuInfo\dwTypeData = @Texte
MenuInfo\cch = Len(Texte) + 1
InsertMenuItem_(SysMenu, 6, #MF_BYPOSITION, MenuInfo)
; Le 6 correspond à la position dans le menu

;******************************************
;******************************************
; On insert un sous-menu 
PopupMenu11 = CreatePopupMenu_()
; ajoute un élément au sous-menu car CreatePopupMenu_() cré un sous-menu vide

Texte.s = "Menu 11" ; Texte de l'élément
AppendMenu_(SysMenu,#MF_STRING|#MF_POPUP	, PopupMenu11, Texte.s)
DrawMenuBar_(PopupMenu11)
; On insert un élément dans le sous-menu
MenuInfo\fType = #MFT_STRING
MenuInfo\fState = #MFS_DEFAULT
MenuInfo\wID = 111 ; ID du sous-menu
Texte.s = "Sous-Menu 111" ; Texte de l'élément
MenuInfo\dwTypeData = @Texte
MenuInfo\cch = Len(Texte) + 1
InsertMenuItem_(PopupMenu11, 1, #False, MenuInfo)
Texte.s = "Sous-Menu 112" ; Texte de l'élément
MenuInfo\wID = 112 ; ID du sous-menu
MenuInfo\dwTypeData = @Texte
MenuInfo\cch = Len(Texte) + 1
InsertMenuItem_(PopupMenu11, 2, #False, MenuInfo)


;******************************************
;******************************************


MenuInfo\fmask = $2 | $40

; On insert un élément dans le SystemMenu
MenuInfo\fType = #MFT_STRING
MenuInfo\fState = #MFS_DEFAULT
MenuInfo\wID = 21 ; ID du menu
Texte.s = "Menu 2" ; Texte de l'élément
MenuInfo\dwTypeData = @Texte
MenuInfo\cch = Len(Texte) + 1
InsertMenuItem_(SysMenu, 7, #MF_BYPOSITION, MenuInfo)
; Le 7 correspond à la position dans le menu


SetWindowCallback(@WindowCallback())

Repeat
  Event = WindowEvent()

Until Event = #WM_CLOSE
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Une autre possibilité:

Tu crées un poopupmenu avec les commandes de Pure et tu l'intègres dans un autre menu.

Code : Tout sélectionner

hmenupopup=CreatePopupMenu(10)
If hmenupopup
MenuItem(1, "Open")   
MenuItem(2, "Save")
MenuItem(3, "Save as")
MenuItem(4, "Quit")
EndIf 

InsertMenu_(SysMenu, 8, #MF_POPUP | #MF_BYPOSITION,hmenupopup,"menu 3")
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

nico a écrit :Une autre possibilité:

Tu crées un poopupmenu avec les commandes de Pure et tu l'intègres dans un autre menu.
Excellent :D
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

Merci les gars ! :-D ça marche parfettement, même avec mon Windows 98 souvent étrange. :-D
Me manque plus qu'à analyser parfaitement le code, je vais essayer de créer une Lib SystemMenu, qu'en pensez-vous ?
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Denis a écrit :
nico a écrit :Une autre possibilité:

Tu crées un poopupmenu avec les commandes de Pure et tu l'intègres dans un autre menu.
Excellent :D
On pourrais croire que c'est une astuce mais en fait, c'est la méthode traditionnelle pour associer un sous menu à un autre.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

nico a écrit :
Denis a écrit :
nico a écrit :Une autre possibilité:

Tu crées un poopupmenu avec les commandes de Pure et tu l'intègres dans un autre menu.
Excellent :D
On pourrais croire que c'est une astuce mais en fait, c'est la méthode traditionnelle pour associer un sous menu à un autre.
En fait je n'ai pas pensé à utiliser les commandes PB :roll:
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

Je ne savais même pas que l'on pouvait faire ça. :-D C'est génial, faut vraimant que je revoi ça de très prêt. Merci encore. :-D
@Denis : Et oui, c ça de ne voir que les API. ;-) Comme quoi, une bonne mixture est parfois aussi efficace. :-)

Sinon vous en pensez quoi pour la lib ?
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Re: Personaliser le "SystemMenu"

Message par gnozal »

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.92
; 
; Explication du programme :
; Ajouter des éléments dans le SystemMenu
; Le SystemMenu est le menu qui apparait quand on fait clic droit sur le bouton du programme dans la barre des tâches.

; Ce code montre comment ajouter des éléments et des séparations

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


; on ouvre une fenêtre avec un SystemMenu
OpenWindow(0, 200, 200, 200, 200, #PB_Window_SystemMenu, "SystemMenu")

; On récupère le handle du 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)
; Le 5 correspond à la position dans le menu

; On insert un élément dans le SystemMenu
MenuInfo\fType = #MFT_STRING
MenuInfo\fState = #MFS_DEFAULT
MenuInfo\wID = 20 ; ID du menu
Texte.s = "Menu 1" ; Texte de l'élément
MenuInfo\dwTypeData = @Texte
MenuInfo\cch = Len(Texte) + 1
InsertMenuItem_(SysMenu, 6, #MF_BYPOSITION, MenuInfo)
; Le 6 correspond à la position dans le menu

; On insert un élément dans le SystemMenu
MenuInfo\fType = #MFT_STRING
MenuInfo\fState = #MFS_DEFAULT
MenuInfo\wID = 21 ; ID du menu
Texte.s = "Menu 2" ; Texte de l'élément
MenuInfo\dwTypeData = @Texte
MenuInfo\cch = Len(Texte) + 1
InsertMenuItem_(SysMenu, 7, #MF_BYPOSITION, MenuInfo)
; Le 7 correspond à la position dans le menu


SetWindowCallback(@WindowCallback())

Repeat
  Event = WindowEvent()

Until Event = #WM_CLOSE
Ce code ne fonctionne pas correctement sous WinNT / PB3.94 : menu items vides.
Modifié ainsi çà fonctionne :

Code : Tout sélectionner

...
#MIIM_TYPE = $00000010
#MIIM_ID = $00000002
#MIIM_STATE = $00000001
MenuInfo\fMask = #MIIM_TYPE | #MIIM_ID | #MIIM_STATE
...
Répondre