ロゴ

鮭男のホームページ


C言語の出力文字に色を付ける

2020/03/04
サムネイル

いきさつ

C言語でprintf()などの出力を使うとき、どうにかして文字に色を付けられないかと思った。

当時、私は自作のlsコマンドを作っており(Windows Powershellのlsエイリアスがあんまりにもあんまりだったので)、ディレクトリやシンボリックリンクには色を付けて出力したかった。 私の環境はWindows 10、コンパイラはMingw gccである。なるべく環境を汚したくなかったので、何かしらをダウンロードしたりせずに色付き文字を出力したかった。

結論から言うと、方法はあった。

SetConsoleTextAttribute()関数


BOOL WINAPI SetConsoleTextAttribute(
    _In_ HANDLE hConsoleOutput,
    _In_ WORD   wAttributes
);

Windows上で色付きの出力を行うには、SetConsoleTextAttribute()という関数を用いればよいことがわかった。

この関数はwindows.hの中で宣言されており、windowsコンソールアプリの出力に色をつけるために使われる。

具体的には以下のように使われる。(以下の例では出力の背景が黄色になる)


HANDLE hc = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hc, BACKGROUND_GREEN | BACKGROUND_RED);

第1引数は出力先のバッファを指すハンドルである。これはGetStdHandle(STD_OUTPUT_HANDLE)で取得できる。

第2引数は文字の色を指定するマクロを、論理和形式で複数入力する。

色を指定するマクロは、以下の通り。


FOREGROUND_BLUE 	    Text color contains blue.
FOREGROUND_GREEN 	    Text color contains green.
FOREGROUND_RED 	        Text color contains red.
FOREGROUND_INTENSITY 	Text color is intensified.
BACKGROUND_BLUE 	    Background color contains blue.
BACKGROUND_GREEN 	    Background color contains green.
BACKGROUND_RED 	        Background color contains red.
BACKGROUND_INTENSITY 	Background color is intensified.
COMMON_LVB_LEADING_BYTE 	Leading byte.
COMMON_LVB_TRAILING_BYTE 	Trailing byte.
COMMON_LVB_GRID_HORIZONTAL 	Top horizontal.
COMMON_LVB_GRID_LVERTICAL 	Left vertical.
COMMON_LVB_GRID_RVERTICAL 	Right vertical.
COMMON_LVB_REVERSE_VIDEO 	Reverse foreground and background attributes.
COMMON_LVB_UNDERSCORE 	Underscore.

参考→https://docs.microsoft.com/en-us/windows/console/setconsoletextattribute

Tweet

コメントを投稿

名前:

コメント:


過去のコメント

まだコメントは投稿されていません。