C++ でコンソールの色を変更する方法
この記事では、C++ でコンソールの色を変更する方法をいくつか紹介します。
ANSI エスケープコードを使用してコンソールの色を変更する
色は標準の C++ ライブラリの一部ではなく、コンソール固有の機能はほとんどが OS で処理されているため、出力ストリームに色を追加するネイティブ言語機能はありません。しかし、テキスト出力の色付けを処理するためのプラットフォーム固有の方法をいくつか議論します。
ANSI エスケープコードは、この問題を解決するための比較的移植性の高い方法です。エスケープコードは、主に ASCII エスケープ文字とブラケット文字で始まるバイト列で、その後にパラメータが続きます。これらの文字は出力テキストに埋め込まれ、コンソールは表示します。テキストではなくコマンドとして解釈します。ANSI コードには複数のカラーフォーマットがあり、詳細はこのページを参照してください。以下のコード例では、複数の色文字をマクロとして定義し、これらのシンボルを printf
文字列の引数に含めることを示しています。printf
は、最初のパラメータの場所に渡された複数のダブルクォート文字列を連結していることに注意してください。
#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;
}
出力(プログラム引数なし)。
ERROR: provide argument as follows -> ./program argument
出力(プログラム引数あり):
SUCCESS!
または、同じエスケープコードを cout
呼び出しで使うこともできます。なお、<<
ストリーム挿入演算子を複数回使用する必要はなく、マクロシンボルを文字列リテラルと組み合わせれば自動的に結合されるので注意してください。
#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;
}
出力:
Some cyan colored text
Add red background
reset to default with NC
C++ でコンソールの色を変更するには SetConsoleTextAttribute()
メソッドを使用する
SetConsoleTextAttribute
は、異なるパラメータを用いて出力テキストの色を設定するための Windows API メソッドです。この関数は WriteFile
または WriteConsole
関数でコンソール画面バッファに書き込まれた文字の属性を設定します。文字属性の詳細な説明はこちらのページを参照してください。
#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;
}
出力:
Some red colored text