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

Code : Tout sélectionner

MenuItem(Element, Texte$ [, ImageID]) 
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.

:idea: 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 :mrgreen: 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.
:idea: 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