Utilisation de couleurs en mode console [ansi color codes]

Soyez le premier à donner votre avis sur cette source.

Vue 17 139 fois - Téléchargée 738 fois

Description

Voici deux petites classes permettant d'utiliser des couleurs dans le texte en mode console. Les couleurs sont affichées en utilisant les codes de couleur ANSI (ANSI color codes), grâce à des séquences d'échappement. Deux Screenshots sont disponibles dans le ZIP.

Utilisation des classes :
CColor : Pas très compliqué, 2 constructeurs disponibles, plus des méthodes permettant de changer les couleurs/attributs. Pour afficher une couleur, on affiche le résultat de la méthode getColorCode(). On peut effacer l'écran (méthode : cout<<c.clearScreen() ), ou bien réinitialiser la couleur avec reset (qui remet les valeurs à -1) ou resetDefault (qui met les couleurs "DEFAULT_COLOR", généralement blanc sur fond noir).

CColorManager : 2 méthodes permettent d'ajouter des couleurs à la structure. La premiere prend un CColor en paramètre et l'ajoute directement à la suite. La seconde prend trois paramètres (FG, BG, attributs), avec -1 par défaut. Celle-ci prend la couleur courante dans la structure, en crée une copie et la modifie pour prendre en compte les nouvelles valeurs (-1 sont ignorés). La copie modifiée est ajoutée à la suite du tableau. Des méthodes permettent de naviguer parmi les couleurs, et getColorCode retourne le code couleur de la couleur courante, tandis que getCurrentColor retourne l'objet CColor courant.

Remarque : Quand vous ajoutez une couleur, elle est placée juste après la couleur courante, et devient la dernière couleur disponible. Par exemple, si vous ajoutez trois couleurs : rouge, vert, bleu, puis vous revenez au début (méthode firstColor() ), et ajoutez jaune, alors il n'y aura plus que 2 couleurs : rouge, puis jaune.

Source / Exemple :


#ifndef CCOLOR_H_INCLUDED
#define CCOLOR_H_INCLUDED

//#define COLORS_ENABLED

#define ATTRIB_NONE             0
#define ATTRIB_BOLD             1
#define ATTRIB_ITALIC           2
#define ATTRIB_UNDERLINE        4
#define ATTRIB_BLINK            8
#define ATTRIB_REVERSE          16
#define ATTRIB_CONCEALED        32
#define ATTRIB_STRIKETHROUGH    64

#define BLACK         0
#define RED           1
#define GREEN         2
#define YELLOW        3
#define BLUE          4
#define PINK          5
#define CYAN          6
#define WHITE         7
#define DEFAULT_COLOR 8

class CColor
{
private:
    //Couleurs de fond et d'ecriture
    int bgColor, fgColor;
    
    //Differents attributs disponibles
    int attributes;
    
    //Remarque : Quand ces variables valent -1, cela signifie qu'elles ne sont
    //pas prises en compte lors de la generation de la sequence d'echappement
    // Comme ca, on peut generer simplement : \033[8m par exemple
    
public:
    //Constructeurs:
    CColor(int foreground=-1, int background=-1, int att=-1);
            
    CColor(const CColor &color){bgColor=color.getBGColor();
                         fgColor=color.getFGColor();
                         attributes=color.getAttributes();}
    
    //Accesseurs
    void setFGColor(int color);
    void setBGColor(int color);
    void setAttributes(int att);
    
    int getBGColor() const{return bgColor;}
    int getFGColor() const{return fgColor;}
    int getAttributes() const{return attributes;}
    
    //Retire un attribut précis
    void removeAttribute(int att);
    
    //Remet les valeurs a -1
    void reset();
    //Restaure les valeurs par defaut
    void resetDefault();
    
    //Retourne la séquence d'échappement correspondante...
    char *getColorCode() const;
    
    //Efface l'écran
    char *clearScreen() const;
};

#endif //CCOLOR_H_INCLUDED

Conclusion :


Attention, ce code présente plusieurs restrictions, selon l'OS sur lequel le code est exécuté... (en particulier sous Windows!)
- Windows XP/2k/NT : Ca commence mal ^^ Deux problèmes, déjà... D'abord, ces OS ne supportent pas les séquences d'échappement ANSI dans les applications Win32. Par contre, dans des applications DOS, cela devrait fonctionner, je crois.
D'autre part, l'interpréteur de commande "cmd.exe" ne supporte pas ANSI.SYS, il faut donc utiliser "command.com" à la place.

- Windows 9x (95/98): à priori, cela devrait marcher... Toutefois, je n'ai pas encore eu l'occasion de tester.
- Windows Me : Problème : Apparemment Millenium refuse d'utiliser "Ansy.sys", il faut donc utiliser un utilitaire de remplacement nommé "ANSI.COM". Avec ce dernier, le code devrait fonctionner correctement (je n'ai pas eu l'occasion de tester non plus.).

- pour Unix/Linux, cela devrait fonctionner sans problème.

L'API permet d'utiliser diverses couleurs pour l'arrière-plan (background) et le texte (foreground), ainsi que d'appliquer divers attributs au texte.
Les couleurs sont : noir, rouge, vert, jaune, bleu, rose, cyan, blanc. On peut utiliser ces couleurs comme couleur de fond (background color) ou couleur d'écriture (foreground color)
Les attributs sont :
- BOLD = gras. En réalité cet attribut devrait plutot s'appeler "BRIGHT", puisqu'il rend les couleurs plus "lumineuses".
- ITALIC
- UNDERLINE (souligné)
- BLINK (clignotant)
- REVERSE (inversé - inversion de la couleur de fond et d'écriture)
- CONCEALED (caché : texte invisible, pour les mots de passe par exemple..)
- STRIKETHROUGH (barré)

Dernière remarque concernant la "portabilité": Tous les attributs ne sont pas compatibles avec tous les terminaux. Ainsi, certains terminaux seront capables d'afficher du texte souligné, tandis que d'autres ne pourront pas le faire.
Moi par exemple, j'ai testé deux cas :
- D'une part, avec CYGWIN (version récente), sous Windows, je peux utiliser seulement les attributs BOLD, REVERSE et CONCEALED (qui en réalité se contente de mettre la couleur d'écriture en noir : si la couleur de fond est modifiée, on voit le texte écrit en noir...). En outre, les attributs BLINK et UNDERLINE n'ont pas l'effet souhaité mais modifient les couleurs.
- D'autre part, avec la version de Linux que j'ai essayée (Knoppix 3.4), les attributs BOLD, UNDERLINE, REVERSE et BLINK fonctionnent parfaitement (meme si ca ne se voit pas sur le screenshot, le mot BLINK clignotait effectivement). En revanche, CONCEALED n'a aucun effet.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

patigab
Messages postés
1
Date d'inscription
samedi 2 décembre 2006
Statut
Membre
Dernière intervention
2 décembre 2006

Tres interessant, merci a toi ça me sera d'une bonne aide pour mieux comprendre le fonctionnement des codes ansi dans un terminal.
cs_bugmenot
Messages postés
7
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
20 décembre 2005

Absolument super sympa d'offrir ce code à tout le monde !

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.