ホーム ATL/WTL
ペン
ドキュメント種別 ATL/WTL に関する文書
最終更新日 2003/12/17
PR
 WTLではGDIオブジェクトのペンをCPenTというテンプレートクラスでカプセル化しています。 テンプレート引数はbool値で、trueの場合はデストラクタでDeleteObject()を呼び出し、 falseの場合は呼び出しません。atlgdi.hヘッダではtypedefによって次のように宣言されています。

// atlgdi.h内
typedef CPenT<false>  CPenHandle;
typedef CPenT<true>   CPen;
			

 WTLのCPenクラスは、MFCの同名のクラスとほぼ同じメンバ関数を用意しています。 以下に示すのは、CPenクラスを使用してクライアント矩形に接する青い円を描画する例です。


// WM_PAINTメッセージハンドラ
void OnPaint(HDC /*hDC*/){
    CPaintDC dc(m_hWnd);

    // 太さ2で青い実線のペンを作成し、選択
    CPen pen;
    pen.CreatePen(PS_SOLID, 2, RGB(0, 0, 255));
    HPEN hOldPen = dc.SelectPen(pen);

    // クライアント矩形を取得し、円を描画
    CRect rect;
    GetClientRect(rect);
    dc.Ellipse(rect);

    // 元のペンを選択
    dc.SelectPen(hOldPen);
}
			

 この例では、まずペンオブジェクトを作成し、 それをSelectPen()で現在のペンとして選択しています。 SelectPen()は引数にHPEN型の変数を受け取りますが、 CPenTクラスはHPEN変換演算子を持っているのでそのまま渡すことができます。 SelectPen()は以前のペンハンドルを返すので、 これをhOldPenという変数に保存しておきます。

次に、円を描画します。太さが 2 で青い実線の円が描画されます。

最後に、先ほど保存しておいた元のペンハンドルに戻すため、 再度SelectPen()を呼び出して元のペンハンドルを選択します。

 ところで、WTLはストックペンもサポートしています。 以下に示すのは、ストックペンによって黒い実線の円を描画する例です。

// WM_PAINTメッセージハンドラ
void OnPaint(HDC /*hDC*/){
    CPaintDC dc(m_hWnd);

    // ストックペンを選択
    HPEN hOldPen = dc.SelectStockPen(BLACK_PEN);

    // クライアント矩形を取得し、円を描画
    CRect rect;
    GetClientRect(rect);
    dc.Ellipse(rect);

    // 元のペンを選択
    dc.SelectPen(hOldPen);
}
			

また、atlmisc.hヘッダに定義されているAtlGetStockPen()というグローバル関数を使えば、 ストックペンのハンドルを取得することができます。

// ストックペンのハンドルを取得
HPEN hStockPen = AtlGetStockPen(BLACK_PEN);