グラフィックス

MyPen クラスを作ります。 ファイル名は、"MyPen.h" です。 単独で使うのでなく、MyDCクラスのメンバーにします。

MyPen クラス

ペンのクラスです。

#ifndef	___MYPEN
#define	___MYPEN

//
//	MyPen クラス
//		MyDCクラスのメンバーにする
//

class MyPen : public LOGPEN{
private:
	HDC hdc;
	HPEN hNewPen, hOldPen, hOrgPen;

	void Create(){
		hNewPen = CreatePen(lopnStyle, lopnWidth.x, lopnColor);
		hOldPen = (HPEN)SelectObject(hdc, hNewPen);
		DeleteObject(hOldPen);
	}
public:
	// コンストラクタ
	MyPen(){
		lopnStyle = PS_SOLID;
		lopnWidth.x = 1;
		lopnColor = RGB(0, 0, 0);
	}
	// デストラクタ	
	~MyPen(){
		// 元のペンに戻す
		hOldPen = (HPEN)SelectObject(hdc, hOrgPen);
		DeleteObject(hOldPen);
	}
	// 最初にペンを作り、元のペンを保存	
	void Init(HDC hDc){
		hdc = hDc;
		hNewPen = CreatePen(lopnStyle, lopnWidth.x, lopnColor);
		hOrgPen = (HPEN)SelectObject(hdc, hNewPen);
		SelectObject(hdc, hOrgPen);
	}
	// ペンを変える
	void Style(UINT s){
		lopnStyle = s;
		Create();
	}
	void Size(int s){
		lopnWidth.x = s;
		Create();
	}
	void Color(int r, int g, int b){
		lopnColor = RGB(r, g, b);
		Create();
	}
};


#endif

"MyDC.h" の一部です。 赤い部分を追加します。

#ifndef	___MYDC
#define	___MYDC

//
//	MyDC クラス(デバイスコンテキスト)
//		MyDC
//

#include	<MyPen.h>

class MyDC{
public:
	MyPen Pen;

public:
	// コンストラクタ
	MyDC(HDC hDc){
		hdc = hDc;
		Pen.Init(hdc);
	}
};

#endif

解説

LOGPEN構造体は、次のようになっています。

typedef struct tagLOGPEN {  /* lgpn */
   UINT lopnStyle;
   POINT lopnWidth;
   COLORREF lopnColor;
} LOGPEN;

これは、CreatePen関数の引数と同じです。 これを、そのまま使います。

LOGPEN構造体を継承します。 この時点では、MyPenクラスは、LOGPEN構造体と同じです。

class MyPen : public LOGPEN{
};

前回のプログラムと同じことをさせます。 最初にペンを作るのは、MyDCクラスのコンストラクタで、後始末はデストラクタに書きます。

色をつけたり、スタイルを変更するためのメソッドを作りました。 どれをやっても、その都度ペンを作ったり、前のペンを開放しています。

使用例(win153)

青い部分を見てください。

//
//	MyApp.h
//

class MyApp : public MyMainWnd{
public:

	// WM_PAINT
	void wmPaint(HDC hdc){
		MyDC g(hdc);
	
		// 1色目
		g.Pen.Color(255, 0, 0);
		// 直線を描く----------------------------
		g.MoveTo(0, 10);
		g.LineTo(100, 10);
		//---------------------------------------		
	
		// 2色目
		g.Pen.Color(0, 255, 0);
		g.Pen.Style(PS_DASH);
		// 直線を描く----------------------------
		g.MoveTo(0, 60);
		g.LineTo(100, 60);
		//---------------------------------------		
	
		// 3色目
		g.Pen.Color(0, 0, 255);
		g.Pen.Size(2);
		// 直線を描く----------------------------
		g.MoveTo(0, 110);
		g.LineTo(100, 110);
	}
};

実行画面です。

2色目のとき、スタイルも変えています。 3色目のときは、線の太さを変えています。 ただ、線の太さが1以外のときは、PS_SOLID になってしまいます。


[前] [目次]