背景色とモード


背景の描画

デバイスコンテキストの属性を操作することで、背景色を指定できます
背景色は、ウィンドウの背景ではなく描画した文字などの背景です

デフォルトで背景色は白ですが、これを変更することができます
意識しませんでしたが、実は文字などを描画する時に
プログラムは背景色で塗りつぶしてから文字を描画していたのです

背景色を指定するにはSetBkColor()関数を呼び出します

COLORREF SetBkColor(HDC hdc , COLORREF crColor);

hdcには、デバイスコンテキストのハンドルを
crColorには、背景色を表すCOLORREF型を渡します

戻り値は、以前設定されていた色を返します
関数が失敗するとCLR_INVALIDが返ります
また、現在の背景色を得るGetBkColor()関数も存在します

しかし、背景を塗りつぶす必要がなく
現在の背景を残したい場合もあることでしょう
そのような場合はSetBkMode()で設定することができます

int SetBkMode(HDC hdc , int iBkMode);

hdcには、デバイスコンテキストのハンドルを
iBkModeには、背景モードを表す定数を指定します

これは、描画前に背景色で背景を塗りつぶすOPAQUE(デフォルト)か
背景を残すTRANSPARENTのいずれかを指定します
戻り値は以前の背景モードを表す数値ですが、失敗すると 0 が返ります
現在の背景モードを返すGetBkMode()関数も同様に存在します
#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	HDC hdc;
	PAINTSTRUCT ps;
	TEXTMETRIC tm;
	LPTSTR lptStr = TEXT("Kitty on your lap");

	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hwnd , &ps);
		GetTextMetrics(hdc , &tm);

		SetBkColor(hdc , RGB(0xFF , 0 , 0));
		TextOut(hdc , 10 , 10 , lptStr , lstrlen(lptStr));

		SetBkMode(hdc , TRANSPARENT);
		TextOut(hdc , 10 , 10 + tm.tmHeight , lptStr , lstrlen(lptStr));
		EndPaint(hwnd , &ps);
		return 0;
	}
	return DefWindowProc(hwnd , msg , wp , lp);
}

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

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

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

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


見てわかるように、最初の表示したデフォルトの背景モードでは
描画範囲を指定背景色で塗りつぶしてから描画しています

しかし、描画モードを変更して背景色を塗りつぶさないようにした場合
下の行のように、背景が変更されることはありません


SetBkColor()

COLORREF SetBkColor(HDC hdc , COLORREF crColor);

デバイスコンテキストの背景色を指定します

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

戻り値 - 戻り値は、以前設定されていた色、失敗するとCLR_INVALID

SetBkMode()

int SetBkMode(HDC hdc , int iBkMode);

背景モードを変更します

hdc - デバイスコンテキストのハンドルを指定します
iBkMode - 背景モードを指定します
戻り値 - 以前設定されていた背景モード、失敗すると 0

定数解説
OPAQUE テキスト、ハッチブラシ、またはペンが描画される前に
現在の背景色で背景を塗りつぶします
TRANSPARENT 背景をそのまま残します

GetBkColor()

COLORREF GetBkColor(HDC hdc);

現在の背景色を返します

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

戻り値 - 現在の背景色、失敗すると、CLR_INVALID

GetBkMode()

int GetBkMode(HDC hdc);

現在の背景モードを返します

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

戻り値 - 現在の背景モード、失敗すると、0



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