色は、ペンを使うことで解決します。 線の太さも、ペンによります。 しかし、複数の色を使うとなると大変です。 そのための方針を考えます。
"MyApp.h" です。 複数の色を使う場合を考えます。 色のついた部分を見てください。
// // MyApp.h // class MyApp : public MyMainWnd{ public: // WM_PAINT void wmPaint(HDC hdc){ MyDC g(hdc); HPEN hNewPen, hOldPen, hOrgPen; // ペンの初期設定 hNewPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); hOrgPen = (HPEN)SelectObject(hdc, hNewPen); // 1色目 hNewPen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); hOldPen = (HPEN)SelectObject(hdc, hNewPen); DeleteObject(hOldPen); // 直線を描く---------------------------- g.MoveTo(0, 10); g.LineTo(100, 10); //--------------------------------------- // 2色目 hNewPen = CreatePen(PS_SOLID, 1, RGB(0, 255, 0)); hOldPen = (HPEN)SelectObject(hdc, hNewPen); DeleteObject(hOldPen); // 直線を描く---------------------------- g.MoveTo(0, 60); g.LineTo(100, 60); //--------------------------------------- // 3色目 hNewPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 255)); hOldPen = (HPEN)SelectObject(hdc, hNewPen); DeleteObject(hOldPen); // 直線を描く---------------------------- g.MoveTo(0, 110); g.LineTo(100, 110); //--------------------------------------- // 元のペンに戻す hOldPen = (HPEN)SelectObject(hdc, hOrgPen); DeleteObject(hOldPen); } };
実行画面です。
線を描くのはペンです。 このペンを変えることで、色が変わります。 線の種類も変えることができます。 しかし、複数の色を使いたいとなると、複数のペンを作らなければいけません。
1色でも、ペンは作らなければいけません。 そして、そのペンを hdc にセットしなければなりません。 最後に、作ったペンはメモリ上にあるので、開放しなければいけません。 ですから、色の数だけこれを実行するのは大変です。
さて、最初から必要なだけペンを用意することも考えられます。 しかし、ここでは別なことを考えます。
ペンを作るには、CreatePen関数を使います。
HPEN CreatePen( int fnPenStyle, // ペンのスタイル int nWidth, // ペンの幅 COLORREF crColor // ペンの色 );
ペンのスタイルは、PS_ で始まるマクロ定数を使います。 この関数の返値がペンのハンドルです。
つぎは、作ったペンを使うように指示します。 これは、SelectObject関数を使います。 オブジェクトのハンドルへ、ペンのハンドルを代入します。
HGDIOBJ SelectObject( HDC hdc, // デバイスコンテキストのハンドル HGDIOBJ hgdiobj // オブジェクトのハンドル );
この関数の返値は、以前のペンです。 最後にペンをメモリから開放するには、DeleteObject関数を使います。
BOOL DeleteObject( HGDIOBJ hObject // グラフィックオブジェクトのハンドル );
ペンが必要になったら、この3つの関数を使います。
これが、1本のペンの場合です。 では、複数のペンの場合を考えてみます。 この場合、ペンが必要になる前にペンを登録します。 この時、元々のペンのハンドルを得ておきます。 最初の緑の部分です。 こうすると、その後のコードが同じになります。
hNewPen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); hOldPen = (HPEN)SelectObject(hdc, hNewPen); DeleteObject(hOldPen);
前のペンはきちんと開放されています。 最後に、元のペンに戻し、かつ前のペンを開放しています。 後ろの緑の部分です。
さらに、1行にすることもできます。
DeleteObject((HPEN)SelectObject(hdc, CreatePen(PS_SOLID, 1, RGB(255, 0, 0))));
ここまでしなくとも、1つの関数を作る方がわかり易いです。 すると、最初の緑の部分は、Begin~関数で、後ろのほうの緑は、End~関数とすればいいわけです。
しかし、クラスを使うという方法もあります。 次回はクラスを作ります。