OVH Cloud OVH Cloud

Colors

12 réponses
Avatar
Timour
Bonjour,
J'aimerais savoir si on peut modifer la couleur de la police dans un
programme C ++ ( p.e écrire le fameux Hello World en rouge etc )
Merci de vos réponses.

2 réponses

1 2
Avatar
James Kanze
Timour writes:

|> wrote:

|> > Enfin, à titre d'information, la séquence d'échappement,
|> > c'est '<ESC>[3<n>m' pour la couleur d'affichage, et '<ESC>[4<n>m'
|> > pour la couleur de l'arrière plan, où <ESC>, c'est le
|> > caractère ASCII ESC, et <n>, c'est le numéro de couleur.

|> Je vois, mais je ne sais pas où l'insérer, pourriez-vous
|> l'insérer dans ce source?:

Où tu veux la couleur, évidemment. Mais attention, ce n'est pas si
facile que ça.

|> #include
|> int main()
|> {
|> std::cout << " Hello World !n" ;

La première approximation serait :
try {
std::cout << " " RED "Hello, world!" NORMAL "n" ;
} catch ( ... ) {
std::cout << NORMAL ;
std::cout.flush() ;
abort() ;
}
avec des #define :
#define ESC "33"
#define RED ESC "[31m"
#define NORMAL ESC "[0m"

|> std::cout << " 19

C'est quoi, ça ?

|> return 0;
|> }

Pour expérimenter, je conseillerais quelque chose comme le programme
suivant pour commencer :

#include <ostream>
#include <iostream>
#include <string>

enum Color
{
black ,
red ,
green ,
yellow ,
blue ,
magenta ,
cyan ,
white ,
lastColor ,
firstColor = black
} ;

inline Color&
operator++( Color& c )
{
assert( c < lastColor ) ;
c = static_cast< Color >( c + 1 ) ;
return c ;
}

inline Color
operator++( Color& c, int )
{
Color result = c ;
++ c ;
return result ;
}

char const *const colorNames[] {
"black" ,
"red" ,
"green" ,
"yellow" ,
"blue" ,
"magenta",
"cyan" ,
"white" ,
} ;

char const colorDigits[] = "01234567" ;

std::string
esc()
{
return std::string( 1, '33' ) ;
}

std::string
fgColor( Color c )
{
assert( c >= 0 && c < 10 ) ;
return esc() + "[3" + colorDigits[ c ] + 'm' ;
}

std::string
bgColor( Color c )
{
assert( c >= 0 && c < 10 ) ;
return esc() + "[4" + colorDigits[ c ] + 'm' ;
}

std::string
normal()
{
return esc() + "[0m" ;
}

std::string
centered( std::string const& s, int width )
{
std::string result( s ) ;
int pad = width - result.size() ;
if ( pad > 0 ) {
result.insert( result.begin(), pad / 2, ' ' ) ;
result.insert( result.end(), pad - pad / 2, ' ' ) ;
}
return result ;
}

int
main()
{
for ( Color i = firstColor ; i < lastColor ; ++ i ) {
std::cout
<< bgColor( i ) << centered( colorNames[ i ], 10 ) << normal()
<< fgColor( i ) << centered( colorNames[ i ], 10 ) << normal()
<< 'n' ;
}
return 0 ;
}

Mais comme j'ai déjà dit, méfie-toi de la réalité des
couleurs:-). Sur ma boîte Linux, c'est à peu près correct. Le
blanc, c'est en fait un gris clair, et les autres couleurs sont toutes
un peu plus foncées que je m'y attendrais. Sous Windows, c'est
semblable. Mais dans un XTerm, au moins, ça dépend aussi de la
configuration de chaque utilisateur, de ce qu'il a dans son .Xdefauts.
Si le but c'est de s'ammuser un peu, ce que j'offre ci-dessus va bien,
mais c'est loins d'être suffisant pour une application
professionnelle. (Mais une application professionnelle, il va se servir
des fenêtres graphiques de toute façon, si elle veut des
affichages particuliers.)

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
Timour
Oui le but était de s'amuser un peu. Même si je comprends que la moitié
du programme que vous avez écrit je le trouve bien fait ! :D
Va falloir que je me renseigne un peu sur les éléments de votre
programme que je ne connais pas.:D Merci beaucoup :P.
Allez je file, j'ai du boulot : ))

James Kanze wrote:
Timour writes:

|> wrote:

|> > Enfin, à titre d'information, la séquence d'échappement,
|> > c'est '<ESC>[3<n>m' pour la couleur d'affichage, et '<ESC>[4<n>m'
|> > pour la couleur de l'arrière plan, où <ESC>, c'est le
|> > caractère ASCII ESC, et <n>, c'est le numéro de couleur.

|> Je vois, mais je ne sais pas où l'insérer, pourriez-vous
|> l'insérer dans ce source?:

Où tu veux la couleur, évidemment. Mais attention, ce n'est pas si
facile que ça.

|> #include
|> int main()
|> {
|> std::cout << " Hello World !n" ;

La première approximation serait :
try {
std::cout << " " RED "Hello, world!" NORMAL "n" ;
} catch ( ... ) {
std::cout << NORMAL ;
std::cout.flush() ;
abort() ;
}
avec des #define :
#define ESC "33"
#define RED ESC "[31m"
#define NORMAL ESC "[0m"

|> std::cout << " 19

C'est quoi, ça ?

|> return 0;
|> }

Pour expérimenter, je conseillerais quelque chose comme le programme
suivant pour commencer :

#include <ostream>
#include <iostream>
#include <string>

enum Color
{
black ,
red ,
green ,
yellow ,
blue ,
magenta ,
cyan ,
white ,
lastColor ,
firstColor = black
} ;

inline Color&
operator++( Color& c )
{
assert( c < lastColor ) ;
c = static_cast< Color >( c + 1 ) ;
return c ;
}

inline Color
operator++( Color& c, int )
{
Color result = c ;
++ c ;
return result ;
}

char const *const colorNames[] > {
"black" ,
"red" ,
"green" ,
"yellow" ,
"blue" ,
"magenta",
"cyan" ,
"white" ,
} ;

char const colorDigits[] = "01234567" ;

std::string
esc()
{
return std::string( 1, '33' ) ;
}

std::string
fgColor( Color c )
{
assert( c >= 0 && c < 10 ) ;
return esc() + "[3" + colorDigits[ c ] + 'm' ;
}

std::string
bgColor( Color c )
{
assert( c >= 0 && c < 10 ) ;
return esc() + "[4" + colorDigits[ c ] + 'm' ;
}

std::string
normal()
{
return esc() + "[0m" ;
}

std::string
centered( std::string const& s, int width )
{
std::string result( s ) ;
int pad = width - result.size() ;
if ( pad > 0 ) {
result.insert( result.begin(), pad / 2, ' ' ) ;
result.insert( result.end(), pad - pad / 2, ' ' ) ;
}
return result ;
}

int
main()
{
for ( Color i = firstColor ; i < lastColor ; ++ i ) {
std::cout
<< bgColor( i ) << centered( colorNames[ i ], 10 ) << normal()
<< fgColor( i ) << centered( colorNames[ i ], 10 ) << normal()
<< 'n' ;
}
return 0 ;
}

Mais comme j'ai déjà dit, méfie-toi de la réalité des
couleurs:-). Sur ma boîte Linux, c'est à peu près correct. Le
blanc, c'est en fait un gris clair, et les autres couleurs sont toutes
un peu plus foncées que je m'y attendrais. Sous Windows, c'est
semblable. Mais dans un XTerm, au moins, ça dépend aussi de la
configuration de chaque utilisateur, de ce qu'il a dans son .Xdefauts.
Si le but c'est de s'ammuser un peu, ce que j'offre ci-dessus va bien,
mais c'est loins d'être suffisant pour une application
professionnelle. (Mais une application professionnelle, il va se servir
des fenêtres graphiques de toute façon, si elle veut des
affichages particuliers.)



1 2