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 :

Changer les couleurs (thème) pour toute une application.


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 47
    Points : 43
    Points
    43
    Par défaut Changer les couleurs (thème) pour toute une application.
    Bonjour, je conçois une application depuis déjà quelques semaines. Je m'étais fait imposé un thème de couleur (teintes de verts) au début du projet. Cependant, je viens de me faire demander de faire deux thèmes différents (teintes de vert ou teintes de doré) selon un choix de l'utilisateur. Je me demandais s'il y avait une façon "short and sweet" de changer les couleurs de tous les contrôles de mon application. Voici la solution à laquelle j'avais pensé :

    Me créer un objet de couleurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class MyColors()
    {
          public Image bgImage;
          public Color color1;
          public Color color2;
          ....etc
    }
    Ensuite, créer une instance publique de cet objet dans une classe et faire une fonction qui modifie les couleurs. Dans le genre :

    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
     
    public class GlobalClass()
    {
          public MyColors couleurs = new MyColors();
     
          public void ChangeColors(int color)
          {
               if(color == 1)
               {
                    couleurs.color1 = Color.Green;
                    etc...
               }
               else
               {
                   couleurs.color1 = Color.Gold; ....etc
               }
          }
    }
    puis dans le Form_Load de chacune de mes fenêtres, associer tous mes contrôles à une couleur spécifique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    txtTest.BackColor = GlobalClass.couleurs.color1;
    Je crois qu'il est important de mentionner qu'en tout j'ai environ 5 couleurs différentes de contrôles ainsi qu'une dizaine d'images (pour des boutons, etc).
    Lorsque l'usager changerait la couleur (qui peut se faire seulement dans la page principale de l'application), je devrais démarrer une nouvelle instance de l'application et fermer celle en cours.

    Est-ce que quelqu'un a une meilleure solution que celle que j'ai proposée ci-haut ? Votre aide serait grandement appréciée. Merci beaucoup !

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Je tenterais en premier lieu d'utiliser les settings pour lié les propriétés graphiques des contrôles à des variables, persistantes en plus.

    Ainsi il suffit d'implémenter une procédure qui modifie ces variables settings (Avec un bon gros select pour le plus simple)

    http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx

    Bien entendu pour éviter de te tapper la création du liens sur chaque contrôle (et aussi rendre l'évolution de ton application plus agréable et éviter les oublis) tu peux aussi crée tes propres composant en dérivant ceux de base. Enfin bon c'est la cerise sur le gateau ça.

    Il y a bien entendu aussi la possiblité d'utiliser le concept des styles Visuel du système d'exploitation (si tu changes la couleur des boutons de gris à rouge dans les propriétés windows, alors les boutons de ton application vont aussi virer au rouge (pour autant que tu n'as pas changer la valeur initiale du controle of course...). Cette solution est même plus correct d'un point de vue ergonomique (unicité du comportement des applications) mais je garantis pas le succès de l'argument chez celui qui t'as fait la demande...

  3. #3
    Membre éprouvé Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Points : 1 188
    Points
    1 188
    Par défaut
    Bonsoir,

    tu peux faire comme ça :

    définir une classe thème (à toi de mettre toutes les variables dont tu auras besoin) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        public class Theme
        {
            public Color CouleurFond { get; private set; }
            public Color CouleurBourdures { get; private set; }
     
            public static List<Theme> AvailableThemes { get; private set; }
     
            static Theme()
            {
                AvailableThemes = new List<Theme>(2);
                AvailableThemes.Add(new Theme() { CouleurFond = Color.Green, CouleurBourdures = Color.GreenYellow });
                AvailableThemes.Add(new Theme() { CouleurFond = Color.Gold, CouleurBourdures = Color.Goldenrod });
            }
        }
    une classe qui gère les thèmes ou bien tu peux la laisser dans la classe thème mais c'est à toi de choisir :

    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
        public delegate void ThemeChangedEventHandler(Theme newTheme);
        public static class ThemeManager
        {
            private static Theme _currentTheme;
     
            public static event ThemeChangedEventHandler ThemeChanged;
            public static Theme CurrentTheme
            {
                get
                {
                    return _currentTheme;
                }
                set
                {
                    if (_currentTheme != value)
                    {
                        _currentTheme = value;
                        if (ThemeChanged != null)
                            ThemeChanged(_currentTheme);
                    }
                }
            }
     
            static ThemeManager()
            {
                CurrentTheme = Theme.AvailableThemes.First();
            }
     
        }
    et dans ton form :

    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
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                ThemeManager.ThemeChanged += new ThemeChangedEventHandler(ThemeManager_ThemeChanged);
            }
     
            protected override void OnInvalidated(InvalidateEventArgs e)
            {
                this.BackColor = ThemeManager.CurrentTheme.CouleurFond;
                //tu peux aussi itérer sur tous les controls enfants...
                base.OnInvalidated(e);
            }
            void ThemeManager_ThemeChanged(Theme newTheme)
            {
                this.Invalidate(true);
            }
        }
    ou bien créer une Form qui te sert de base pour toutes tes forms qui hérite de Form pour lui ajouter ce mécanisme.

    bon dév.
    Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

    N'oubliez pas de avant de
    Pas de question techniques par MP, c'est contre la philosophie du forum

  4. #4
    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 duffmere
    As -tu oublie que les controles poses sur un form heritent tous du form son BackColor et son ForeColor,sa font et son style etc..... ce que on designe par "Ambients Properties" car le form est leur "ambiance" si on peut cela.........
    L'interet d'une ambient property est que si l'on change par exemple le backcolor ,forecolor ,font et style d'un form ceux des controles poses dessus se font gratis......à une condition que tu n'ais pas change les "ambients" props de tes controles en dur comme l'as dit Sinople....

    Autrement dit voici un exemple de form appele "frmColorChanger" qui illustre l'interet des prop "ambients" .Il affiche les couleurs KnownColor du System et d'un simple clic sur le listboxbackolor change le backcolor de tous les controles,idem pour forecolor avec le 2eme listbox....
    les prop ambientes sont ce qu'il y a de plus "short and sweet" comme tu l'as dit ..sans redemarrage de l'appli.....
    De plus n'oublies pas que tu acces à toutes les formes de ton appli dans la collection :Application.OpenForms
    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
     
    Public Class frmColorChanger
        Private Sub ColorChanger_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
            Dim colorNames() As String
            colorNames = System.Enum.GetNames(GetType(KnownColor))
            Me.ListBoxChoiceBackColors.Items.AddRange(colorNames)
            Me.ListBoxChoiceForeColors.Items.AddRange(colorNames)
            Application.OpenForms
        End Sub
        Private Sub lstColors_SelectedIndexChanged(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles ListBoxChoiceBackColors.SelectedIndexChanged
            Dim selectedColorObject As Object
            selectedColorObject = [Enum].Parse(GetType(KnownColor), ListBoxChoiceBackColors.Text)
            Dim selectedColor As KnownColor
            selectedColor = CType(selectedColorObject, KnownColor)
            Me.BackColor = System.Drawing.Color.FromKnownColor(selectedColor)
            ' Display color information.
            lblBrightness.Text = "Brightness = " & _
            Me.BackColor.GetBrightness().ToString()
            lblHue.Text = "Hue = " & Me.BackColor.GetHue().ToString()
            lblSaturation.Text = "Saturation = " & _
            Me.BackColor.GetSaturation().ToString()
        End Sub
     
        Private Sub ListBoxChoiceForeColors_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBoxChoiceForeColors.SelectedIndexChanged
            Dim selectedColorObject As Object
            selectedColorObject = [Enum].Parse(GetType(KnownColor), ListBoxChoiceForeColors.Text)
            Dim selectedColor As KnownColor
            selectedColor = CType(selectedColorObject, KnownColor)
            Me.ForeColor = System.Drawing.Color.FromKnownColor(selectedColor)
            ' Display color information.
            lblBrightness.Text = "Brightness = " & _
            Me.ForeColor.GetBrightness().ToString()
            lblHue.Text = "Hue = " & Me.BackColor.GetHue().ToString()
            lblSaturation.Text = "Saturation = " & _
            Me.ForeColor.GetSaturation().ToString()
        End Sub
     
    End Class
    bon code................

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 47
    Points : 43
    Points
    43
    Par défaut
    Bonjour, premièrement merci beaucoup pour les nombreuses réponses, je n'en attendais pas autant !

    Sinople : Je suis allé lire l'article MSDN sur les variables settings, c'est très intéressant. Si j'ai bien compris ce sont un peu comme des variables globales qu'on peut assigner à l'aide de l'intellisense ? Je vais faire quelques tests avec cette méthode. Cependant, à plusieurs endroit dans mon application j'utilise des images afin de recouvrir un contrôle au lieu d'une couleur, je ne sais pas si on peut avoir recours à cette méthode pour changer des images. Il va falloir que je vérifies par moi-même. Merci !

    sisqo60 : Ta solution ressemble à celle ce que j'avais proposé, j'aime bien l'approche. Le temps d'implémentation est proportionnel au nombre de contrôle dans ton form par contre, et souvent dans mes forms j'ai beaucoup de contrôles. Je ne peux également pas parcourir tous les contrôles de façon itérative et leur assigner une couleur car les contrôles n'ont pas tous la même couleur.

    MABROUKI : Comme je l'ai dit précédemment, j'utilise beaucoup d'images au lieu d'assigner des couleurs à des contrôles et mes contrôles n'ont pas tous la même couleur, je ne crois donc pas que cette façon convienne vraiment à ma situation.

    Merci encore à vous 3, je crois qu'avec ces informations je vais être bon pour me débrouiller.

  6. #6
    Membre éprouvé Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Points : 1 188
    Points
    1 188
    Par défaut
    Bonjour,

    J'ai dormi et j'ai pensé à une solution pour t'éviter de multiplier ton code.
    Connais-tu les méthodes d'extension?

    et une autre qui consiste à créer des controls personnalisés pour tous les types de controls que tu souhaites utiliser....

    C'est long au début, mais tu y gagnes à long terme.
    Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

    N'oubliez pas de avant de
    Pas de question techniques par MP, c'est contre la philosophie du forum

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 47
    Points : 43
    Points
    43
    Par défaut
    Je ne connaissais pas effectivement, j'ai lu la page que tu m'as envoyé, je vais essayer d'investiguer un peu là-dessus ça semble très intéressant. Merci beaucoup !

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

Discussions similaires

  1. Changer les couleurs de section d'une image?
    Par dlalonde dans le forum Général Conception Web
    Réponses: 0
    Dernier message: 23/08/2012, 17h44
  2. [App] Gestion KeyDown pour toute une application
    Par Monkey56 dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 01/03/2011, 18h37
  3. Réponses: 9
    Dernier message: 26/11/2009, 15h30
  4. Quels sont les meilleurs langages pour créer une application non-web (en local) ?
    Par Skeud007 dans le forum Langages de programmation
    Réponses: 11
    Dernier message: 31/08/2007, 16h33

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