ホーム ATL/WTL
拡張メタファイル
ドキュメント種別 ATL/WTL に関する文書
最終更新日 2004/06/04
PR
 WTLでは拡張メタファイルの機能をCEnhMetaFileTというテンプレートクラスでカプセル化しています。 テンプレート引数はbool値で、trueの場合はデストラクタでDeleteEnhMetaFile()を呼び出し、 falseの場合は呼び出しません。atlgdi.hヘッダではtypedefによって次のように宣言されています。

// atlgdi.h内
typedef CEnhMetaFileT<false>  CEnhMetaFileHandle;
typedef CEnhMetaFileT<true>   CEnhMetaFile;
			

また、WTLは拡張メタファイル用デバイスコンテキストをCEnhMetaFileDCクラス、 拡張メタファイル情報をCEnhMetaFileInfoクラスでカプセル化しています。

 以下に示すのは、WTLの拡張メタファイルサポートクラスを使用して、 拡張メタファイルを作成、描画する例です。


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

    CEnhMetaFile emf(::GetEnhMetaFile(_T("test.emf")));
    CRect rect;
    GetClientRect(rect);

    // 拡張メタファイルを描画
    dc.PlayMetaFile(emf, rect);
}

// WM_CREATEメッセージハンドラ
LRESULT OnCreate(LPCREATESTRUCT lpcs){
    // 拡張メタファイルを作成
    CEnhMetaFileDC dc(NULL, _T("test.emf"), NULL, NULL);

    // 青い格子ハッチのブラシを作成し、選択
    CBrush brush;
    brush.CreateHatchBrush(HS_CROSS, RGB(0, 0, 255));
    HBRUSH hOldBrush = dc.SelectBrush(brush);

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

    // 元のブラシを選択
    dc.SelectBrush(hOldBrush);

    return 0;
}
			

 この例では、まずWM_CREATEメッセージハンドラでカレントフォルダに拡張メタファイルを作成します。 今回使用したCEnhMetaFileDCクラスの引数ありコンストラクタは、 内部でWin32APIのCreateEnhMetaFile()を呼び出しますが、 デフォルトコンストラクタを使用した場合は何も呼び出しません。 その場合は、CEnhMetaFileDCクラスのメンバ関数である Create()を呼び出すことで拡張メタファイルを作成できます。 拡張メタファイルを作成したあとは、同時に得られる拡張メタファイル用デバイスコンテキストを使って、 図形を描画します。

なお、CEnhMetaFileDCクラスのデストラクタではCloseEnhMetaFile()が呼び出されるため、 拡張メタファイル用デバイスコンテキストを明示的に閉じる必要はありません。 Close()を呼び出せば明示的に閉じることができ、 戻り値として拡張メタファイルのハンドルが取得できます。

 WM_PAINTメッセージハンドラでは、 Win32APIのGetEnhMetaFile()を呼び出して、 カレントフォルダから先ほど作成した拡張メタファイルを読み込み、 PlayMetaFile()で拡張メタファイルの内容を描画します。