Page 1 sur 1
Personaliser le "SystemMenu"
Publié : mar. 09/août/2005 11:32
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.
Publié : jeu. 11/août/2005 16:19
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.

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.
Publié : jeu. 11/août/2005 17:42
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
Publié : jeu. 11/août/2005 18:08
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")
Publié : jeu. 11/août/2005 18:29
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

Publié : jeu. 11/août/2005 18:36
par gansta93
Merci les gars !

ça marche parfettement, même avec mon Windows 98 souvent étrange.

Me manque plus qu'à analyser parfaitement le code, je vais essayer de créer une Lib SystemMenu, qu'en pensez-vous ?
Publié : jeu. 11/août/2005 18:52
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

On pourrais croire que c'est une astuce mais en fait, c'est la méthode traditionnelle pour associer un sous menu à un autre.
Publié : jeu. 11/août/2005 18:58
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

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

Publié : jeu. 11/août/2005 19:05
par gansta93
Je ne savais même pas que l'on pouvait faire ça.

C'est génial, faut vraimant que je revoi ça de très prêt. Merci encore.

@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 ?
Re: Personaliser le "SystemMenu"
Publié : sam. 17/sept./2005 9:54
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
...