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# ajout une proprieté couleur perso dans un boutonPerso


Sujet :

Windows Forms

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4
    Points : 2
    Points
    2
    Par défaut c# ajout une proprieté couleur perso dans un boutonPerso
    Bonjour tout le monde, j'ai fait une classe monBouton pour pouvoir faire un bouton clignotant... jusque là tout va bien: ça clignote et ca fait ce que je veux... Ce que je voudrais maintenant c'est intégrer une palette de couleurs personnalisée en temps que "propriété" lors de la création de mon bouton...
    Si dans ma classe je rajoute "public Color maCouleur {get; set;}" ca me rajoute bien l'accés à la couleur mais au lieux des 85 nuances de couleurs, je ne voudrais en avoir que 3...
    Comment faire SVP?
    Dans le même genre, je voudrais que les propriétés il y ai une liste déroulante me permettant de choisir si mon bouton est "normal" ou "clignotant"....

  2. #2
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par Beltitou Voir le message
    Bonjour tout le monde, j'ai fait une classe monBouton pour pouvoir faire un bouton clignotant... jusque là tout va bien: ça clignote et ca fait ce que je veux... Ce que je voudrais maintenant c'est intégrer une palette de couleurs personnalisée en temps que "propriété" lors de la création de mon bouton...
    Si dans ma classe je rajoute "public Color maCouleur {get; set;}" ca me rajoute bien l'accés à la couleur mais au lieux des 85 nuances de couleurs, je ne voudrais en avoir que 3...
    Comment faire SVP?
    Dans le même genre, je voudrais que les propriétés il y ai une liste déroulante me permettant de choisir si mon bouton est "normal" ou "clignotant"....
    Tu peux définir ton énumération de couleur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Public Enum EMaPalette
        Bleu = ...
        Rouge = ...
        Jaune = ....
    End Enum
    où il faudra remplacer les "..." par la valeur de ta couleur (en argb par exemple).

    Ensuite dans ta propriété tu pourra faire un Color.FromArgb(c As EMaPalette).

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4
    Points : 2
    Points
    2
    Par défaut je n'y arrive pas....
    Bonsoir ZenZiTone... j'ai bien essayé d'implémenter mon code suivant tes infos mais ca ne fonctionne pas....
    je vais essayer de donner plus d'explications car je me suis surement mal fait comprendre.....

    Mon "boutonTest" est un CustomControl défini par ce code:

    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
     
    namespace test
    {
        public partial class boutonTest : Control
        {
            public boutonTest()
            {
                InitializeComponent();
            }
     
            #region VARIABLES
            //la couleur du bouton
            private Color couleurBouton;
     
            //couleur possibles du bouton
            private Color couleurBleu = Color.Blue;
            private Color couleurRouge = Color.Red;
            private Color couleurVert = Color.Green;
     
     
            public Color CouleurBouton{get; set;}
            #endregion
     
            #region FONCTIONS
            protected override void OnPaint(PaintEventArgs _paintEventArgs)
            {
                Graphics g = _paintEventArgs.Graphics;
                DrawButton(g);
                base.OnPaint(_paintEventArgs);
            }
     
            private void DrawButton(Graphics g)
            {
                Rectangle rect1 = new Rectangle(0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height);
                LinearGradientBrush gBrushCold = new LinearGradientBrush(this.ClientRectangle, CouleurBouton, CouleurBouton, LinearGradientMode.Vertical);
                g.FillRectangle(gBrushCold, rect1);
            }
     
            #endregion
     
        }
    }
    la ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
           public Color CouleurBouton{get; set;}
    me permet d'obtenir ça:
    Nom : pb-01.jpg
Affichages : 855
Taille : 78,5 Ko

    moi je ne voudrais avoir que 3 couleurs possibles: Bleu Rouge Vert pour pouvoir assigner la couleur selectionnée à:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            private Color couleurBouton;
    pour pouvoir definir mon dégradé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                LinearGradientBrush gBrushCold = new LinearGradientBrush(this.ClientRectangle, CouleurBouton, CouleurBouton, LinearGradientMode.Vertical);
    j'espere avoir ete plus precis et plus clair....
    merci d'avance à vous tous et toutes....

  4. #4
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Points : 96
    Points
    96
    Par défaut
    zenzitone t'as donné la bonne façon de faire.
    couleurBouton est private donc non visible de l’extérieur et non attribué par le set de CouleurBouton
    De plus il faudrait que CouleurBouton soit du type enum plutôt que color. tu vois le truc ?

  5. #5
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    Pour afficher une palette restreinte à un nbre donne de couleurs il faut :

    1/ Creer un Editeur de Proprietes :
    - c'est Class Custom herite de UITypeEditor designe par Editeurppelee (namespace System.Drawing.Design)...
    - ce class est charge de "dialoguer" avec le Property Browser de VS...
    - au "click" sur ta prop CouleurButton1 ou CouleurButton1 (type Enum) il demande au Property Browser d'afficher ta palette Perso(à dessiner) sur un Custom UserControl que ...tu es charge de "customiser"... !!!

    2/ Creer le Custom UserControl en question contient simplement dans l'exemple
    - 2 lignes de Button à raison de 3 par lignes regulierment espaces.
    - pour chaque button on fait prop BackColor egale Valeur de l'Enum...
    - au click sur un bouton -d'index - I - on renvoie l'index-I- caste en Enum au Property Browser...

    3/Decorer tes 2 prop CouleurButton1 & CouleurButton1 de ton Class Custom MonBouton de l'Attribut:
    [EditorAttribute(typeof(UserColorEditor), typeof(UITypeEditor))]


    Cet attribut de prop indique au Property Browser de VS qu'il doit utiliser -le Class UserColorEditor herite de UITypeEditor -
    de type UITypeEditor] pour editer tes 2 props CouleurButton1 & CouleurButton1...

    Un attribut est un code declaratif qui evite d'ecrire du code...

    La seule complication dans ton cas c'est que ton Enum utilise des variables en "francais" et que -le class static Colors de l'API .NET - utilise des couleurs nommees à l'"anglaise"...
    D'ou la necessite d'un Dictionary (voir DicoCouleurs ci-dessous) qui fait correspondre :
    - à chaque valeur de la variable Enum une couleur "nommee à l'anglaise"....

    Remarque au passage qu'un Enum "arabe" serait encore plus casse-pied !!!

    bref voice le code qui je l'espere fera ton Bonheur :


    1/ code behind .cs de l'Enum CouleurButton revu:
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Drawing;
     
    namespace WinTestColorControl
    {
        public enum CouleurBouton
        {
            Bleu,
            Rouge,
            Vert,
            Jaune,
            Rose,
            Pourpre,
            None
         }
        // DICTIONNAIRE "TRANSLATEUR" VU TON ENUM FRANCAIS
        public class DicoCouleurs : Dictionary<CouleurBouton, Color>
        {
            public DicoCouleurs()
            {
                this.Add(CouleurBouton.Bleu, Color.Blue);
                this.Add(CouleurBouton.Rouge, Color.Red);
                this.Add(CouleurBouton.Vert, Color.Green);
                this.Add(CouleurBouton.Jaune, Color.Yellow );
                this.Add(CouleurBouton.Rose , Color.Pink );
                this.Add(CouleurBouton.Pourpre, Color.Purple );
                this.Add(CouleurBouton.None, Color.Transparent);
            }
        }
    }
    2/ code behind .cs de l'UserColorEditor ou Editeur de Proprietes:

    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Drawing.Design;
    using System.Windows.Forms.Design;
    using System.Drawing;
     
    namespace WinTestColorControl
    {
        public class UserColorEditor : System.Drawing.Design.UITypeEditor
        {
     
     
            public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
            {
                return UITypeEditorEditStyle.DropDown;
            }
            public override bool GetPaintValueSupported(System.ComponentModel.ITypeDescriptorContext context)
            {
                return true;
            }
            public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, IServiceProvider provider, object value)
            {
     
                IWindowsFormsEditorService editor_service =
                    (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
     
                if (editor_service == null) return value;
     
                CouleurBouton clrBouton = (CouleurBouton)value;
     
     
                //Make the editing control.
     
                ColorUserControl editor_control = new ColorUserControl(clrBouton, editor_service);
     
                //Display the editing control.
     
                editor_service.DropDownControl(editor_control);
     
     
                // return CurrentColor.
     
                return editor_control.CurrentColor;
     
     
            }
     
        }
    }

    3/ code behind .cs du ColorUserControl (UserControl afficheur de palette):

    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
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Windows.Forms.Design;
     
    namespace WinTestColorControl
    {
        [ToolboxItem(false)]
        public partial class ColorUserControl : UserControl
        {
            //champs prives 
            private CouleurBouton m_couleurBouton;
            private IWindowsFormsEditorService m_editor_service;
     
            private DicoCouleurs LesCouleurs = new DicoCouleurs();
     
     
            //prop enum
            private CouleurBouton couleurBouton = CouleurBouton.None;
            public CouleurBouton CurrentColor
            {
                get { return couleurBouton; }
                set { couleurBouton = value; }
            }
     
     
            public ColorUserControl(CouleurBouton clrBouton, IWindowsFormsEditorService editor_service)
            {
     
                this.m_couleurBouton = clrBouton;
                this.m_editor_service = editor_service;
     
     
                this.BackColor = Color.White;
                this.BorderStyle = BorderStyle.FixedSingle;
                this.AutoSize = true;
                this.AddButtons();
     
            }
     
     
     
          // ajout de  2 lignes de boutons (3 boutton /ligne)
            private void AddButtons()
            {
     
                DicoCouleurs dico = new DicoCouleurs();
     
                int w = 40;
     
                int decalage = w + 2;
                Button box;
     
                int numButton = 1;
                int x = 0;
                int y = 0; 
                foreach (KeyValuePair<CouleurBouton, Color> kvp in dico)
                {
                    box = new Button();
                    box.AutoSize = false;
                    box.Size =new Size(w,w);
                    box.Location = new Point(x,y);
                    box.BackColor = kvp.Value ;
                    box.Text = kvp.Value.Name;
     
                    box.Click += new EventHandler(box_Click);
                    this.Controls.Add(box);
     
     
                    x += decalage;
                    numButton += 1;
     
                    if (numButton % 4 == 0)
                    { 
                        x = 0;
                        y += w;
                    }
                }
     
     
            }
     
            void box_Click(object sender, EventArgs e)
            {
                (sender as Button).Focus();
     
                //vonvert index to enum CouleurBouton
                CurrentColor = (CouleurBouton)this.Controls.IndexOf((sender as Button));
     
                this.m_editor_service.CloseDropDown();
     
            }
     
        }
    }
    Et
    4/ code behind .cs de MonButton revu:

    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
     
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing.Design;
    using System.Drawing.Drawing2D;
     
    namespace WinTestColorControl
    {
        public partial class MonButton : Control
        {
            private DicoCouleurs MesCouleurs = new DicoCouleurs(); 
     
            private CouleurBouton  couleurBouton1 = CouleurBouton.None ;
            [EditorAttribute(typeof(UserColorEditor), typeof(UITypeEditor))]
            public CouleurBouton CouleurBouton1
            {
                get { return couleurBouton1; }
                set
                {
                    couleurBouton1 = value;
                    this.Invalidate();
                }
            }
     
            private CouleurBouton couleurBouton2  = CouleurBouton.None ;
            [EditorAttribute(typeof(UserColorEditor), typeof(UITypeEditor))]
            public CouleurBouton    CouleurBouton2
            {
                get { return couleurBouton2; }
                set
                {
                    couleurBouton2 = value;
                    this.Invalidate();
                }
            }
            public MonButton()
            {
                InitializeComponent();
            }
     
            protected override void OnPaint(PaintEventArgs pe)
            {
                Graphics g = pe.Graphics;
                DrawButton(g);
                base.OnPaint(pe);
            }
            private void DrawButton(Graphics g)
            {
     
                Rectangle rect1 = new Rectangle(0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height);
     
     
                Color clr1 = MesCouleurs[couleurBouton1];
                Color clr2 = MesCouleurs[couleurBouton2];
                LinearGradientBrush gBrushCold = new LinearGradientBrush(
                    this.ClientRectangle,
                    clr1, clr2,
                    LinearGradientMode.Vertical);
     
                g.FillRectangle(gBrushCold, rect1);
            }
        }
    }
    Generer et dropper sur un Form ....
    Remaque : si tu veux veut une liste deroulante de couleur ,le UserControl devient un ListBox Custom (herite de ListBox) ....
    bon code....

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci Mabrouki, j'essaie de digérer tout ça et si tout va bien, je tag ce post comme resolu.

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 153
    Points : 25 071
    Points
    25 071
    Par défaut
    moi aussi en lisant le post j'ai pensé à l'éditeur
    mais la solution de ZenZiTone est beaucoup mieux, la fainéantise est une bonne qualité chez un développeur (pas ne vouloir rien faire, mais en faire le moins possible, car ça fait du code moins buggé et plus maintenable)
    et là ca fait le même résultat avec 3 lignes de code au lieu de 200 (pour 3 choix un éditeur de propriété c'est un peu le char pour tuer une mouche)

    essaie plutot de comprendre comment faire ca avec une enum et un switch, tu gagneras du temps


    pour le clignotant du rajoutes une propriété booléen Clignotant
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par Beltitou Voir le message
    Bonsoir ZenZiTone... j'ai bien essayé d'implémenter mon code suivant tes infos mais ca ne fonctionne pas....

    moi je ne voudrais avoir que 3 couleurs possibles: Bleu Rouge Vert pour pouvoir assigner la couleur selectionnée à:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            private Color couleurBouton;
    Pour n'afficher que les couleurs qui t'intéressent (celles de l'énumération EMaPalette), il faut donc que ta propriété couleurBouton soit du type EMaPalette (et non Color).

    Ensuite pour exploiter la couleur tu peux faire un Color.FromArgb(couleurBouton).

    Pour aller plus loin, tu peux définir ton type de couleur dans une classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Class MaCouleur
     
    Public Function Get(EMaPalette Couleur) As Color
    Return Color.FromArgb(Couleur)
    End Function 
     
    End Class
     
    Public Enum EMaPalette
        Bleu = ...
        Rouge = ...
        Jaune = ....
    End Enum

  9. #9
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Points : 96
    Points
    96
    Par défaut
    C'est pour moi la meilleur solution !
    simple et efficace, comme déjà dit

Discussions similaires

  1. Comment ajouter une feuille MDI fille dans une DLL ?
    Par Najdar dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 13/02/2007, 16h30
  2. Ajouter une image en filigrane dans Word2000
    Par blaiso dans le forum VBA Word
    Réponses: 1
    Dernier message: 29/12/2006, 12h47
  3. ajouter une ou deux séries dans un graphique
    Par rob2-9 dans le forum Access
    Réponses: 1
    Dernier message: 11/08/2006, 13h40
  4. Réponses: 5
    Dernier message: 27/03/2006, 10h29
  5. [WxPython] Ajouter une coche de selection dans un menu
    Par p_ping dans le forum wxPython
    Réponses: 4
    Dernier message: 23/01/2006, 22h45

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