前回に引き続き、文字に色を付けてみたいと思います。
前回できたのは、下の画面なんですが、これでは白と黒だけでDOS画面そのものの表示でつまらないので、今回はこれに色を付けたいと思います。
文字に色を付ける
VisualStudioでは、色のエスケープシーケンスはサポートされていないようで四苦八苦^^;
WindowsのDOSのみ有効な手段みたいなので、こちらのサイトを参考に追記させてもらいました。
#include <windows.h> #include <conio.h> HANDLE h; CONSOLE_SCREEN_BUFFER_INFO csbi; h = GetStdHandle(STD_OUTPUT_HANDLE); // 標準入出力へのハンドルを得る GetConsoleScreenBufferInfo(h, &csbi); // コンソールスクリーンバッファ(現在の状態)を得る SetConsoleTextAttribute(h, FOREGROUND_BLUE | FOREGROUND_GREEN);//文字色をシアンに変更 SetConsoleTextAttribute(h, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);//文字色を白に変更 SetConsoleTextAttribute(h, FOREGROUND_RED);//文字色を赤に変更
まず、通常の色で試すと下の画像のようにシアンも赤も暗めでくっきりとならなかったので
“FOREGROUND_INTENSITY“を使って強調したのは下のソースです。
#include <windows.h> #include <conio.h> #include <stdio.h> int main(Void) { HANDLE h; CONSOLE_SCREEN_BUFFER_INFO csbi; h = GetStdHandle(STD_OUTPUT_HANDLE); // 標準入出力へのハンドルを得る GetConsoleScreenBufferInfo(h, &csbi); // コンソールスクリーンバッファ(現在の状態)を得る printf("==========================================================================\n\n"); SetConsoleTextAttribute(h, FOREGROUND_BLUE | FOREGROUND_GREEN| FOREGROUND_INTENSITY);//文字色を強調のシアンに変更 printf("\t\t\t メインメニュー\n\n"); SetConsoleTextAttribute(h, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);//文字色を白に変更 printf("==========================================================================\n\n\n"); printf("\t\t\t1.販売管理メニュー\n\n"); printf("\t\t\t2.顧客管理メニュー\n\n"); printf("\t\t\t3.財務管理メニュー\n\n"); SetConsoleTextAttribute(h, FOREGROUND_RED| FOREGROUND_INTENSITY);//文字色を強調の赤に変更 printf("\t\t\t4.終 了\n\n\n\n\n"); SetConsoleTextAttribute(h, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);//文字色を白に変更 return 0;
すると、こんなにくっきりと文字が明るくなりました。
文字の色の作り方
RBGカラー光の三原色を混ぜて表示してみました。
FOREGROUND_RED 赤 FOREGROUND_GREEN 緑 FOREGROUND_BLUE 青 FOREGROUND_INTENSITY 強調 FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN 白 FOREGROUND_BLUE | FOREGROUND_GREEN シアン FOREGROUND_GREEN | FOREGROUND_RED 黄色 FOREGROUND_BLUE | FOREGROUND_RED マゼンダ
SetScreenTextAtrribute関数を使うと背景色に色が付けられるとのことで調べてみた結果
コンソール プロセスを生成して標準ハンドルをリダイレクトする方法
がMicrosoftのサポートにありました。
HANDLE hStdInput = GetStdHandle(STD_INPUT_HANDLE);//子プロセスの標準入力ハンドル HANDLE hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);//子プロセスの標準出力ハンドル HANDLE hStdError = GetStdHandle(STD_ERROR_HANDLE);//子プロセスの標準エラー ハンドル
注意:printf() や fprintf() などの C ランタイム関数を使用する子プロセスでは、リダイレクトを行うと処理速度が低下する場合があるそうです。
文字の背景色を設定する時の書き方
おそらくこれでいいはずなんだけど・・・
#include <windows.h> #include <stdio.h> int main(void) { HANDLE hStdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hStdoutHandle, BACKGROUND_RED); printf("ここに文字を入れる"); return 0; }
背景色がなかなか設定できない^^;
マイツールみたいにスマートに記途ができれば・・・
そう言えば、マイツールは沢山のDLLファイルがありそのDLL名がマイツール独自の関数(命令)でしようしていた関数名COM.DLLのようなファイル名が沢山あることから、推測にしか過ぎないがDLLファイル名にはマイツールで使っていた独自の関数をDLLに保存し、ユーザーが通常使用する画面にダイレクトに関数を入力することによりプログラムが動くしくみになっていたのでは・・・と勝手に推測しています。
VisualStudioでDLLの作成できそうなので、唯今模索中ですφ(..)
コメント