Page 1 sur 1
MenuItem avec image intégrée
Publié : mar. 20/mai/2014 17:36
par david
Cela sera sûrement une évidence, mais quand ça ne marche pas mieux vaut avoir l'air bête que ne pas demander...
Dans l'aide il me dit
pourquoi je n'arrive pas a avoir l'image a gauche de 'Nouveau'??
Code : Tout sélectionner
If OpenWindow(0, 200, 200, 200, 100, "Exemple MenuItem")
If CreateMenu(0, WindowID(0))
MenuTitle("&Projet")
MenuItem(1, "Nouveau", #PB_ToolBarIcon_New)
MenuItem(2, "&Enregistrer")
EndIf
Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf
merci par avance de m'éclaircir
PureBasic 5.22 LTS (Windows - x86)
ça marche pourtant bien dans
Code : Tout sélectionner
CreateToolBar(#BarreMenu, WindowID(#Fenetre_Principale))
ToolBarStandardButton(#GADGET_Clear, #PB_ToolBarIcon_New) ;nouveau
Re: MenuItem avec image intégrée
Publié : mar. 20/mai/2014 21:02
par falsam
L'avantage d'un menu c'est que tu ajoutes les icones que tu veux.

Condition : Tu dois créer ou chager une image et tu dois utiliser la fonction
CreateImageMenu() au lieu de CreateMenu().
Un exemple qui chargera une image issu des exemples purebasic.
Code : Tout sélectionner
UsePNGImageDecoder()
Image = LoadImage(#PB_Any, #PB_Compiler_Home+"Examples\Sources\Data\ToolBar\New.png")
If OpenWindow(0, 200, 200, 200, 100, "Exemple MenuItem")
If CreateImageMenu(0, WindowID(0))
MenuTitle("&Projet")
MenuItem(1, "Nouveau", ImageID(Image))
MenuItem(2, "&Enregistrer")
EndIf
Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf
Re: MenuItem avec image intégrée
Publié : mar. 20/mai/2014 21:08
par falsam
La toolbar standard étant plutot moche

Je t'encourage à utiliser une toolbar avec tes propres icones.
Code : Tout sélectionner
UsePNGImageDecoder()
ImageNew = LoadImage(#PB_Any, #PB_Compiler_Home+"Examples\Sources\Data\ToolBar\New.png")
ImageSave = LoadImage(#PB_Any, #PB_Compiler_Home+"Examples\Sources\Data\ToolBar\Save.png")
If OpenWindow(0, 200, 200, 500, 400, "Exemple MenuItem")
;Menu
If CreateImageMenu(0, WindowID(0))
MenuTitle("&Projet")
MenuItem(1, "Nouveau", ImageID(ImageNew))
MenuItem(2, "&Enregistrer", ImageID(ImageSave))
EndIf
;Toolbar
If CreateToolBar(0, WindowID(0))
ToolBarImageButton(0,ImageID(ImageNew))
ToolBarImageButton(1,ImageID(ImageSave))
EndIf
Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf
Re: MenuItem avec image intégrée
Publié : jeu. 22/mai/2014 9:34
par david
C'est super, de ce fait je suis en train de modifier mon programme de dessin avec des icones téléchargées sur le net et des beaux menus...
par contre dans mon programme j'affiche la liste des outils disponibles dans le menu et je voudrais mettre l'icone "X" devant le nom de l'outil en cours d'utilisation
ca présuppose que je puisse modifier l'icone de chaque nom dans le menu
ca présuppose également que si je clic sur un autre outil il puisse etre lancé comme si j'avais appuyé sur lui et non sur le menu
j'arrive a changer un ImageButton, mais là ça a l'air different
ca sera plus simple avec un exemple:
Code : Tout sélectionner
UsePNGImageDecoder()
ImageNew = LoadImage(#PB_Any, #PB_Compiler_Home+"Examples\Sources\Data\ToolBar\New.png")
ImageSave = LoadImage(#PB_Any, #PB_Compiler_Home+"Examples\Sources\Data\ToolBar\Save.png")
ImageDeRemplacement = LoadImage(#PB_Any, #PB_Compiler_Home+"Examples\Sources\Data\ToolBar\Copy.png")
If OpenWindow(0, 200, 200, 200, 100, "Exemple MenuItem")
If CreateImageMenu(0, WindowID(0))
MenuTitle("&Projet")
MenuItem(1, "Nouveau", ImageID(ImageNew))
MenuItem(2, "&Enregistrer", ImageID(ImageSave))
MenuItem(3, "Changer icone de 'Nouveau' et simuler un clic sur 'Nouveau")
EndIf
Repeat
;- 00 - Capture des évenements utiles à cette application
Event = WindowEvent()
WEvent = EventWindow() ;Fenetre qui a provoqué l'évement
MEvent = EventMenu() ;Menu qui a provoqué un évenement
GEvent = EventGadget() ;Gadget qui a provoqué un évenement
TEvent = EventType() ;Type qui génére un évenement
Select MEvent
Case 1
Debug "1"
Case 2
Debug "2"
Case 3
;changer icone de 'Nouveau" par ImageID(ImageDeRemplacement)
;??
; simuler un clic sur 'Nouveau' ((doit donc debbuger '1'))
;??
EndSelect
Until Event =#PB_Event_CloseWindow
EndIf
Re: MenuItem avec image intégrée
Publié : jeu. 22/mai/2014 12:15
par falsam
Si tu utilises CreateImageMenu() tu ne pourras pas nativement changer les images de chaque item.
La solution serait de passer par le menu normal et associer une API (Windows uniquement) pour ajouter une image à ton item de menu.
■ Pour chaque item de ton menu, on va affecter une image normal et une image de remplacement.
Exemple :
SetMenuItemBitmaps_(MenuID(Menu), Item, #MF_BYCOMMAND, ImageID(ImageNormal), ImageID(ImageDeRemplacement))
■ Dans ta boucle événementielle tu vas tester quel est l'item qui a été sélectionné et tester l'état actuel de l'élément pour connaitre l'image qui est active (
0 Premiere image, 1 : Deuxième image)
Code : Tout sélectionner
Enumeration Window
#MainForm
EndEnumeration
Enumeration Menu
#Menu
#MenuCreate
#MenuSave
EndEnumeration
UsePNGImageDecoder()
ImageNew = LoadImage(#PB_Any, #PB_Compiler_Home+"Examples\Sources\Data\ToolBar\New.png")
ImageSave = LoadImage(#PB_Any, #PB_Compiler_Home+"Examples\Sources\Data\ToolBar\Save.png")
ImageDeRemplacement = LoadImage(#PB_Any, #PB_Compiler_Home+"Examples\Sources\Data\ToolBar\Copy.png")
If OpenWindow(#MainForm, 200, 200, 200, 100, "Exemple MenuItem")
If CreateMenu(#Menu, WindowID(#MainForm))
MenuTitle("&Projet")
;Creation d'un menu normal
MenuItem(#MenuCreate, "Nouveau")
MenuItem(#MenuSave, "&Enregistrer")
;Ajout des images normal et image de remplacement (API)
SetMenuItemBitmaps_(MenuID(#Menu), #MenuCreate, #MF_BYCOMMAND, ImageID(ImageNew), ImageID(ImageDeRemplacement))
SetMenuItemBitmaps_(MenuID(#Menu), #MenuSave, #MF_BYCOMMAND, ImageID(ImageSave),ImageID(ImageDeRemplacement))
EndIf
Repeat
;Capture des évenements utiles à cette application
Event = WindowEvent()
WEvent = EventWindow() ;Fenetre qui a provoqué l'évement
MEvent = EventMenu() ;Menu qui a provoqué un évenement
GEvent = EventGadget() ;Gadget qui a provoqué un évenement
TEvent = EventType() ;Type qui génére un évenement
Select Event
Case #PB_Event_Menu ;Un evenement menu se produit
Select MEvent
Case #MenuCreate
If GetMenuItemState(#Menu, #MenuCreate) = 0
SetMenuItemState(#Menu, #MenuCreate, 1)
;le reste de ton code
Else
SetMenuItemState(#Menu, #MenuCreate, 0)
;le reste de ton code
EndIf
Case #MenuSave
;Idem avec ton image de remplacement
EndSelect
EndSelect
Until Event =#PB_Event_CloseWindow
EndIf
PS : Tu as encore un souci de compréhension dans la gestion des événements.
Regarde ce tutoriel sur la gestion des événements.
http://www.purebasic.fr/french/viewtopi ... 1296#p1296
Re: MenuItem avec image intégrée
Publié : jeu. 22/mai/2014 13:32
par falsam
Sans passer par une image de remplacement tu peux utiliser les fonctions natives de Pure Basic pour afficher le symbole Check sur l'image de ton item.
Code : Tout sélectionner
Enumeration Window
#MainForm
EndEnumeration
Enumeration Menu
#Menu
#MenuCreate
#MenuSave
EndEnumeration
UsePNGImageDecoder()
;Chargement des images
ImageNew = LoadImage(#PB_Any, #PB_Compiler_Home+"Examples\Sources\Data\ToolBar\New.png")
ImageSave = LoadImage(#PB_Any, #PB_Compiler_Home+"Examples\Sources\Data\ToolBar\Save.png")
If OpenWindow(#MainForm, 200, 200, 200, 100, "Exemple MenuItem")
If CreateImageMenu(#Menu, WindowID(#MainForm))
MenuTitle("&Projet")
;Creation d'un menu normal
MenuItem(#MenuCreate, "Nouveau", ImageID(ImageNew))
MenuItem(#MenuSave, "&Enregistrer", ImageID(ImageSave))
EndIf
Repeat
;Capture des évenements utiles à cette application
Event = WindowEvent()
WEvent = EventWindow() ;Fenetre qui a provoqué l'évement
MEvent = EventMenu() ;Menu qui a provoqué un évenement
GEvent = EventGadget() ;Gadget qui a provoqué un évenement
TEvent = EventType() ;Type qui génére un évenement
Select Event
Case #PB_Event_Menu ;Un evenement menu se produit
Select MEvent
Case #MenuCreate
If GetMenuItemState(#Menu, #MenuCreate) = 0
SetMenuItemState(#Menu, #MenuCreate, 1)
;le reste de ton code
Else
SetMenuItemState(#Menu, #MenuCreate, 0)
;le reste de ton code
EndIf
Case #MenuSave
If GetMenuItemState(#Menu, #MenuSave) = 0
SetMenuItemState(#Menu, #MenuSave, 1)
;le reste de ton code
Else
SetMenuItemState(#Menu, #MenuSave, 0)
;le reste de ton code
EndIf
EndSelect
EndSelect
Until Event =#PB_Event_CloseWindow
EndIf
Re: MenuItem avec image intégrée
Publié : jeu. 22/mai/2014 18:01
par Patrick88
En chinoisant, c'est un peu dommage que la coche viennent en surimpression de l’icône