文字色を設定する


デバイスコンテキストの設定

文字を表示し、そのサイズなどのデータをえることもできました
しかし、これだけではどうも物足りないですね

TextOut() 関数は、位置や文字列を受け取ることはできました
しかし、文字のフォントや文字サイズ、文字の色などの設定はできません
実は、このような使いまわしが予想される汎用的な設定部分は
関数ではなくデバイスコンテキストの設定値なのです

多くのGDIファンクションはデバイスコンテキストのハンドルを受け取ります
細かい設定は、ここで行うことで関数が冗長になることを防いでいます
だからこそ、TextOut() 関数も少ない引数で文字列を表示できるのです

と言うことは、デバイスコンテキストの色に関する設定を変更すれば
当然表示される文字列の色がそれに合わせて変化します

文字色は SetTextColor() 関数で設定します
この関数は、デバイスコンテキストの文字色を設定します

COLORREF SetTextColor(HDC hdc , COLORREF crColor);

hdc は、デバイスコンテキストのハンドルを、
crColor は、文字色を表す32ビット整数を指定します

COLORREF 型 は、色を表す32ビット型の整数です
戻り値は、以前設定されていた色を返します
関数が失敗した場合、CLR_INVALID が返ります

COLORREF は、8ビット 255 までの数ずつで3原色を表します
下位8ビットが赤、9〜16までが緑、17〜24までが青の色です
一般的には、10進数よりも16進数で表します

ただ、色を表すのにわざわざシフトしたりするのは非常に厄介です
ビットレベルではなく、各色の数値を独立させて設定したいと思うのが人情です
そこで RGBマクロ を用いることで、簡単にこれが実現します

COLORREF RGB(BYTE bRed , BYTE bGreen , BYTE bBlue);

BYTE 型 は1バイトの符号なし整数型です
bRed は赤の要素、bGreen は緑の要素、bBlue は青の要素を渡します
例えば、RGB(0 , 0 ,0xFF) では、青色を表しています

戻り値は、引数を COLORREF 型に変換した32ビット値が返ります

このように、色の設定を行うと
その後のGDIファンクションはこれに基いて画面に文字を表示します
#include<windows.h>

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	HDC hdc;
	PAINTSTRUCT ps;
	static LPCTSTR ptStr= "Kitty on your lap";

	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hwnd , &ps);
		SetTextColor(hdc , 0xFF << 16);
		TextOut(hdc , 10 , 10 , ptStr , lstrlen(ptStr));
		SetTextColor(hdc , RGB(255 , 0 , 0));
		TextOut(hdc , 10 , 50 , ptStr , lstrlen(ptStr));
		EndPaint(hwnd , &ps);
		return 0;
	}
	return DefWindowProc(hwnd , msg , wp , lp);
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
		 PSTR pCmdLine , int nCmdShow ) {
	HWND hwnd;
	WNDCLASS winc;
	MSG msg;

	winc.style		= CS_HREDRAW |  CS_VREDRAW;
	winc.lpfnWndProc	= WndProc;
	winc.cbClsExtra	= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");

	if (!RegisterClass(&winc)) return 0;

	hwnd = CreateWindow(
		TEXT("KITTY") , TEXT("Kitty on your lap") ,
		WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
		CW_USEDEFAULT , CW_USEDEFAULT ,
		CW_USEDEFAULT , CW_USEDEFAULT ,
		NULL , NULL , hInstance , NULL
	);

	if (hwnd == NULL) return 0;

	while (GetMessage(&msg , NULL , 0 , 0)) DispatchMessage(&msg);
	return msg.wParam;
}


文字色がカラフルになりましたね
最初の SetTextColor(hdc , 0xFF << 16); では、手動で色を指定しています
しかし、一般的には面倒なので SetTextColor(hdc , RGB(255 , 0 , 0)); のようにマクロを使います


SetTextColor()

COLORREF SetTextColor(HDC hdc , COLORREF crColor);

デバイスコンテキストの文字色を変更します

hdc - デバイスコンテキストのハンドルを指定します
crColor - 設定する色を指定します

戻り値 - 以前の文字色が返ります。失敗した場合は CLR_INVALID が返ります

RGB()

COLORREF RGB(BYTE bRed , BYTE bGreen , BYTE bBlue);

引数で指定された 赤、緑、青(RGB)の値を
カラー値で用いる COLORREF 型の値に変換して返します

bRed - 赤の要素値を指定します
bGreen - 緑の要素値を指定します
bBlue - 青の要素値を指定します

戻り値 - 引数の値を32ビットのカラー値に変換した値



前のページへ戻る次のページへ