VisualStudio2017 【C言語】文字色(14色)背景色(RGB3原色)で表示に成功!

C

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

Microsoftのコンソール リファレンス

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;
}

 
にほんブログ村 IT技術ブログへ

コメント

タイトルとURLをコピーしました