ブラシを作ろう
塗りつぶす
描画命令の線はペンオブジェクトで描画されることがわかりました
今度は、閉じた図形のない面を塗りつぶすブラシをやりましょう
ブラシはペン属性同様にGDIオブジェクトで、SelectObject()で指定することができます
以後、長方形や円などの閉じた図形のない面はブラシで塗りつぶされます
また、ウィンドウの背景色もブラシをでしたね
定義済みのストックオブジェクトとして、白のWHITE_BRUSH、
黒のBLACK_BRUSH、灰色のGRAY_BRUSHなどが用意されています
#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 , GetStockObject(GRAY_BRUSH));
Rectangle(hdc , 10 , 10 , 200 , 50);
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(BLACK_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;
}
背景を黒いブラシに変更しています
さらに、デバイスコンテキストのブラシを灰色にしているのがわかりますね
長方形の内面が、灰色で塗りつぶされています。//この時、外枠は黒
ブラシを作る
もちろん、ペン同様のストックオブジェクト以外に自作のブラシも作れます
こうすることで、多彩な色彩表現が可能になります
まず、純粋なブラシを生成するにはCreateSolidBrush()が最も簡単です
このブラシは、指定した色のブラシのハンドルを返します
HBRUSH CreateSolidBrush(COLORREF crColor);
crColorには、ブラシの色を指定します
HBRUSHは、ウィンドウクラスで触れましたがブラシのハンドル型です
自作のGDIオブジェクトは、使用後は削除することを忘れないでください
#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(0XFF << 16));
Rectangle(hdc , 10 , 10 , 200 , 50);
DeleteObject(SelectObject(hdc , CreateSolidBrush(0xFF)));
Ellipse(hdc , 100 , 25 , 300 , 100);
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)) DispatchMessage(&msg);
return msg.wParam;
}
閉じた図形の内面が、指定してブラシで塗りつぶされていますね
このように、自作ブラシを用いれば様々な色で表現することができるようになります
CreateSolidBrush() は、最も簡単なブラシの作成ファンクションですが
これ以外にも、ハッチと呼ばれる特殊なブラシがあります
//さらにビットマップをブラシにすることもできますが、それはビットマップの説明の後にでも
ハッチブラシは、水平、垂直、斜め45度などに連続した線(ハッチパターン)で
閉じられた図形の内面を塗りつぶすというものです
線と線の間は、背景色と背景モードで決定されます
ハッチブラシにはCreateHatchBrush()ファンクションを使います
HBRUSH CreateHatchBrush(int fnStyle , COLORREF clrref);
fnStyleには、ハッチスタイルを表す定数を指定します
今回は、水平と垂直のクロスHS_CROSSと
45度のクロスHS_DIAGCROSSを指定してみましょう
clrrefには、ブラシの色を設定します
設定したブラシのハンドルを返します
#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 , CreateHatchBrush(HS_CROSS , 0XFF << 16));
Rectangle(hdc , 10 , 10 , 200 , 50);
DeleteObject(SelectObject(hdc , CreateHatchBrush(HS_DIAGCROSS , 0xFF)));
Ellipse(hdc , 100 , 25 , 300 , 100);
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)) DispatchMessage(&msg);
return msg.wParam;
}
これがハッチブラシです、純粋に水平線、平行線45度のブラシもあります
また、これらの情報を統括してブラシを生成するCreateBrushIndirect()もあります
このクラスには、ブラシを表す構造体を指定します
HBRUSH CreateBrushIndirect(CONST LOGBRUSH *lplb);
lplbには、LOGBRUSHへのポインタを指定します
LOGBRUSH構造体は、ペンを表す構造体で次のようになっています
typedef struct tagLOGBRUSH {
UINT lbStyle;
COLORREF lbColor;
LONG lbHatch;
} LOGBRUSH;
lbStyleは、ブラシのスタイルを指定します
これによって、ハッチなどを無視するかどうかを決定します
通常のブラシならBS_SOLID、ハッチブラシならBS_HATCHEDなどがあります
このほかにも、無効なブラシBS_NULLなどもあります
lbColorには、ブラシの色を指定します//ビットマップなどの時は無視
lbHatchは、ハッチスタイルを指定します//ハッチ以外の時は無視
CreateSolidBrush()
HBRUSH CreateSolidBrush(COLORREF crColor);
指定した色のブラシを生成します
crColor - ブラシの色を指定します
戻り値 - 指定した色のブラシのハンドルを返します
CreateHatchBrush()
HBRUSH CreateHatchBrush(int fnStyle , COLORREF clrref);
指定したハッチパターンと色のブラシを返します
fnStyle - ブラシのハッチスタイルを定数で指定します
clrref - ブラシの色を指定します
戻り値 - 指定した色のハッチブラシを返します
ハッチスタイルは次の定数を指定します
定数 | 解説
|
---|
HS_BDIAGONAL | 45 度の右下がりのハッチ
|
HS_CROSS | 水平と垂直のクロスハッチ
|
HS_DIAGCROSS | 45 度のクロスハッチ
|
HS_FDIAGONAL | 45 度の右上がりのハッチ
|
HS_HORIZONTAL | 水平ハッチ
|
HS_VERTICAL | 垂直ハッチ
|
CreateBrushIndirect()
HBRUSH CreateBrushIndirect(CONST LOGBRUSH *lplb);
指定しされた論理ペン構造体のブラシハンドルを返します
lplb - ブラシを表すLOGBRUSH構造体型へのポインタ
戻り値 - 指定した色のハッチブラシを返します