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

C++ Discussion :

Ecrire en couleur dans la console


Sujet :

C++

  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 20
    Par défaut Ecrire en couleur dans la console
    Bonjour,
    Réalisant un petit programme C++ en affichage console, j'aimerai que les saisis de l'utilisateur soient de couleur verte, avez-vous une idée de comment le faire ? J'ai trouvé comment mettre de la couleur mais uniquement sur le texte affiché via std::cout ..
    Merci d'avance

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Le C++ standard ne sait pas ce que sait que la couleur. Précise ta plate-forme, et si tu as des limitations du genre "pas le droit d'utiliser une bibliothèque externe".
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 20
    Par défaut
    Bonjour, j'ai bien le droit d'utiliser une bibliothèque externe, je code sur codeblock une application en console

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Donc, ta plate-forme est Windows.

    Et sous Windows, on utilise la fonction SetConsoleTextAttribute().
    Voici un petit code exemple que j'ai testé:
    Code C++11 : 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
    // https://www.developpez.net/forums/d2025942/c-cpp/cpp/ecrire-couleur-console/#post11247709
    #include <iostream>
    #include <string>
    #include <windows.h>
     
    WORD GetTextAttribute()
    {
    	auto info = CONSOLE_SCREEN_BUFFER_INFO();
    	GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);
    	return info.wAttributes;
    }
     
    int main(void)
    {
    	WORD oldAttr = GetTextAttribute();
     
    	std::cout << "Votre nom: " << std::flush;
    	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x02);
    	std::string nom;
    	std::getline(std::cin, nom);
    	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x07);
    	std::cout << "Bonjour " << std::flush;
    	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x0F);
    	std::cout << nom << std::flush;
    	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x07);
    	std::cout << "." << std::endl;
     
    	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), oldAttr);
    	return 0;
    }
    Par contre, c'est lourd et ça ne fait pas très C++, ce qu'on peut corriger en créant notre propre manipulateur de flux:
    Code C++11 : 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
     
    // https://www.developpez.net/forums/d2025942/c-cpp/cpp/ecrire-couleur-console/#post11247709
    #include <iostream>
    #include <string>
    #include <windows.h>
     
    class setcolor
    {
    private:
    	WORD m_attr;
    public:
    	explicit setcolor(WORD attr) : m_attr(attr) {}
     
    	template<typename _CharT, typename _Traits>
    	std::basic_ostream<_CharT, _Traits>& Apply(std::basic_ostream<_CharT, _Traits>& stm)
    	{
    		stm.flush();
    		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), m_attr);
    		return stm;
    	}
    };
     
    template<typename _CharT, typename _Traits>
    std::basic_ostream<_CharT, _Traits>& operator<<(std::basic_ostream<_CharT, _Traits>& stm, setcolor sc)
    {
    	return sc.Apply(stm);
    }
     
     
    WORD GetTextAttribute()
    {
    	auto info = CONSOLE_SCREEN_BUFFER_INFO();
    	GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);
    	return info.wAttributes;
    }
     
    int main(void)
    {
    	WORD oldAttr = GetTextAttribute();
     
    	std::cout << "Votre nom: " << setcolor(0x02);
    	std::string nom;
    	std::getline(std::cin, nom);
    	std::cout << setcolor(0x07) << "Bonjour " << setcolor(0x0F) << nom << setcolor(0x07) << "." << std::endl;
     
    	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), oldAttr);
    	return 0;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 20
    Par défaut
    Bonjour, merci pour votre réponse, cependant lorsque j'inclus cela à mon projet, l'ajout de la bibliothèque windows.h m'empêche d'utiliser des vecteurs :/

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Un point habituel de conflit entre <windows.h> et la bibliothèque standard, c'est que le premier déclare des macros min et max ; un code comme celui-ci résout ce problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include <windows.h>
    #undef min
    #undef max
    //Le reste
    Et sinon, ben tu utilises la compilation séparée, en remplaçant le type WORD par unsigned short dans les déclarations...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 759
    Par défaut
    On peut aussi ajouter l'option /DNOMINMAX dans la configuration des projets.

  8. #8
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 20
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Un point habituel de conflit entre <windows.h> et la bibliothèque standard, c'est que le premier déclare des macros min et max ; un code comme celui-ci résout ce problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include <windows.h>
    #undef min
    #undef max
    //Le reste
    Et sinon, ben tu utilises la compilation séparée, en remplaçant le type WORD par unsigned short dans les déclarations...
    Malheureusement ça ne fonctionne pas

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Dans ce cas, tu sépares:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //ConsoleColor.hpp
     
    unsigned short getConsoleColor(void);
    void setConsoleColor(unsigned short c);
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    //ConsoleColor.cpp
    #include "ConsoleColor.hpp"
    #include <windows.h>
     
    unsigned short getConsoleColor()
    {
    	auto info = CONSOLE_SCREEN_BUFFER_INFO();
    	GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);
    	return info.wAttributes;
    }
     
    void setConsoleColor(unsigned short c)
    {
    	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);
    }
    Code C++ : 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
    //setcolor_manip.hpp
     
    #include <iostream>
    #include <string>
    #include "ConsoleColor.hpp"
     
    class setcolor
    {
    private:
    	unsigned short m_attr;
    public:
    	explicit setcolor(unsigned short attr) : m_attr(attr) {}
     
    	template<typename _CharT, typename _Traits>
    	std::basic_ostream<_CharT, _Traits>& Apply(std::basic_ostream<_CharT, _Traits>& stm)
    	{
    		stm.flush();
    		setConsoleColor(m_attr);
    		return stm;
    	}
    };
     
    template<typename _CharT, typename _Traits>
    std::basic_ostream<_CharT, _Traits>& operator<<(std::basic_ostream<_CharT, _Traits>& stm, setcolor sc)
    {
    	return sc.Apply(stm);
    }
    Code C++ : 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
    //main.cpp
    #include <iostream>
    #include "ConsoleColor.hpp"
    #include "setcolor_manip.hpp"
     
    int main(void)
    {
    	unsigned short oldAttr = getConsoleColor();
     
    	std::cout << "Votre nom: " << setcolor(0x02);
    	std::string nom;
    	std::getline(std::cin, nom);
    	std::cout << setcolor(0x07) << "Bonjour " << setcolor(0x0F) << nom << setcolor(0x07) << "." << std::endl;
     
    	setConsoleColor(oldAttr);
    	return 0;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2019
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 20
    Par défaut
    Ça fonctionne parfaitement ! Merci énormément pour votre aide et votre temps

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

Discussions similaires

  1. Ecrire en couleur dans la console d'éclipse
    Par JamesP dans le forum Eclipse Platform
    Réponses: 9
    Dernier message: 05/08/2009, 22h09
  2. de la couleur dans la console
    Par alexises dans le forum Général Python
    Réponses: 5
    Dernier message: 10/12/2006, 13h39
  3. écrire en couleur dans la console
    Par al85 dans le forum C
    Réponses: 11
    Dernier message: 29/04/2006, 09h50
  4. Couleur dans une console
    Par P'tite Nélodie dans le forum C
    Réponses: 6
    Dernier message: 05/04/2006, 19h42
  5. Couleur dans la console
    Par Tarrke dans le forum C++
    Réponses: 2
    Dernier message: 27/07/2005, 15h27

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