>> WINAPI入門トップに戻る

文字色と背景色の設定

今回は文字色と背景色の設定について説明します。

まず、文字色の設定ですが、SetTextColor関数を使います。

COLORREF SetTextColor(
HDC hdc, // デバイスコンテキストのハンドル
COLORREF crColor // テキストの色
);

第二引数はCOLORREF型の値を指定します。
色を表す32ビット型の整数です。
下位8ビットが赤、9~16までが緑、17~24までが青の色を表します。
25~31ビットは使いません。
普通に16進数で指定してもよいのですが、
一般的にはRGBマクロを使って指定します。

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

第一引数から、赤、緑、青、の色の割合を0~255の間で指定します。
実行すると自動的にその値に応じたCOLORREF型の値を返してくれます。

これらの関数を実行したコードが以下です。

#include <windows.h>
#include <stdio.h>

#define MSG(m) {\
	MessageBoxA(NULL,m,NULL,MB_OK);}

//ウィンドウハンドル
HWND hwnd;
//インスタンスハンドル
HINSTANCE hinst;

//ウィンドウ横幅
#define WIDTH 500
#define HEIGHT 300



LRESULT CALLBACK WinProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp)
{
	HDC hdc;


	PAINTSTRUCT ps;

	RECT rect;

	//左上が(10,10)、右下が(200,200)の領域を指定
	rect.left=10;
	rect.top=10;
	rect.right=200;
	rect.bottom=200;
		

	switch(msg){
		case WM_DESTROY:
			PostQuitMessage(0);
			return 0;

		case WM_PAINT:

			hdc=BeginPaint(hwnd,&ps);
			
			SetTextColor(hdc,RGB(0,0,255));

			//描画
			DrawText(hdc,"テストですけどどこまで描画されて、改行されるのかチェックしています。",
				-1,&rect,DT_LEFT | DT_WORDBREAK);

			EndPaint(hwnd,&ps);

			return 0;

		
	}
	return DefWindowProc(hwnd,msg,wp,lp);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
	MSG msg;
	WNDCLASS wc;

	wc.style=CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc=WinProc;
	wc.cbClsExtra=wc.cbWndExtra=0;
	wc.hInstance=hInstance;
	wc.hCursor=wc.hIcon=NULL;
	wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
	wc.lpszClassName="test";
	wc.lpszMenuName=NULL;
	
	if(!RegisterClass(&wc)){
		MSG("クラスの登録失敗");
		return -1;
	}

	hwnd=CreateWindowA("test","テストウィンドウ",WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
		0,0,400,400,NULL,NULL,hInstance,NULL);


	if(hwnd==NULL){
		MSG("ウィンドウ作成失敗");
		return -1;
	}






	//インスタンスハンドル
	hinst=hInstance;

	//エラーチェック用変数
	int check;

	while(check=GetMessage(&msg,NULL,0,0)){
		if(check==-1){
			break;
		}
		DispatchMessage(&msg);
	}

	//クラス解放
	UnregisterClass("test",hinst);

	return 0;

}

コレを実行すると、文字色が青色になって文字が表示されます。

次に背景色の設定について説明します。
関数には、SetBkColor関数を使います。

COLORREF SetBkColor(
HDC hdc, // デバイスコンテキストのハンドル
COLORREF crColor // 背景色の値
);

使い方は先程のSetTextColor関数と一緒です。

これを使ったコードが以下です。

#include <windows.h>
#include <stdio.h>

#define MSG(m) {\
	MessageBoxA(NULL,m,NULL,MB_OK);}

//ウィンドウハンドル
HWND hwnd;
//インスタンスハンドル
HINSTANCE hinst;

//ウィンドウ横幅
#define WIDTH 500
#define HEIGHT 300



LRESULT CALLBACK WinProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp)
{
	HDC hdc;


	PAINTSTRUCT ps;

	RECT rect;

	//左上が(10,10)、右下が(200,200)の領域を指定
	rect.left=10;
	rect.top=10;
	rect.right=200;
	rect.bottom=200;
		

	switch(msg){
		case WM_DESTROY:
			PostQuitMessage(0);
			return 0;

		case WM_PAINT:

			hdc=BeginPaint(hwnd,&ps);
			
			SetTextColor(hdc,RGB(0,0,255));

			SetBkColor(hdc,RGB(0,255,0));

			//描画
			DrawText(hdc,"テストですけどどこまで描画されて、改行されるのかチェックしています。",
				-1,&rect,DT_LEFT | DT_WORDBREAK);

			EndPaint(hwnd,&ps);

			return 0;

		
	}
	return DefWindowProc(hwnd,msg,wp,lp);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
	MSG msg;
	WNDCLASS wc;

	wc.style=CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc=WinProc;
	wc.cbClsExtra=wc.cbWndExtra=0;
	wc.hInstance=hInstance;
	wc.hCursor=wc.hIcon=NULL;
	wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
	wc.lpszClassName="test";
	wc.lpszMenuName=NULL;
	
	if(!RegisterClass(&wc)){
		MSG("クラスの登録失敗");
		return -1;
	}

	hwnd=CreateWindowA("test","テストウィンドウ",WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
		0,0,400,400,NULL,NULL,hInstance,NULL);


	if(hwnd==NULL){
		MSG("ウィンドウ作成失敗");
		return -1;
	}


	//インスタンスハンドル
	hinst=hInstance;

	//エラーチェック用変数
	int check;

	while(check=GetMessage(&msg,NULL,0,0)){
		if(check==-1){
			break;
		}
		DispatchMessage(&msg);
	}

	//クラス解放
	UnregisterClass("test",hinst);

	return 0;

}

これを実行すると下記のような画面が表示されます。


文字色は青色、背景色は緑色に指定しています。
背景色とは文字の背景色のことです。
クライアント領域の背景色のことではないのでご注意下さい。

このようにSetBkColor関数を使うと背景色を好きな色で塗りつぶすことが出来ますが、
塗りつぶすか塗りつぶさないかを設定できる関数もあります。
SetBkModeという関数です。

int SetBkMode(
HDC hdc, // デバイスコンテキストのハンドル
int iBkMode // 背景モード
);

背景モードには、OPAQUEかTRANSPARENTを設定します。
デフォルトでは塗りつぶすという意味のOPAQUEが設定されています。
この関数を使ってTRANSPARENTに設定すると、文字の背景色が塗りつぶされなくなります。
つまり、文字の下の背景色はそのウィンドウの背景色が表示されることになります。

以上が、文字の描画とその背景色の設定についての説明です。

次回は図形の描画について説明します。


>> 【図形の描画】に進む
>> WINAPI入門トップに戻る