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
    Futur Membre du Club
    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
    Points : 9
    Points
    9
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    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".

  3. #3
    Futur Membre du Club
    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
    Points : 9
    Points
    9
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    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;
    }

  5. #5
    Futur Membre du Club
    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
    Points : 9
    Points
    9
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    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...

  7. #7
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    746
    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 : 746
    Points : 3 667
    Points
    3 667
    Par défaut
    On peut aussi ajouter l'option /DNOMINMAX dans la configuration des projets.

  8. #8
    Futur Membre du Club
    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
    Points : 9
    Points
    9
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    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;
    }

  10. #10
    Futur Membre du Club
    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
    Points : 9
    Points
    9
    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