タイトル

Pen・Brush

タイトル

1,Pen
2,Brush

1,Pen

今までは、グラフィックは黒い線でした、これに色をつけてみます。
色をつけるというのは少し複雑になってしまいます。
半分くらいは、お呪いと思って理解してください。


void CNamaeView::OnDraw(CDC* pDC)
{
	CNamaeDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	CPen newPen;
	CPen* oldPen;
	newPen.CreatePen(PS_SOLID,1,RGB(0,255,0));
	oldPen=pDC->SelectObject(&newPen);
	pDC->Ellipse(50,50,250,250);
	pDC->SelectObject(oldPen);
	newPen.DeleteObject();

}

これで、緑色の円がかけます。では、プログラムの解説をします。
ここでは、新しいPen(赤、幅1、実線)をnewPenで宣言しました。
今までのPenの状態を保存する必要があるのでそれをoldPenに格納します。そして
pDC->SelectObject(&newPen);
でnewPenが現在のPenに選択されたので、円を描くと緑色になります。終わったら
pDC->SelectObject(oldPen);
で現在のPenをoldPenに戻して、newPenを消去します。

さて、このPenですが、CreatePenいこうでPenの特徴を指定してました。
最初のPS_SOLIDは「実線」という意味です。他のものをまとめてみます。

PS_SOLID 実線
PS_DASH 破線
PS_DOT 点線
PS_DASHDOT 一点鎖線
PS_DASHDOTDOT 二点鎖線
PS_NULL 空線

次の数字はPenの幅をピクセル単位で指定します。
最後のRGBは色を指定します。(1677万色)

上上へ


2,Brush

Brushは図形の内部の模様や色を指定します。
使い方は先ほどのPenと変わりません。


void CNamaeView::OnDraw(CDC* pDC)
{
	CNamaeDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	CBrush newBrush;
	CBrush* oldBrush;
	newBrush.CreateSolidBrush(RGB(0,0,255));
	oldBrush=pDC->SelectObject(&newBrush);
	pDC->Ellipse(50,50,250,250);
	pDC->SelectObject(oldBrush);
	newBrush.DeleteObject();

}

先ほどのPenがBrushに変わったのとCreateSolidBrushというのがあります。
じつは、Brushには2種類あります。
一つはSolidBrushで内部は指定された色で満たされます。
もう一つはHatchBrushで指定された色のパターンを
指定された模様で塗りつぶします。
塗りつぶすパターンには以下の種類があります。

HS_CROSS 水平、垂直の格子ハッチ
HS_DIAGCROSS 45度の斜め格子ハッチ
HS_BDIAGONAL 45度の右下がりのハッチ
HS_FDIAGONAL 45度の右上がりハッチ
HS_HRIZONTAL 水平線ハッチ
HS_VERTICAL 垂直線ハッチ

色については前回と同様で1677万色出せます。

HatchBrushには特有の機能があります。
1つは模様のかからない部分をどうするかというものです。これは
SetBkMode();
というものです。()には、TRANSPARENT(透明)とOPAQUE(現在のブラシで塗られる)
のどちらかを入れますが、デフォルトでOPAQUEになります。

もう一つは
SetBkColor(RGB(100,200,255));
というもので前述のOPAQUEで塗る色を指定します。

では今までのものをまとめてみました。


void CNamaeView::OnDraw(CDC* pDC)
{
	CNamaeDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	//変数の宣言
	CBrush newBrush;
	CBrush* oldBrush;
	COLORREF color[]={RGB(0,0,0),RGB(0,255,255),RGB(0,255,127),RGB(0,127,255)};
	POINT p1[]={50,100,200,150,100,200};
	POINT p2[]={100,150,250,130,150,80};

	//ブラシの色を変えたとき
	for (int i=0; i<4; i++){
		newBrush.CreateSolidBrush(color[i]);
		oldBrush=pDC->SelectObject(&newBrush);
		pDC->Ellipse(i*60,20,i*60+40,50);
		pDC->SelectObject(oldBrush);
		newBrush.DeleteObject();
	}

	//ポリゴン(1)
	newBrush.CreateSolidBrush(RGB(0,255,0));
	oldBrush=pDC->SelectObject(&newBrush);
	pDC->Polygon(p1,3);
	pDC->SelectObject(oldBrush);
	newBrush.DeleteObject();

	//ポリゴン(2)
	newBrush.CreateHatchBrush(HS_CROSS,RGB(255,0,255));
	oldBrush=pDC->SelectObject(&newBrush);
	pDC->Polygon(p2,3);
	pDC->SelectObject(oldBrush);
	newBrush.DeleteObject();
}

少し長くなりましたががんばって解読してください。
これは、大きく分けて3段階に分かれています。
最初にブラシの色を変えて楕円を描いています。
色のデータは配列のcolorに入れておきました。

2番目は、ポリゴンです。
3番目はハッチのブラシにして前のポリゴンに重ね書きをしてみました。
これを実行すると以下のようになります。

ブラシのTest

上上へ


戻るC++のPageに戻る