グラフィックス

色は、ペンを使うことで解決します。 線の太さも、ペンによります。 しかし、複数の色を使うとなると大変です。 そのための方針を考えます。

複数の色を使う(win152)

"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~関数とすればいいわけです。

しかし、クラスを使うという方法もあります。 次回はクラスを作ります。


[前] [目次] [次]