ブラシの使用方法
ペイントや塗りつぶしを行うにはブラシを使います。さまざまな種類のブラシを作成できます。
- 純色ブラシ
色を指定して作成(CreateSolidBrushおよびCreateSysColorBrush) - パターンブラシ
ビットマップを指定して作成(CreatePatternBrush) - DIBパターンブラシ
デバイス非依存ビットマップを指定して作成(CreateDIBPatternBrush) - ハッチブラシ
パターンと色を指定して作成(CreateHatchBrush)- 45度の右下がりハッチ(HS_BDIAGONAL)
- 45度の右上がりハッチ(HS_FDIAGONAL)
- 水平と垂直の格子ハッチ(HS_CROSS)
- 45度の斜め格子ハッチ(HS_DIAGCROSS)
- 水平線ハッチ(HS_HORIZONTAL)
- 垂直線ハッチ(HS_VERTICAL)
これらのブラシは、LOGBRUSH構造体を指定して作成するという方法もあります(CreateBrushIndirect)。
ブラシの使用例1
次に紹介する1番目の例では、赤色の純色ブラシを使って四角形を描画します。Rectangle()メソッドを使う場合は、デバイスコンテキスト内でブラシを選択する必要があります。また、このメソッドは、現在選択されているペン(既定では1ピクセル幅、実線、黒色)を使って四角形の周りに縁も描画します。
void CChildView::OnPaint()
{
CPaintDC dc(this);
CRect rc;
GetClientRect(rc);
rc.DeflateRect(50, 50, 50, 50);
// create a solid red brush
CBrush br(RGB(255, 0, 0));
// select the brush into the device context
CBrush* oldbrush = dc.SelectObject(&br);
// draw a rectangle using the current brush for filling and
// current pen for border
dc.Rectangle(rc);
// select back the old brush
dc.SelectObject(oldbrush);
}

ブラシの使用例2
2番目の例では、COLORREFカラーまたはシステムカラー(COLOR_BTNFACE)から純色ブラシを作成します。FillRect()メソッドは、提供されているブラシを使って四角形を描画します(CDCオブジェクトで事前に選択されている必要はありません)。四角形の周りに縁を描画しない点も、Rectangle()とは異なります。
void CChildView::OnPaint()
{
CPaintDC dc(this);
CRect rc;
GetClientRect(rc);
// create a red brush
CBrush br1;
br1.CreateSolidBrush(RGB(255, 0, 0));
// create a brush with a system color
CBrush br2;
br2.CreateSysColorBrush(COLOR_BTNFACE);
// fill a left rect with red brush
CRect rc1 = rc;
rc1.DeflateRect(50, 50, rc.Width()/2+10, 50);
dc.FillRect(&rc1, &br1);
// fill a right rect with system color brush
CRect rc2 = rc;
rc2.DeflateRect(rc.Width()/2+10, 50, 50, 50);
dc.FillRect(&rc2, &br2);
}

ブラシの使用例3
パターンでの塗りつぶしには、ビットマップを使います。リソースからビットマップを読み込み、それを使ってブラシを作成できます。RoundRect()メソッドは、縁が丸い四角形を描画します。この例では、白黒のタイルパターンを使っています。
void CChildView::OnPaint()
{
CPaintDC dc(this);
CRect rc;
GetClientRect(rc);
rc.DeflateRect(50, 50, 50, 50);
CBitmap bmp;
bmp.LoadBitmap(IDB_PATTERN);
// Create a pattern brush from the bitmap.
CBrush brush;
brush.CreatePatternBrush(&bmp);
// Select the brush into a device context, and draw.
CBrush* pOldBrush = (CBrush*)dc.SelectObject(&brush);
// draw a rounded rectangle
dc.RoundRect(rc, CPoint(10,10));
// Restore the original brush.
dc.SelectObject(pOldBrush);
}

ブラシの使用例4
このセクションの先頭で示したように、6種類のハッチブラシを作成できます。そのすべての使用例を以下に示します。
void CChildView::OnPaint()
{
CPaintDC dc(this);
CRect rc;
GetClientRect(rc);
rc.DeflateRect(10, 10, 10, 10);
CBrush brush1;
brush1.CreateHatchBrush(HS_BDIAGONAL, RGB(255, 0, 0));
dc.FillRect(
CRect(rc.left, rc.top, rc.Width()/2-10, rc.Height()/3-5),
&brush1);
CBrush brush2;
brush2.CreateHatchBrush(HS_FDIAGONAL, RGB(255, 0, 0));
dc.FillRect(
CRect(rc.Width()/2+10, rc.top, rc.right, rc.Height()/3-5),
&brush2);
CBrush brush3;
brush3.CreateHatchBrush(HS_DIAGCROSS, RGB(255, 0, 0));
dc.FillRect(
CRect(rc.left, rc.Height()/3+5, rc.Width()/2-10,
2*rc.Height()/3-5),
&brush3);
CBrush brush4;
brush4.CreateHatchBrush(HS_CROSS, RGB(255, 0, 0));
dc.FillRect(
CRect(rc.Width()/2+10, rc.Height()/3+5, rc.right,
2*rc.Height()/3-5),
&brush4);
CBrush brush5;
brush5.CreateHatchBrush(HS_HORIZONTAL, RGB(255, 0, 0));
dc.FillRect(
CRect(rc.left, 2*rc.Height()/3+5, rc.Width()/2-10,
rc.bottom),
&brush5);
CBrush brush6;
brush6.CreateHatchBrush(HS_VERTICAL, RGB(255, 0, 0));
dc.FillRect(
CRect(rc.Width()/2+10, 2*rc.Height()/3+5, rc.right,
rc.bottom),
&brush6);
}

