1,Pen |
2,Brush |
今までは、グラフィックは黒い線でした、これに色をつけてみます。
色をつけるというのは少し複雑になってしまいます。
半分くらいは、お呪いと思って理解してください。
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万色)
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番目はハッチのブラシにして前のポリゴンに重ね書きをしてみました。
これを実行すると以下のようになります。
C++のPageに戻る