5月連休も最終日。昨日までの天気はどこへ?、車も今にも止まりそうな勢いなので、どこにも行かず・・仕事?今は・・・プーさんです(笑)
なので、以前からしてみたかったC言語のお勉強してます!!
C言語に関しては、土素人で只今、学びの最中の備忘録ですので、失敗するとこが多いと思います。
プロの方から見ると何やってんだろう!!って感じですよね。なので先に誤っておきます。ごめんなさい<(_ _)>
さて、前回はアホなアクシデントがありましたが、やっと背景色と文字色の指定に成功しました!
DLL化も検討していたのですが、先に、ソースのみで表示されないことにはDLL化してもどうしようもないので、今回はマクロ機能を作って少しだけ文字の入力が少なくて済むようにしてみました。
参考にさせていただいたのはC++のダブルバッファで使用されている色コードでNobuhide Tsudaさんのサイトなのですが、この色コードを自分専用に書き換えて使用さてせ頂きました。
私が購入したC言語のプログラミングの本には記載がなかったもので、悪戦苦闘しましたが(笑)
変なことしてたら、怒ってください。
でも。私の(#^.^#)顔はひっぱたかないでね(^_-)-☆
使用しているOS:Windows7 64bit
開発環境:VisualStudioCommunity2017
Visual C++ 空のプロジェクト win32 x86で作っています。
VisualStudio2017【C言語】自作マクロで使えた色
#define T_BLACK 0x00 #define T_DARK_BLUE 0x01 #define T_DARK_GREEN 0x02 #define T_DARK_CYAN 0x03 #define T_DARK_RED 0x04 #define T_DARK_VIOLET 0x05 #define T_DARK_YELLOW 0x06 #define T_GRAY 0x07 #define T_LIGHT_GRAY 0x08 #define T_BLUE 0x09 #define T_GREEN 0x0a #define T_CYAN 0x0b #define T_RED 0x0c #define T_VIOLET 0x0d #define T_YELLOW 0x0e #define T_WHITE 0x0f #define T_INTENSITY 0x08 // 高輝度マスク #define T_RED_MASK 0x04 // 赤色ビット #define T_GREEN_MASK 0x02 // 緑色ビット #define T_BLUE_MASK 0x01 // 青色ビット #define B_RED BACKGROUND_RED //赤 #define B_GREEN BACKGROUND_GREEN //緑 #define B_BLUE BACKGROUND_BLUE //青 #define B_INTENSITY BACKGROUND_INTENSITY //強調 #define B_WHITE BACKGROUND_BLUE|BACKGROUND_RED|BACKGROUND_GREEN //白
こんな感じに無事背景色の色も表示されました!(^^)!
下のソースは、使えなかったのものですが・・
#define B_CYAN BACKGROUND_BLUE|BACKGROUND_GREEN //シアン #define B_YELLOW BACKGROUND_GREEN|BACKGROUND_RED //イエロー #define B_MAGENTA BACKGROUND_BLUE|BACKGROUND_RED //マゼンダ #define B_RED_I BACKGROUND_RED|BACKGROUND_INTENSITY //明るい赤 #define B_GREEN_I BACKGROUND_GREEN|BACKGROUND_INTENSITY //明るい緑 #define B_BLUE_I BACKGROUND_BLUE|BACKGROUND_INTENSITY //明るい青 #define B_WHITE_I BACKGROUND_BLUE|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_INTENSITY //明るい白
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー (アクティブ) E0007 認識されないトークンです 。
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー C3872 ‘0x3000’: この文字を識別子で使用することはできません 。
とたくさん怒られてしまいました(>_<)
VisualStudio2017でエスケープシーケンスを使ってみる
もう一度基礎からC言語さんの
#include <stdio.h> int main(void) { printf("¥033[2J"); /* 画面をクリア */ printf("¥033[5;10H"); /* カーソルを移動 */ printf("¥033[33m"); /* 文字色を黄色に */ printf("Hello!¥n"); /* メッセージを出力 */ printf("Press [Enter]...¥n"); /* メッセージを出力 */ (void)getchar(); /* キー入力を待つ */ printf("¥033[93m"); /* 文字色を標準に */ return (0); }
VisualStudio2017で、配色などのエスケープシーケンスが使えなかった?・・・というより保存するにはUnicodeか違うエンコードで!!と言われてしまいました。
エスケープシーケンスで画面を表示しようとしたらこんな感じで・・・
使えないというよりUnicodeなんかで保存されたら、後々困りそうだから・・・やめときます。
VisualStudioで使えたエスケープシーケンス
VisualStudioで使えるエスケープシーケンスは少しだけでした。
現在の全てのソースはこんな感じなんですが・・
#include <stdio.h> #include <conio.h> #include <windows.h> #define T_BLACK 0x00 #define T_DARK_BLUE 0x01 #define T_DARK_GREEN 0x02 #define T_DARK_CYAN 0x03 #define T_DARK_RED 0x04 #define T_DARK_VIOLET 0x05 #define T_DARK_YELLOW 0x06 #define T_GRAY 0x07 #define T_LIGHT_GRAY 0x08 #define T_BLUE 0x09 #define T_GREEN 0x0a #define T_CYAN 0x0b #define T_RED 0x0c #define T_VIOLET 0x0d #define T_YELLOW 0x0e #define T_WHITE 0x0f #define T_INTENSITY 0x08 // 高輝度マスク #define T_RED_MASK 0x04 // 赤色ビット #define T_GREEN_MASK 0x02 // 緑色ビット #define T_BLUE_MASK 0x01 // 青色ビット #define B_RED BACKGROUND_RED //赤 #define B_GREEN BACKGROUND_GREEN //緑 #define B_BLUE BACKGROUND_BLUE //青 #define B_INTENSITY BACKGROUND_INTENSITY //強調 #define B_WHITE BACKGROUND_BLUE|BACKGROUND_RED|BACKGROUND_GREEN //白 #define B_CYAN BACKGROUND_BLUE|BACKGROUND_GREEN //シアン #define B_YELLOW BACKGROUND_GREEN|BACKGROUND_RED //イエロー #define B_MAGENTA BACKGROUND_BLUE|BACKGROUND_RED //マゼンダ #define B_RED_I BACKGROUND_RED|BACKGROUND_INTENSITY //明るい赤 #define B_GREEN_I BACKGROUND_GREEN|BACKGROUND_INTENSITY //明るい緑 #define B_BLUE_I BACKGROUND_BLUE|BACKGROUND_INTENSITY //明るい青 #define B_WHITE_I BACKGROUND_BLUE|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_INTENSITY //明るい白 int main() { HANDLE hStdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hStdoutHandle, BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY | T_BLACK); printf("背景黄色文字黒\n"); SetConsoleTextAttribute(hStdoutHandle, BACKGROUND_BLUE | BACKGROUND_RED | BACKGROUND_INTENSITY | T_BLUE); printf("背景マゼンダ文字ブルー\n"); SetConsoleTextAttribute(hStdoutHandle, BACKGROUND_RED | BACKGROUND_INTENSITY | T_DARK_GREEN); printf("背景赤文字グリーン\n"); SetConsoleTextAttribute(hStdoutHandle, T_CYAN); printf("背景指定なし文字シアン\n"); SetConsoleTextAttribute(hStdoutHandle, T_DARK_RED); printf("背景指定なしダークレッド\n"); SetConsoleTextAttribute(hStdoutHandle, T_DARK_VIOLET); printf("背景指定なし文字ダークバイオレッド\n"); SetConsoleTextAttribute(hStdoutHandle, T_DARK_YELLOW); printf("背景指定なし文字ダークイエロー\n"); SetConsoleTextAttribute(hStdoutHandle, T_GRAY); printf("背景指定なし文字グレー\n"); SetConsoleTextAttribute(hStdoutHandle, BACKGROUND_BLUE | BACKGROUND_INTENSITY | T_CYAN); printf("背景明るい青。文字シアン\n"); SetConsoleTextAttribute(hStdoutHandle, BACKGROUND_GREEN | BACKGROUND_INTENSITY | FOREGROUND_RED); printf("背景明るい緑。文字赤。\n"); return 0; }
これでは色が色々な所から呼ばれているようでもっとスマートに、でも後々のことを考えると色の配色が沢山欲しいと思い
SetConsoleTextAttributeで検索してみると・・・
SetConsoleTextAttribute
BOOL SetConsoleTextAttribute( HANDLE hConsoleOutput, // コンソールスクリーンバッファのハンドル WORD wAttributes // テキストと背景の色
があり 「ヘッダー:wincon.h 内で宣言」と書かれてあったので、「wincon.h」を見てみると
#define FOREGROUND_BLUE 0x0001 // text color contains blue. #define FOREGROUND_GREEN 0x0002 // text color contains green. #define FOREGROUND_RED 0x0004 // text color contains red. #define FOREGROUND_INTENSITY 0x0008 // text color is intensified. #define BACKGROUND_BLUE 0x0010 // background color contains blue. #define BACKGROUND_GREEN 0x0020 // background color contains green. #define BACKGROUND_RED 0x0040 // background color contains red. #define BACKGROUND_INTENSITY 0x0080 // background color is intensified.
がありましたが、RBG色と同じ配色で少ない。
無理矢理#define に入れようとするとVisualStudioに怒られたこともあるので、思考を変え Nobuhide Tsudaさんの色コードを改良してもう少し入力文字数が少なくて済むようにしてみることにしました。
SET(COLOR,文字色|背景色);で色指定できるように変更
//文字色の設定 #define T_BLACK 0x00 #define T_DARK_BLUE 0x01 #define T_DARK_GREEN 0x02 #define T_DARK_CYAN 0x03 #define T_DARK_RED 0x04 #define T_DARK_VIOLET 0x05 #define T_DARK_YELLOW 0x06 #define T_GRAY 0x07 #define T_LIGHT_GRAY 0x08 #define T_BLUE 0x09 #define T_GREEN 0x0a #define T_CYAN 0x0b #define T_RED 0x0c #define T_VIOLET 0x0d #define T_YELLOW 0x0e #define T_WHITE 0x0f #define T_INTENSITY 0x08 // 高輝度マスク //背景色の設定 #define BT_BLACK 0x00 #define BT_DARK_BLUE 0x01 #define BT_DARK_GREEN 0x02 #define BT_DARK_CYAN 0x03 #define BT_DARK_RED 0x04 #define BT_DARK_VIOLET 0x05 #define BT_DARK_YELLOW 0x06 #define BT_GRAY 0x07 #define BT_LIGHT_GRAY 0x08 #define BT_BLUE 0x09 #define BT_GREEN 0x0a #define BT_CYAN 0x0b #define BT_RED 0x0c #define BT_VIOLET 0x0d #define BT_YELLOW 0x0e #define BT_WHITE 0x0f #define BT_INTENSITY 0x08 // 高輝度マスク // SET(COLOR, 文字色 | 背景色)で色の設定ができるように#defineに文字を代入 #define SET SetConsoleTextAttribute //SetConsoleTextAttributeをSETに代入 #define COLOR hStdoutHandle //hStdoutHandleをCOLORに代入
これなら、キーボードからの入力文字数が少なくて済みそうです。
でも、いざ試してみるとこんな感じ・・・
左上から背景が黒・右上がの背景は、ダークブルー
左下の背景はダークグリーン。右下の背景は白にしたのですが、綺麗に表示されたのは黒のみでした(T_T)
文字のみだと綺麗に表示されるのですが、背景を指定するのは、
背景色は、やっぱりRGB色を使うしかないみたいです。
下のコードも試したのですが・・・これもVisualStudioに怒られてしまいました^^;
//RBG文字色の設定 #define F_RED 0x0004 //赤 #define F_GREEN 0x0002 //緑 #define F_BLUE 0x0001 //青 #define F_INTENSITY 0x008//強調 #define F_WHITE 0x0001|0x0004|0x0002//白 #define F_CYAN 0x0001|0x0002 //シアン #define F_YELLOW 0x0002|0x0004 //イエロー #define F_MAGENTA 0x0001|0x0004 //マゼンダ #define F_RED_I 0x0004|0x0008 //明るい赤 #define F_GREEN_I 0x0002|0x0008//明るい緑 #define F_BLUE_I 0x0001|0x0008//明るい青 //RGB背景色設定 #define B_RED 0x0040 //赤 #define B_GREEN 0x0020 //緑 #define B_BLUE 0x0010 //青 #define B_INTENSITY 0x0080//強調 #define B_WHITE 0x0010|0x0040|0x0020//白 #define B_CYAN 0x0010|0x0020 //シアン #define B_YELLOW 0x0020|0x0040 //イエロー #define B_MAGENTA 0x0010|0x0040 //マゼンダ #define B_RED_I 0x0040|0x0080 //明るい赤 #define B_GREEN_I 0x0020|0x0080//明るい緑 #define B_BLUE_I 0x0010|0x0080//明るい青
結局、背景色は自作マクロでは呼び出さず、ソースに記途しました。
まぁ、こんなものですかね。
中央の画像は、BACKGROUND_INTENSITYを+したもので残りは、そのままの色です。
最終的に上の画像が実行できたソースは下のソースでした。
#include <windows.h> #include <stdio.h> #include <conio.h> //文字色の設定 #define T_BLACK 0x00 #define T_DARK_BLUE 0x01 #define T_DARK_GREEN 0x02 #define T_DARK_CYAN 0x03 #define T_DARK_RED 0x04 #define T_DARK_VIOLET 0x05 #define T_DARK_YELLOW 0x06 #define T_GRAY 0x07 #define T_LIGHT_GRAY 0x08 #define T_BLUE 0x09 #define T_GREEN 0x0a #define T_CYAN 0x0b #define T_RED 0x0c #define T_VIOLET 0x0d #define T_YELLOW 0x0e #define T_WHITE 0x0f #define T_INTENSITY 0x08 // 高輝度マスク #define T_RED_MASK 0x04 // 赤色ビット #define T_GREEN_MASK 0x02 // 緑色ビット #define T_BLUE_MASK 0x01 // 青色ビット // SET(COLOR, 文字色 | 背景色)で色の設定ができるように#defineに文字を代入 #define SET SetConsoleTextAttribute //SetConsoleTextAttributeをSETに代入 #define COLOR hStdoutHandle //hStdoutHandleをCOLORに代入 int main(void) { HANDLE hStdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE); SET(COLOR, BACKGROUND_BLUE | T_BLACK); printf("背景BLUE文字BLACK\n"); SET(COLOR, BACKGROUND_BLUE | T_DARK_BLUE); printf("背景BLUE文字DARK_BLUE\n"); SET(COLOR, BACKGROUND_BLUE | T_DARK_GREEN); printf("背景BLUE文字DARK_GREEN\n"); SET(COLOR, BACKGROUND_BLUE | T_DARK_RED); printf("背景BLUE文字DARE_RED\n"); SET(COLOR, BACKGROUND_BLUE | T_DARK_VIOLET); printf("背景BLUE文字DARK_VIOLET\n"); SET(COLOR, BACKGROUND_BLUE | T_GRAY); printf("背景BLUE文字GRAY\n"); SET(COLOR, BACKGROUND_BLUE | T_LIGHT_GRAY); printf("背景BLUE文字GRAY\n"); SET(COLOR, BACKGROUND_BLUE | T_BLUE); printf("背景BLUE文字BLUE\n"); SET(COLOR, BACKGROUND_BLUE | T_CYAN); printf("背景BLUE文字CYAN\n"); SET(COLOR, BACKGROUND_BLUE | T_RED); printf("背景BLUE文字RED\n"); SET(COLOR, BACKGROUND_BLUE | T_VIOLET); printf("背景BLUE文字VIOLET\n"); SET(COLOR, BACKGROUND_BLUE | T_GREEN); printf("背景BLUE文字YYLLOW\n"); SET(COLOR, BACKGROUND_BLUE | T_WHITE); printf("背景BLUE文字WHITE\n\n"); SET(COLOR, T_WHITE | T_WHITE); return 0; }
コメント