MenuItem avec image intégrée

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

MenuItem avec image intégrée

Message 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
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: MenuItem avec image intégrée

Message 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
Dernière modification par falsam le mar. 20/mai/2014 21:09, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: MenuItem avec image intégrée

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
david
Messages : 208
Inscription : jeu. 03/févr./2005 21:10

Re: MenuItem avec image intégrée

Message 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
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: MenuItem avec image intégrée

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: MenuItem avec image intégrée

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Re: MenuItem avec image intégrée

Message par Patrick88 »

En chinoisant, c'est un peu dommage que la coche viennent en surimpression de l’icône
Répondre