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

// atlgdi.h内
typedef CRgnT<false>  CRgnHandle;
typedef CRgnT<true>   CRgn;
			

 WTLのCRgnクラスは、MFCの同名のクラスとほぼ同じメンバ関数を用意しています。 以下に示すのは、CRgnクラスを使用してクライアント領域の中央に"Arial Black"フォントの文字列を描画する例です。


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

    CRect rect;
    GetClientRect(rect);

    // サイズ20ポイントの"Arial Black"フォントを作成し、選択
    CFont font;
    font.CreatePointFont(200, _T("Arial Black"));
    HFONT hOldFont = dc.SelectFont(font);

    // パスを作成
    dc.BeginPath();
    dc.DrawText(_T("Hello, ATL/WTL"), -1,
        rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
    dc.EndPath();

    // 元のフォントを選択
    dc.SelectFont(hOldFont);

    CRgn rgn1;
    rgn1.CreateFromPath(dc);

    CRgn rgn2;
    rgn2.CreateRectRgnIndirect(rect);

    // リージョンを合成
    rgn1.CombineRgn(rgn1, rgn2, RGN_XOR);

    // リージョンをクリッピング領域として選択
    dc.SelectClipRgn(rgn1);

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

    // しま模様を描画
    for(int i=0; i<rect.bottom; i+=2){
        dc.MoveTo(0, i);
        dc.LineTo(rect.right, i);
    }

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

 この例では、まずフォントを作成して文字列を描画し、それを元にパスを作成します。 そのパスからリージョンを作成し、さらにクライアント矩形からリージョンを作成し、 この二つのリージョンをCombineRgn()によって合成します。 CombineRgn()の第3引数にはRGN_XORを指定しているので、 rgn1(文字列リージョン)rgn2(クライアント矩形リージョン) を合わせたものから重なりあった部分を取り除いたリージョンが作成されます。

次に、その合成したリージョンをクリッピング領域として選択し、 クライアント領域に緑のしま模様を描画します。 このとき、クリッピング領域として選択されたリージョン部分には模様が描画されないため、 白い背景がそのまま見えます。