メタファイルの記録
Image クラスを継承する Metafile クラスを使用すると、描画コマンドのシーケンスを記録できます。 記録されたコマンドは、メモリに格納することも、ファイルに保存することも、ストリームに保存することもできます。 メタファイルには、ベクター グラフィックス、ラスター イメージ、およびテキストを含めることができます。
次の例では、Metafile オブジェクトを作成します。 このコードでは、Metafile オブジェクトを使用して一連のグラフィックス コマンドを記録し、記録されたコマンドを SampleMetafile.emf という名前のファイルに保存します。 Metafile コンストラクターはデバイス コンテキスト ハンドルを受け取り、Graphics コンストラクターは Metafile オブジェクトのアドレスを受け取ります。 Graphics オブジェクトがスコープ外になると、記録は停止します (記録されたコマンドはファイルに保存されます)。 最後の 2 行のコードでは、新しい Graphics オブジェクトを作成し、Metafile オブジェクトのアドレスを、その Graphics オブジェクトの DrawImage メソッドに渡すことによって、メタファイルを表示します。 このコードでは、メタファイル 同じ オブジェクトを使用してメタファイルを記録および表示 (再生) します。
Metafile metafile(L"SampleMetafile.emf", hdc);
{
Graphics graphics(&metafile);
Pen greenPen(Color(255, 0, 255, 0));
SolidBrush solidBrush(Color(255, 0, 0, 255));
// Add a rectangle and an ellipse to the metafile.
graphics.DrawRectangle(&greenPen, Rect(50, 10, 25, 75));
graphics.DrawEllipse(&greenPen, Rect(100, 10, 25, 75));
// Add an ellipse (drawn with antialiasing) to the metafile.
graphics.SetSmoothingMode(SmoothingModeHighQuality);
graphics.DrawEllipse(&greenPen, Rect(150, 10, 25, 75));
// Add some text (drawn with antialiasing) to the metafile.
FontFamily fontFamily(L"Arial");
Font font(&fontFamily, 24, FontStyleRegular, UnitPixel);
graphics.SetTextRenderingHint(TextRenderingHintAntiAlias);
graphics.RotateTransform(30.0f);
graphics.DrawString(L"Smooth Text", 11, &font,
PointF(50.0f, 50.0f), &solidBrush);
} // End of recording metafile.
// Play back the metafile.
Graphics playbackGraphics(hdc);
playbackGraphics.DrawImage(&metafile, 200, 100);
手記
メタファイルを記録するには、Metafile オブジェクトに基づいて Graphics オブジェクトを作成する必要があります。 メタファイルの記録は、その Graphics オブジェクトが削除されるか、スコープ外になったときに終了します。
メタファイルには、メタファイルの記録に使用される Graphics オブジェクトによって定義される、独自のグラフィックス状態が含まれています。 メタファイルの記録中に設定した Graphics オブジェクト (クリップ領域、ワールド変換、スムージング モードなど) のプロパティは、メタファイルに格納されます。 メタファイルを表示すると、保存されているプロパティに従って図面が作成されます。
次の例では、メタファイルの記録中にスムージング モードが SmoothingModeNormal に設定されているとします。 再生に使用する Graphics オブジェクトのスムージング モードが SmoothingModeHighQuality に設定されていても、メタファイルは SmoothingModeNormal 設定に従って再生されます。 再生前に設定されたスムージング モードではなく、記録中に設定されたスムージング モードが重要です。
graphics.SetSmoothingMode(SmoothingModeHighQuality);
graphics.DrawImage(&meta, 0, 0);