色は、ペンを使うことで解決します。 線の太さも、ペンによります。 しかし、複数の色を使うとなると大変です。 そのための方針を考えます。
"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~関数とすればいいわけです。
しかし、クラスを使うという方法もあります。 次回はクラスを作ります。