第10章 ブラシ


今回も簡単です。ブラシの作り方・使い方をやります。

ブラシは大きく3つの種類があります。単に色で塗りつぶすものと、 碁盤目などで塗りつぶすもの、そして、自分の好きなパターンで 塗りつぶすものがあります。今回は前2者についてやります。

1.初期化されていないCBrushオブジェクトを作成 2.CBrush::CreateSolidBrush()でソリッドブラシ(単色)を作る 3.または、CBrush::CreateHatchBrush()でハッチブラシ(碁盤目など)を作る 4.CBrushオブジェクトはスコープからはずれたら自動的に削除される   (自分でnewした場合は自分でdeleteする必要あり)

これが普通の作り方です。具体的には

CBrush brush; //CBrushクラスのオブジェクトを作成 brush.CreateSolidBrush(RGB(0, 255, 0)); //CBrushクラスのメンバ関数を使う

のような感じになります。
もっと簡単な方法としては、CBrushクラスの 引数付きコンストラクタを使う方法もあります。

CBrush brush(RGB(0, 255, 0));

ソリッドブラシの場合は引数として色を指定すればよいです。 ハッチブラシの場合はどのハッチ(模様)を使うかも指定します。

CBrush brush(HS_CROSSなど, RGB(255, 0, 255));

ハッチのパターンは

HS_BDIAGONAL・・・左下がりの斜線 HS_CROSS・・・・・碁盤目 HS_DIAGCROSS・・・斜めの碁盤目 HS_FDIAGONAL・・・右下がりの斜線 HS_HORIZONTAL・・ 水平線 HS_VERTICAL・・・ 垂直線

があります。碁盤目とか斜線の間の地色は現在の バックグラウンドカラーが使われます。 これを変更したい場合は

CDC::SetBkColor virtual COLORREF SetBkColor( COLORREF crColor );

を使います。戻り値は直前のバックグラウンドカラーです。 エラーの時は0x80000000となります。

また、背景モードはOPAQUE(デフォルト・背景を塗りつぶす) とTRANSPARENT(背景はそのまま)があります。TRANSPARENT にするとバックカラーを設定しても意味がありません。 背景モードを変更するには

CDC::SetBkMode int SetBkMode( int nBkMode );

を使います。これはテキスト、ハッチブラシ、ペンに影響を与えます。
戻り値は直前のバックグラウンドモードです。

まず、左上の正方形から描画を始めています。ソリッドブラシの 「赤」で描画しています。次にその下の正方形をハッチブラシを 作ってから描画しています。真ん中の上は別のハッチブラシを 作りました。真ん中の下はバックグラウンドカラーを「青」に変更しました。 右上はバックグラウンドカラーを「白」に戻しています。 右下はまた、バックグラウンドカラーを「水色」にしました。

左の円はバックグラウンドカラーはそのままですが、 バックモードを「TRANSPARENT」にしたため、背景が透けています。 右の円はバックモードを「OPAQUE」にしたので「水色」の バックグラウンドカラーが有効になっています。

// grph04.h class CMyApp : public CWinApp { public: virtual BOOL InitInstance(); }; class CMyWindow : public CFrameWnd { public: CMyWindow(); protected: afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() };

これは、前回と同じです。

// grph04.cpp #include <afxwin.h> #include "grph04.h" CMyApp myApp; BOOL CMyApp::InitInstance() { m_pMainWnd = new CMyWindow; m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); return TRUE; } BEGIN_MESSAGE_MAP(CMyWindow, CFrameWnd) ON_WM_PAINT() END_MESSAGE_MAP() CMyWindow::CMyWindow() { Create(NULL, "猫でもわかるブラシ", WS_OVERLAPPEDWINDOW, CRect(100, 100, 100 + 310, 100 + 240)); }

前回とほぼ同じです。親ウィンドウの位置、大きさを指定しています。

void CMyWindow::OnPaint() { CPaintDC dc(this); static CBrush brush[6], *pOldBrush; COLORREF crOld; int nOldBkMode; //ソリッドブラシの「赤」を作成 brush[0].CreateSolidBrush(RGB(255, 0, 0)); pOldBrush = (CBrush*)dc.SelectObject(&brush[0]); dc.Rectangle(20, 20, 20 + 80, 20 + 80); //ハッチブラシを作成 brush[1].CreateHatchBrush(HS_CROSS, RGB(255, 0, 0)); dc.SelectObject(&brush[1]); dc.Rectangle(20, 110, 20 + 80, 110 + 80); //別なハッチブラシを作成 brush[2].CreateHatchBrush(HS_FDIAGONAL, RGB(0, 255, 0)); dc.SelectObject(&brush[2]); dc.Rectangle(110, 20, 110 + 80, 20 + 80); //また別のハッチブラシを作成、さらにバックグラウンドカラーを //青に変更 brush[3].CreateHatchBrush(HS_VERTICAL, RGB(255, 255, 255)); dc.SelectObject(&brush[3]); crOld = dc.SetBkColor(RGB(0, 0, 255)); dc.Rectangle(110, 110, 110 + 80, 110 + 80); //別のハッチブラシを作成、バックを元に戻す brush[4].CreateHatchBrush(HS_DIAGCROSS, RGB(0, 255, 0)); dc.SetBkColor(crOld); dc.SelectObject(&brush[4]); dc.Rectangle(200, 20, 200 + 80, 20 + 80); //別のハッチブラシを作成、バックを水色に変更 brush[5].CreateHatchBrush(HS_BDIAGONAL, RGB(0, 0, 0)); dc.SelectObject(&brush[5]); crOld = dc.SetBkColor(RGB(0, 255, 255)); dc.Rectangle(200, 110, 200 + 80, 110 + 80); //バックモードをTRANSPARENTに変更 nOldBkMode = dc.SetBkMode(TRANSPARENT); dc.Ellipse(60, 60, 150, 150); //バックモードを元に戻す dc.SetBkMode(nOldBkMode); dc.Ellipse(150, 60, 240, 150); //ブラシ、バックグラウンドカラーを元に戻す dc.SelectObject(pOldBrush); dc.SetBkColor(crOld); }

今回のプログラムも簡単でした。いろいろ自分でグラフィクスを描画して 実験してみてください。
[MFC Index] [総合Index] [Previous Chapter] [Next Chapter]

Update 05/Apr/1998 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。