塗りつぶし


パターンブロック転送

これまで、ある長方形を塗りつぶすときには Rectangle() を使っていたかもしれない
ここでは、長方形のブラシで塗りつぶす別の方法を紹介します

ビットブロック転送の他に、長方形のペイント用に
パターンブロック転送 というものがあります
パターンブロック転送には PatBlt() 関数を使用します
BOOL PatBlt(
	HDC hdc,
	int nXLeft , int nYLeft ,
	int nWidth , int nHeight ,
	DWORD dwRop
);
hdc にはデバイスコンテキストのハンドルを
nXLeft は長方形の左上隅の X 座標、nYLeft は Y 座標
nWidth は幅、nHeight は高さ、dwRop はラスタオペレーションコードを指定します
関数が成功すれば 0 以外、失敗すれば 0 が返ります

この関数は、現在のブラシで指定した長方形を塗りつぶします
ラスタオペレーションコードは、下記のリファレンスを参照してください
PATCOPY を指定すれば、パターンをそのまま転送します
#include <windows.h>

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

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

		SelectObject(hdc , CreateSolidBrush(RGB(0xFF , 0 , 0)));
		PatBlt(hdc , 10 , 10 , 200 , 100 , PATCOPY);
		DeleteObject(
			SelectObject(
				hdc , GetStockObject(WHITE_BRUSH)
			)
		);

		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)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}


ご覧のとおり、赤いブラシで塗りつぶされています
この動作は、パッケージ化され FillRect() 関数にまとめられています

int FillRect(HDC hDC , CONST RECT *lprc , HBRUSH hbr);

hDC はデバイスコンテキストのハンドル
lprc は長方形の情報が格納されている RECT 構造体のポインタ
hbr は、ブラシのハンドルです
関数が成功すると TRUE、失敗すると FALSE が返ります


PatBlt()

BOOL PatBlt(
	HDC hdc,
	int nXLeft , int nYLeft ,
	int nWidth , int nHeight ,
	DWORD dwRop
);
指定された長方形を現在のブラシでペイントします

hdc - デバイスコンテキストのハンドルを指定します
nXLeft - 長方形の左上隅の X 座標を指定します
nYLeft - 長方形の左上隅の Y 座標を指定します
nWidth - 長方形の幅を指定します
nHeight - 長方形の高さを指定します
dwRop - ラスタオペレーションコードを指定します

戻り値 - 成功すると 0 以外、失敗すると 0

ラスタオペレーションコードは以下の定数のいずれかを指定します

定数解説
PATCOPY 指定したパターンを描画先にコピーします
PATINVERT 指定したパターンの色と、描画先の色を、論理 XOR 演算子で結合します
DSTINVERT 描画先長方形の色を反転します
BLACKNESS 物理パレットのインデックス 0 に対応する色 (デフォルトは黒) で
描画先の長方形を塗りつぶします
WHITENESS 物理パレットのインデックス 0 に対応する色 (デフォルトは黒) で
描画先の長方形を塗りつぶします

FillRect()

int FillRect(HDC hDC , CONST RECT *lprc , HBRUSH hbr);

長方形を指定されたブラシで塗りつぶして描画します

hDC - デバイスコンテキストのハンドルを指定します
lprc - 長方形の情報が格納された RECT 構造体へのポインタを指定します
hbr - ブラシのハンドルを指定します。このブラシで塗りつぶします

戻り値 - 成功すると TRUE、失敗すると FALSE が返ります



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