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 になってしまいます。