C言語でprintf()などの出力を使うとき、どうにかして文字に色を付けられないかと思った。
当時、私は自作のlsコマンドを作っており(Windows Powershellのlsエイリアスがあんまりにもあんまりだったので)、ディレクトリやシンボリックリンクには色を付けて出力したかった。 私の環境はWindows 10、コンパイラはMingw gccである。なるべく環境を汚したくなかったので、何かしらをダウンロードしたりせずに色付き文字を出力したかった。
結論から言うと、方法はあった。
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
過去のコメント
まだコメントは投稿されていません。