Page 1 sur 1
Au sujet des menus
Publié : mer. 21/mars/2012 13:54
par pat
Bonjour à tous,
Comme vous le savez peut-être, PB donne des commandes sur les menus bien sympas et très utiles.
On commence par créer le titre du menu puis les menus avec un numéro pour chacun.
Mais il n'y a pas de numéro pour les titres de menu.
J'ai remarqué un programme qui n'avait pas de sous-menu mais seulement un titre de menu et on pouvait cliquer dessus et l'action demandé s'exécutait.
Comme faire pareil avec PB étant donné qu'il n'y a pas de numéro pour les menus.
Merci à ceux qui savent.
Re: Au sujet des menus
Publié : mer. 21/mars/2012 16:22
par Mesa
Avec Windows, on peut utiliser les messages avec un wincallback.
C'est compliqué mais je ne pense pas qu'il y ait plus simple.
Code : Tout sélectionner
Procedure WinCallback(hwnd, message, wparam, lparam)
Select message
Case #WM_MENUSELECT
Numero_du_Menu = wparam & $ffff
Debug "Menu n° " + Str(Numero_du_Menu)
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
If OpenWindow(0, 100, 100, 800, 600, "Menu", #PB_Window_SystemMenu)
Menu=CreateMenu(0, WindowID(0))
MenuTitle("Menu 0")
MenuItem(1, "Sous Menu 1")
MenuItem(2, "Sous Menu 2")
MenuItem(3, "Sous Menu 3")
MenuItem(100, "Sous Menu 100")
MenuTitle("Menu 1")
MenuTitle("Menu 2")
SetWindowCallback(@WinCallback())
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Mesa.
Re: Au sujet des menus
Publié : mer. 21/mars/2012 16:29
par Backup
+1
Re: Au sujet des menus
Publié : jeu. 22/mars/2012 11:09
par Mesa
Amélioration du code.
Avec le code ci-dessus, avec des sous-menus, il faut appuyer une fois pour ouvrir le menu et une deuxième fois pour le refermer. Par contre sans sous-menus, c'est comme s'il ne se refermait jamais, ce qui rend le code inutilisable.
Maintenant les menus se ferment:
Code : Tout sélectionner
Procedure WinCallback(hwnd, message, wparam, lparam)
Select message
Case #WM_MENUSELECT
Numero_du_Menu = wparam & $ffff
;Debug "Menu n° " + Str(Numero_du_Menu)
Select Numero_du_Menu
Case 0
Debug "Menu n° " + Str(Numero_du_Menu)
Case 1
Debug "Menu n° " + Str(Numero_du_Menu)
EndMenu_()
Case 2
Debug "Menu n° " + Str(Numero_du_Menu)
EndMenu_()
EndSelect
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
hwin=OpenWindow(0, 100, 100, 800, 600, "Menu", #PB_Window_SystemMenu)
Menu=CreateMenu(0, WindowID(0))
MenuTitle("Menu 0")
MenuItem(10, "Sous Menu 10")
MenuItem(20, "Sous Menu 20")
MenuItem(30, "Sous Menu 30")
MenuItem(100, "Sous Menu 100")
MenuTitle("Menu 1")
MenuTitle("Menu 2")
SetWindowCallback(@WinCallback())
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
;EndIf
Il y a tout de même un bug quand on passe de menu0 directement à menu1, le menu1 se déclenche sans cliquer dessus.
Mesa.
Re: Au sujet des menus
Publié : ven. 23/mars/2012 16:08
par pat
Merci à tous.
Comme je ne suis pas chez moi je vais voir ça de plus près et d'avance je vous fais confiance.
Re: Au sujet des menus
Publié : mer. 28/mars/2012 12:55
par pat
J'ai regardé la SDK Documentation pour les APIs.
Effectivement, on récupère le mot bas de wParam et on a le handle du menu mais effectivement le titre du menu (menubar) se comporte exactement comme un sous-menu (submenu) et je ne vois pas quoi changer pour qu'il se comporte comme un menu.
Pourtant j'ai bien vu un programme avec un titre de menu, qui se comportait comme un menu, et qui renvoyait à une action particulière.
Ce qui veut dire que c'est possible mais comment faire pour que cela soit fait de manière correcte ?
Re: Au sujet des menus
Publié : mer. 28/mars/2012 13:42
par Kwai chang caine
J'ai remarqué un programme qui n'avait pas de sous-menu mais seulement un titre de menu et on pouvait cliquer dessus et l'action demandé s'exécutait.
Peut etre ce code qui nous viens du grand SROD peut t'aider
Code : Tout sélectionner
If OpenWindow(0, 200, 200, 400, 100, "MenuTitle Example")
If CreateMenu(0, WindowID(0))
MenuTitle("Project")
MenuItem(1, "Open")
MenuItem(2, "Close")
MenuTitle("&Edit")
MenuItem(3, "Undo")
MenuItem(4, "Redo")
CloseSubMenu()
MenuItem(5, "About")
EndIf
Repeat
ev = WaitWindowEvent()
Select ev
Case #PB_Event_Menu
If EventMenu() = 5
Debug "About clicked!"
EndIf
EndSelect
Until ev=#PB_Event_CloseWindow
EndIf
Re: Au sujet des menus
Publié : jeu. 29/mars/2012 8:07
par Mesa
Ça alors, ça marche !
Comme le Code ci-dessus.
En plus c'est multiplateforme!
Code : Tout sélectionner
If OpenWindow(0, 200, 200, 400, 100, "MenuTitle Exemple")
If CreateMenu(0, WindowID(0))
MenuTitle("Menu 0")
MenuItem(10, "Sous Menu 10")
MenuItem(20, "Sous Menu 20")
MenuItem(30, "Sous Menu 30")
MenuItem(100, "Sous Menu 100")
CloseSubMenu()
MenuItem(1,"Menu 1")
MenuItem(2,"Menu 2")
EndIf
Repeat
ev = WaitWindowEvent()
Select ev
Case #PB_Event_Menu
Select EventMenu()
Case 0
Debug "Menu 0" ; ne marche pas mais ce n'est pas nécessaire
Case 1
Debug "Menu 1"
Case 2
Debug "Menu 2"
Case 10
Debug "Menu 10"
Case 20
Debug "Menu 20"
Case 30
Debug "Menu 30"
Case 100
Debug "Menu 100"
EndSelect
EndSelect
Until ev=#PB_Event_CloseWindow
EndIf
Mesa.
Re: Au sujet des menus
Publié : jeu. 29/mars/2012 9:02
par Kwai chang caine
It's that, the magic SROD word

Re: Au sujet des menus
Publié : jeu. 29/mars/2012 13:52
par pat
A Kwai chang caine.
Un grand merci à toi. Ton aide me sera très précieuse. Il fallait y penser.
Et pas besoin d'API, donc comme le dit mesa, c'est multiplateforme.
Re: Au sujet des menus
Publié : jeu. 29/mars/2012 20:39
par Kwai chang caine
De rien content de t'avoir rendu service.
Mais tout le mérite reviens à SROD
C'est vrai que c'est tellement simple que ça en etait quasi impossible à trouver quand on connait pas la combine.
J'avais eu besoin de ça moi aussi au début de ma rencontre avec PB, et SROD m'avait drolement dépanné

Re: Au sujet des menus
Publié : mer. 04/avr./2012 12:32
par pat
A Kwai chang caine.
Sans toi je n'aurais jamais su comment faire, donc merci à toi et aussi à SROD.
Re: Au sujet des menus
Publié : mer. 04/avr./2012 13:28
par dayvid
C'est qui
SROD 
Re: Au sujet des menus
Publié : mer. 04/avr./2012 13:55
par Ar-S
Un membre du forum anglais.
Re: Au sujet des menus
Publié : mer. 04/avr./2012 14:36
par dayvid
Ah ok, merci Ar'S
