Nodachisoft Nodachi Sword Icon
  
@あまじ✎ 2021年3月13日に更新

第3章4 文字の色、背景の色を変更

イチからゲーム作りで覚えるC言語
第3章3 文字の出力位置を変更 : PREV
NEXT : 第3章5 エスケープシーケンスで文字の色、背景の色を変更 :

概要

Windows API を使い、コンソール画面に出力する文字の色や背景の色を制御する方法を確認していきます。

標準設定であれば、コンソールに文字を出力すると黒い背景に白い文字の色の組み合わせで表示されるかと思います。

この文字の色を Windows API を使って変更してみます。

文字色の変更

コンソール上の文字の色を制御するために、 Windows API の changeConsoleSize 関数を作っていきます。

 
color_ex1.c
#include <stdio.h>
#include <windows.h>
int main() {
    HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    WORD colorcode;
    colorcode = FOREGROUND_BLUE;
    SetConsoleTextAttribute( hStdout , colorcode );
    printf("ここは青色です!\n\n");
    
    colorcode =  FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY;
    SetConsoleTextAttribute( hStdout , colorcode );
    printf("色が白に戻りました。\n");
}

実行すると、下のようなイメージになります。

SetConsoleTextAttribute関数を実行する例

ちゃんと「ここは青色です!」の文字が青色になってますね。

コード解説

4行目で、操作する対象のコンソールオブジェクトへのポインタを Windows API の GetStdHandle 関数を呼び出して取得しています。

変数 hStdout に標準出力先のコンソールへのポインタが入ります。

 
color_ex1.c
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);

この後の色の操作は、この標準出力先に対して行います。

続いて、5行目は WORD 型の変数 colorcode を宣言しています。

WORD型は Windows API を使うときに、よく使われる「正の整数で 0 ~ 65535 の値」と定義されており、 実際には、typedef unsigned short WORD; (符号なしの short 型)と定義されています。

 
color_ex1.c
WORD colorcode;
colorcode = FOREGROUND_BLUE;
SetConsoleTextAttribute( hStdout , colorcode );

6行目で、あらかじめ定義されている色番号である「FOREGROUND_BLUE」(青色)を設定します。

7行目の SetConsoleTextAttribute 関数で、標準出力先のコンソールに対して、カラーコードを設定し、 以降の標準出力内容の色を変更できます。

カラーコード

コンソールの文字色では下の 3 種類の基本色が定義されています。

定数の定義
FOREGROUND_BLUE 青色
FOREGROUND_GREEN 緑色
FOREGROUND_RED 赤色

これらを組み合わせて使うことが出来ます。 例えば FOREGROUNDBLUE と FOREGROUNDGREEN を組み合わせて使うことで、水色っぽい色となります。

その場合下のように色を設定します。

 
色設定例
WORD colorcode;
colorcode = FOREGROUND_BLUE | FOREGROUND_GREEN;
SetConsoleTextAttribute( hStdout , colorcode );
printf("水色っぽい!\n");

記号の 「 | 」で、FOREGROUNDBLUE と FOREGROUNDGREEN のビットOR演算 を行い、 青と緑を表すビットが立った状態の値を colorcode に代入しています。

また、「BACKGROUND_INTENSITY」という定数が定義されており、 これを組み合わせることで、やや「強調(Intensity)」された色合いとなります。

これらの組み合わせでコンソール上で表現できる文字の色は下のようになります。

RGB FOREGROUND_BLUE FOREGROUND_GREEN FOREGROUND_RED FOREGROUND_INTENSITY
(12,12,12)
(0,55,218)
(19,161,14)
(197,15,31)
(58,150,221)
(136,23,152)
(32,240,91)
(204,204,204)
灰色 (118,118,118)
明るい青 (59,120,255)
明るい緑 (22,198,12)
明るい赤 (231,72,86
明るい水 (97,214,214)
明るい紫 (180,0,158)
明るい黄 (249,241,165)
明るい白 (242,242,242)

実際の色合い(RGB) は Windows10 のコマンドプロンプトで標準で設定されている色であり、 設定によっては変更されてりう場合がありますので、あくまで標準の値として参考程度です。

例えば、「明るい水」色にしたいなら、下のように関数を呼び出します。

明るい水色
SetConsoleTextAttribute( hStdout , FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY );

標準設定である白い文字に戻す場合は、「明るい白」色をセットしてあげます。

白い文字
SetConsoleTextAttribute( hStdout , FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY );

背景色

文字の背景食も変更することができます。

文字色は FOREGROUND色 という形式でしたが、 背景色は BACKGROUND色 という形式で指定します。

例として、「背景は緑、文字は赤」という組み合わせで文字を出力してみます。

 
color_ex1.c
#include <stdio.h>
#include <windows.h>
int main() {
    HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute( hStdout , FOREGROUND_RED | BACKGROUND_GREEN );
    printf("緑の背景に赤い色\n");
}

下のような結果になりました!

補足(ANSI エスケープコード)

Windows 系のコンソールであれば、 Windows API を呼び出すことで、色をある程度変更できます。

MacOS、Unix、Linux などのコンソール上で色を変更するには、ANSI エスケープシーケンスを使用します。

下のようなコードを実行すると、「ここは赤色!」と赤字で出力されます。

 
color_ansiesc_ex1.c
#include <stdio.h>
int main() {
    printf("\033[31;1;4mここは赤色!\033[0m");
}

ANSI エスケープシーケンスについては、文字の色を変更するだけでなく、 コンソール画面をクリアしたり、文字の表示位置を変更したり、フォントスタイルを変更したりといった多彩な制御を 標準出力から行うことができます。(printf 関数などに埋め込んで制御ができます)

Windows 系のコンソールでも、ANSI エスケープシーケンスを使う方法はありますので、のちのページで紹介する予定です。

エスケースシーケンスについてはたくさんの機能がありますが、ここでは詳細割愛します。

ANSIエスケープシーケンスの仕様

ANSI エスケープシーケンスでコンソールの色や書体を制御する仕様は ECMA-48/ISO6429 で定義されており、Select Graphic Rendition (SGR) と呼ばれています。 具体的な実装内容は Linux のマニュアルが参考になります。

参考文献

イチからゲーム作りで覚えるC言語
第3章3 文字の出力位置を変更 : PREV
NEXT : 第3章5 エスケープシーケンスで文字の色、背景の色を変更 :
 
 
送信しました!

コメント、ありがとうございます。

なんかエラーでした

ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。

Twitter:@NodachiSoft_jp
お名前:
 
連絡先:
 
メッセージ:
 
戻る
内容の確認!

以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください

お名前:
 
連絡先:
 
メッセージ:
 
Roboto からの操作ではないという確認のため確認キーを入れてください。
確認キー=95
戻る
 / 
送信確認へ
コメント欄
コメント送信確認へ

関連ありそうな記事(5件)です!

第4章3 C言語コンソール上で迷路脱出プログラム・迷路の自動生成

#C11仕様#C言語#ゲームプログラミング✎ 2021-05-15
C言語のコンソールゲームで迷路脱出ゲームプログラムの作り方を確認します。迷路は自動生成されます
広告領域
追従 広告領域
目次
第3章4 文字の色、背景の色を変更
第3章4 文字の色、背景の色を変更
概要
概要
文字色の変更
文字色の変更
コード解説
コード解説
カラーコード
カラーコード
背景色
背景色
補足(ANSI エスケープコード)
補足(ANSI エスケープコード)
参考文献
参考文献
Nodachisoft © 2021