ビットマップブラシ
ビットマップで塗りつぶす
GDI オブジェクトの一つである論理ブラシは、ビットマップを選択することもできます
これを利用すれば、図形の内部をテクスチャで描画することができます
ただし、Windows 95 ではこの機能に問題があります
他のバージョンや NT の場合は問題ありませんが、Windows95 は
8 × 8 ピクセルのビットマップブラシしかサポートしていません
このサイズを超えたビットマップを指定すると、8 × 8 ピクセル以降の部分は無視されます
ビットマップブラシを作成するには CreatePatternBrush() 関数を使います
HBRUSH CreatePatternBrush(HBITMAP hbmp);
hbmp にはブラシに使われるビットマップのハンドルを指定します
成功すれば論理ブラシが、失敗すれば NULL が返ります
モノクロビットマップを使用すると、現在のテキストの色を前景色
テキストの背景色を、ビットマップの背景色として採用します
//リソーススクリプト
KITTY BITMAP "back.bmp"
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
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;
HBITMAP hBitmap;
HBRUSH hBackGround;
hBitmap = LoadBitmap(hInstance , TEXT("KITTY"));
hBackGround = CreatePatternBrush(hBitmap);
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 = hBackGround;
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);
}
DeleteObject(hBitmap);
DeleteObject(hBackGround);
return msg.wParam;
}
このプログラムでは 32 × 32 ピクセルのアイコンをビットマップにして使用しました
Windows 95 を使っている場合は 8 × 8 のビットマップを使用してください
プログラムは、まずビットマップを読み込みこれから論理ブラシを作成します
WNDCLASS 構造体の hbrBackground メンバにこのブラシのハンドルを渡すことで
ウィンドウの背景を、このビットマップブラシで描画します
ビットマップと論理ブラシは、当然最後には削除する必要があります
因みに、ブラシはビットマップを使用するために指定したビットマップをコピーしています
そのため、ビットマップのハンドルはブラシ生成後すぐに消しても問題ありません
CreatePatternBrush() 以外に、LOGBRUSH 構造体でビットマップを設定し
CreateBrushIndirect() 関数からビットマップハンドルを作るという方法も考えられます
CreatePatternBrush()
HBRUSH CreatePatternBrush(HBITMAP hbmp);
指定されたビットマップのパターンを持つ論理ブラシを作成します
hbmp - ブラシの使用するビットマップのハンドルを指定します
戻り値 - 論理ブラシのハンドル。失敗すると NULL