C++ でコンソールの色を変更する方法

胡金庫 2023年12月11日
  1. ANSI エスケープコードを使用してコンソールの色を変更する
  2. C++ でコンソールの色を変更するには SetConsoleTextAttribute() メソッドを使用する
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
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ IO