So ändern Sie die Konsolenfarbe in C++

Jinku Hu 11 Dezember 2023
  1. Verwendung von ANSI-Escape-Codes zum Ändern der Konsolenfarbe
  2. Verwenden Sie die Methode SetConsoleTextAttribute(), um die Konsolenfarbe in C++ zu ändern
So ändern Sie die Konsolenfarbe in C++

In diesem Artikel werden mehrere Methoden zum Ändern der Konsolenfarbe in C++ erläutert.

Verwendung von ANSI-Escape-Codes zum Ändern der Konsolenfarbe

Da die Farben nicht Teil der Standard-C++-Bibliothek sind und die konsolenspezifischen Funktionen meist von den Betriebssystemen gehandhabt werden, gibt es keine muttersprachliche Funktion zum Hinzufügen von Farben zu Ausgabeströmen. Wir besprechen jedoch einige plattformspezifische Möglichkeiten zur Handhabung der Einfärbung von Textausgaben.

ANSI-Escape-Codes sind eine relativ portable Möglichkeit, dieses Problem zu lösen. Escape-Codes sind Bytefolgen, die meist mit einem ASCII-Escape-Zeichen und einem Klammerzeichen beginnen, gefolgt von Parametern. Diese Zeichen werden in den Ausgabetext eingebettet, und die Konsole interpretiert die Sequenzen als Befehle und nicht als anzuzeigenden Text. ANSI-Codes umfassen mehrere Farbformate, deren vollständige Einzelheiten auf dieser Seite zu finden sind. Im folgenden Code-Beispiel demonstrieren wir die Definition mehrerer Farbzeichen als Makros und fügen diese Symbole später in die printf-String-Argumente ein. Beachten Sie, dass printf mehrere Zeichenketten in doppelten Anführungszeichen verkettet, die an der ersten Stelle des Parameters übergeben werden.

#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;
}

Ausgabe (ohne Programm-Argument):

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

Ausgabe (mit Programmargument):

SUCCESS!

Alternativ können die gleichen Escape-Codes mit einem cout-Aufruf verwendet werden. Beachten Sie, dass es nicht notwendig ist, den << Stream-Insert-Operator mehrfach zu verwenden und nur Makro-Symbole in Verbindung mit den Zeichenkettenliteralen zu kombinieren, da diese automatisch kombiniert werden.

#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;
}

Ausgabe:

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

Verwenden Sie die Methode SetConsoleTextAttribute(), um die Konsolenfarbe in C++ zu ändern

SetConsoleTextAttribute ist die Windows-API-Methode zum Setzen der Ausgabetextfarben mit verschiedenen Parametern. Diese Funktion setzt die Attribute von Zeichen, die von den Funktionen WriteFile oder WriteConsole in den Konsolen-Bildschirmpuffer geschrieben werden. Die vollständige Beschreibung der Zeichenattribute kann auf dieser Seite eingesehen werden.

#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;
}

Ausgabe:

Some red colored text
Autor: 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

Verwandter Artikel - C++ IO