Cambia il colore della console in C++

Jinku Hu 11 dicembre 2023
  1. Usa codici di escape ANSI per cambiare il colore della console
  2. Usa il metodo SetConsoleTextAttribute() per cambiare il colore della console in C++
Cambia il colore della console in C++

Questo articolo spiegherà diversi metodi su come cambiare il colore della console in C++.

Usa codici di escape ANSI per cambiare il colore della console

Poiché i colori non fanno parte della libreria C++ standard e le funzionalità specifiche della console sono gestite principalmente dai sistemi operativi, non esiste una funzionalità del linguaggio nativo per aggiungere colori ai flussi di output. Tuttavia, discutiamo alcuni modi specifici della piattaforma per gestire l’output di testo da colorare.

I codici di escape ANSI sono un modo relativamente portatile per risolvere questo problema. I codici di escape sono sequenze di byte che iniziano principalmente con un carattere di escape ASCII e un carattere di parentesi seguito da parametri. Questi caratteri sono incorporati nel testo di output e la console interpreta le sequenze come comandi anziché come testo da visualizzare. I codici ANSI includono più formati di colore, i cui dettagli completi possono essere visualizzati in questa pagina. Nel seguente esempio di codice, dimostriamo la definizione di diversi caratteri di colore come macro e successivamente includiamo questi simboli negli argomenti della stringa printf. Si noti che printf concatena più stringhe tra virgolette passate al primo posto del parametro.

#include <iostream>

#define NC "\e[0m"
#define RED "\e[0;31m"
#define GRN "\e[0;32m"
#define CYN "\e[0;36m"
#define REDB "\e[41m"

using std::cout;
using std::endl;

int main(int argc, char *argv[]) {
  if (argc < 2) {
    printf(RED "ERROR" NC
               ": provide argument as follows -> ./program argument\n");
    exit(EXIT_FAILURE);
  }
  printf(GRN "SUCCESS!\n");

  return EXIT_SUCCESS;
}

Output (senza argomento del programma):

ERROR: provide argument as follows -> ./program argument

Output (con argomento del programma):

SUCCESS!

In alternativa, gli stessi codici di escape possono essere utilizzati con una chiamata cout. Si noti che non è necessario utilizzare più volte l’operatore di inserimento del flusso << e combinare semplicemente i simboli delle macro insieme alle stringhe letterali poiché verranno combinate automaticamente.

#include <iostream>

#define NC "\e[0m"
#define RED "\e[0;31m"
#define GRN "\e[0;32m"
#define CYN "\e[0;36m"
#define REDB "\e[41m"

using std::cout;
using std::endl;

int main() {
  cout << CYN "Some cyan colored text" << endl;
  cout << REDB "Add red background" NC << endl;
  cout << "reset to default colors with NC" << endl;

  return EXIT_SUCCESS;
}

Produzione:

Some cyan colored text
Add red background
reset to default with NC

Usa il metodo SetConsoleTextAttribute() per cambiare il colore della console in C++

SetConsoleTextAttribute è il metodo API di Windows per impostare i colori del testo di output utilizzando diversi parametri. Questa funzione imposta gli attributi dei caratteri scritti nel buffer dello schermo della console dalle funzioni WriteFile o WriteConsole. La descrizione completa degli attributi del carattere può essere vista in questa pagina.

#include << windows.h>>

#include <iostream>
#include <string>

using std::cout;
using std::endl;

int main() {
  std::string str("HeLLO tHERe\n");
  DWORD bytesWritten = 0;

  HANDLE cout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute(console_handle,
                          FOREGROUND_RED | BACKGROUND_INTENSITY);
  WriteFile(cout_handle, str.c_str(), str.size(), &bytesWritten, NULL);

  return EXIT_SUCCESS;
}

Produzione:

Some red colored text
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Articolo correlato - C++ IO