EternalWindows
ビットマップ / パターンブラシ

GDIオブジェクトの1つであるブラシは、図形の内部を塗りつぶす機能を提供しています。 この塗りつぶし方については、たとえばソリッドブラシなら特定の色を使用することになりますが、 パターンブラシと呼ばれるブラシはビットマップを使用することができます。 ビットマップで塗りつぶすというのは、1つのビットマップを連続して描画するということであるため、 使用するビットマップによっては、次のようなグラデーションを表現できます。

パターンブラシは、CreatePatternBrushで作成することができます。

HBRUSH CreatePatternBrush(
  HBITMAP hbmp
);

hbmpは、塗りつぶしに使用するビットマップハンドルを指定します。

次に、今回ブラシとして使用するビットマップを示します。

以下、今回のプログラムです。

#include <windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
	TCHAR      szAppName[] = TEXT("sample");
	HWND       hwnd;
	MSG        msg;
	WNDCLASSEX wc;
	RECT       rc;
	DWORD      dwStyle;

	wc.cbSize        = sizeof(WNDCLASSEX);
	wc.style         = 0;
	wc.lpfnWndProc   = WindowProc;
	wc.cbClsExtra    = 0;
	wc.cbWndExtra    = 0;
	wc.hInstance     = hinst;
	wc.hIcon         = (HICON)LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_SHARED);
	wc.hCursor       = (HCURSOR)LoadImage(NULL, IDC_ARROW, IMAGE_CURSOR, 0, 0, LR_SHARED);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName  = NULL;
	wc.lpszClassName = szAppName;
	wc.hIconSm       = (HICON)LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_SHARED);
	
	if (RegisterClassEx(&wc) == 0)
		return 0;

	dwStyle = WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX;
	SetRect(&rc, 0, 0, 640, 480);
	AdjustWindowRect(&rc, dwStyle, FALSE);

	hwnd = CreateWindowEx(0, szAppName, szAppName, dwStyle, CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left, rc.bottom - rc.top, NULL, NULL, hinst, NULL);
	if (hwnd == NULL)
		return 0;

	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);
	
	while (GetMessage(&msg, NULL, 0, 0) > 0) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return (int)msg.wParam;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	static HBITMAP hbmp = NULL;
	static HBRUSH  hbr = NULL;

	switch (uMsg) {

	case WM_CREATE:
		hbmp = (HBITMAP)LoadImage(NULL, TEXT("brush.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
		if (hbmp == NULL)
			return -1;

		hbr = CreatePatternBrush(hbmp);
		
		return 0;

	case WM_PAINT: {
		HDC         hdc;
		RECT        rc;
		PAINTSTRUCT ps;
		HBRUSH      hbrPrev;

		hdc = BeginPaint(hwnd, &ps);
		GetClientRect(hwnd, &rc);

		hbrPrev = (HBRUSH)SelectObject(hdc, hbr);
		FillRect(hdc, &rc, hbr);
		SelectObject(hdc, hbrPrev);

		EndPaint(hwnd, &ps);

		return 0;
	}
	
	case WM_DESTROY:
		if (hbmp != NULL)
			DeleteObject(hbmp);
		DeleteObject(hbr);
		PostQuitMessage(0);
		return 0;

	default:
		break;

	}

	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

WM_CREATEでは、LoadImageを呼び出してCreatePatternBrushに指定するビットマップを取得しています。 これに成功した場合は、ビットマップハンドルをCreatePatternBrushに指定し、 パターンブラシを作成することができます。 WM_PAINTではクライアント領域全体をFillRectで塗りつぶすようになっていますが、 この前にパターンブラシがデバイスコンテキストに選択されるおかげで、 塗りつぶしにパターンブラシが使用されることになります。


戻る