MyPen クラスを作ります。 ファイル名は、"MyPen.h" です。 単独で使うのでなく、MyDCクラスのメンバーにします。
ペンのクラスです。
#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クラスのコンストラクタで、後始末はデストラクタに書きます。
色をつけたり、スタイルを変更するためのメソッドを作りました。 どれをやっても、その都度ペンを作ったり、前のペンを開放しています。
青い部分を見てください。
//
// 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 になってしまいます。