Nello standar ANSI non c'è alcuna funzione per gestire i colori, ogni compilatore ha le
sue funzioni(vedi gcc, borland, turbo C++ ecc...) per non parlare di Visual C++ col
quale siamo obbligati ad utilizzare le api.
Il vantaggio delle api è che funzioneranno su qualsiasi compilatore, però
funzioneranno solo su win naturalmente, se abbiamo linux(e apro una parentesi) i
colori si gestiscono con le ncurses o con formattazioni in printf tipo
printf("e[32m casa ");
Ma siamo qui per usre le api win32, la spina dorsale per colorare il testo è
SetConsoleTextAttribute:
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon,int_value_colore);
Per astrarre questa operazione creiamo una funzione più generica:
void SetColor(unsigned short color) {
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon,color);
}
Quindi, ad esempio, se noi utilizzassimo
SetColor(5);
Tutti i comandi di output diretti dalla e alla nostra console saranno in viola.
Con 12 rosso, con 9 grigio, con 0 nero e con 7 bianco... e gli altri si scoprono
provando.
Però le caratteristiche non si fermano qui, ecco un elenco di #define tratti dal MSDN:
FOREGROUND_BLUE Text color contains blue.
FOREGROUND_GREEN Text color contains green.
FOREGROUND_RED Text color contains red.
FOREGROUND_INTENSITY Text color is intensified.
BACKGROUND_BLUE Background color contains blue.
BACKGROUND_GREEN Background color contains green.
BACKGROUND_RED Background color contains red.
BACKGROUND_INTENSITY Background color is intensified.
COMMON_LVB_LEADING_BYTE Leading byte.
COMMON_LVB_TRAILING_BYTE Trailing byte.
COMMON_LVB_GRID_HORIZONTAL Top horizontal.
COMMON_LVB_GRID_LVERTICAL Left vertical.
COMMON_LVB_GRID_RVERTICAL Right vertical.
COMMON_LVB_REVERSE_VIDEO Reverse foreground and background attributes.
COMMON_LVB_UNDERSCORE Underscore.
E' possibile mescolarli con l'operatore |, ecco un esempio:
selector(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_RED);
printf("%s", "Ciao");
-----------------------------
Dopo questa introduzione ecco il tip, come esempio c'è un programma cha stampa "Verde" "Bianco" e "Rosso" su sfondo blue e poi ripristina
#include <windows.h>
#include <stdio.h>
void selector(unsigned short color)
{
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon,color);
}
void main() {
selector(2 | BACKGROUND_BLUE);
printf("%s ", "Verde");
selector(7 | BACKGROUND_BLUE);
printf("%s ", "Bianco");
selector(12 | BACKGROUND_BLUE);
printf("%s", "Rosso");
selector(7);//ripristina in bianco
printf("n");//vai a capo dopo il ripristino sennò la riga ha sfondo blue
//fino in fondo
system("PAUSE");
}
Aggiungi un commento