IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[C#] Icones dans MenuItem


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Par défaut [C#] Icones dans MenuItem
    Je voudrais mettre des icones dans des MenuItem comme dans quasiment n'importe quelle appli mais dans le constructeur de MenuItem, il n'y a pas d'image contrairement a Java.
    Si quelqu'un sait ...

  2. #2
    doccpu
    Invité(e)
    Par défaut
    dans la vertion 2.0 du framework il existe des surcharge du constructeur qui te permettent de passer un Image en parametres.

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Par défaut
    Pas de chance pour moi, je dois utiliser la version 1.1 du Framework pour l'instant.

  4. #4
    doccpu
    Invité(e)
    Par défaut
    ca depend d'ou tu te place en 2.0 pas d'odbc avec ado c pas cool pour moi !

  5. #5
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Bon voilà mes suggestions. Comme tu ne peux échappé à l'implementation perso du OwnerDraw et que tu souhaites pouvoir d'autre part utiliser de façon répété ce genre de MenuItem.
    J'en conclue
    • 1. que tu dois dériver ta propre classe MenuItemWithIcon qu tu pourras compiler dans une librairie perso de contrôles
      2. que tu dois coder un champs Icon qui peut être assigner par une surcharge spécifique du constructeur.
      3. que tu dois implementer au moins les méthodes OnMeasureItem et OnDrawItem


    Exemple (à verifier car mon C# n'est pas au top et je n'ai pas testé les valeurs que j'ajoute ici de mémoire sur les hauteurs et largeurs)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
     
    using System;
    using System.ComponentModel;
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Drawing.Text;
    using System.Reflection;
    using System.Resources;
    using System.Windows.Forms;
     
    public class MenuItemWithIcon : MenuItem
    {
       //les champs pour Icon et Font
       private Icon icone;
       private Font f;
       //...
     
       //le constructeur  avec Icon
       public MenuItemWithIcon(string texte, Icon icone, EventHandler onClick, Shortcut shortcut) : base(texte, onClick, shortcut )
       {
          //très important
          this.OwnerDraw = true;
          //une valeur par defaut du Font
          this.f = new Font( "Arial", 8 );
          this.icone = icone;
       }
     //...
     
       // les accesseurs pour Icon et Font
       public Font Font
       {
          get { return this.f; }
          set { this.f= value; }
       }
       public Icon Icon
       {
          get { return this.icone; }
          set { this.icone = value; }
       }
      //...
     
      //une petite méthode pour determiner le texte complet qui s'affiche
      private string GetFulltext()
      {
        string texte = this.Text;
        // En fonction du raccourci à afficher
        if ( this.ShowShortcut && (this.Shortcut != Shortcut.None) )
        {
           Keys k = (Keys) this.Shortcut;
           TypeConverter t = TypeDescriptor.GetConverter(typeof(Keys))
           texte += "\t" + t.ConvertToString(k);
        }
        return texte;
      }
      //...
     
      //surcharge OnMeasureItem lorsque le Menu aura besoin
      //de connaître la taille du menuitem avant de le dessiner
      protected override void OnMeasureItem(MeasureItemEventArgs e)
      {
          base.OnMeasureItem(e);
     
          //determiner un format à adopter
          StringFormat sf = new StringFormat();
          sf.HotkeyPrefix = HotkeyPrefix.Show;
          sf.SetTabStops(60, new float[] {0});
     
          //recuperer le texte complet
          string texte = this.GetFulltext()
     
         //determiner la taille de l'item
         SizeF s = (int) e.Graphics.MeasureString(texte, this.f, 10000, sf)
         e.ItemHeight = s.Height + 10;
         e.ItemWidth = s.Width + 10;
     
         sf.Dispose();
         sf = null;
      }
      //...
     
      //surcharge OnDrawItem lorsque le Menu
      //demande à dessiner le menuitem
      {
         base.OnDrawItem(e);
     
         Brush b;
         Rectangle r = e.Bounds;
     
         // si icone
         if (this.icone != null )
         {e.Graphics.DrawIcon(this.icone, r.Left + 2, r.Top + 2 );
     
         r.X += 24;
         if ((e.State & DrawItemState.Selected) != 0)
         {
            // si selectionné
            b = new LinearGradientBrush( r, SystemColors.Highlight, SystemColors.Control, 0f );
         }
         else
          {br = SystemBrushes.Control;}
     
        //dessiner menutem
        e.Graphics.FillRectangle(b, r);
     
        //dessiner la chaine de caractère
        StringFormat sf = new StringFormat();
        sf.HotkeyPrefix = HotkeyPrefix.Show;
        sf.SetTabStops(60, new float[] {0});
        string texte = this.GetFulltext()
        b = new SolidBrush(e.ForeColor);
        e.Graphics.DrawString(texte, this.f, b, r.Left + 25, r.Top + 2, sf);
     
        b.Dispose();
        b = null;
        sf.Dispose();
        sf = null;
      } 
    }

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Par défaut
    Merci beaucoup pour cet exemple. Je vais tester ça.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Icones dans un MenuItem
    Par Socrat dans le forum C++Builder
    Réponses: 1
    Dernier message: 08/10/2007, 13h17
  2. Icone dans barre taches napparait pas tjr(lancement session)
    Par souch dans le forum Composants VCL
    Réponses: 4
    Dernier message: 16/06/2004, 10h51
  3. icon dans treeview ou listview
    Par Sebinou dans le forum C++Builder
    Réponses: 12
    Dernier message: 31/03/2004, 00h29
  4. Afficher une icone dans DBgrid
    Par boyerf dans le forum Bases de données
    Réponses: 4
    Dernier message: 29/02/2004, 15h45
  5. Comment gérer plusieurs icones dans son exécutable ?
    Par declencher dans le forum Langage
    Réponses: 5
    Dernier message: 15/10/2003, 10h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo