Share via


メタファイルの記録

Image クラスを継承する Metafile クラスを使用すると、一連の描画コマンドを記録できます。 記録されたコマンドは、メモリに格納することも、ファイルに保存することも、ストリームに保存することもできます。 メタファイルには、ベクター グラフィックス、ラスター イメージ、テキストを含めることができます。

次の例では、 メタファイル オブジェクトを作成します。 このコードでは 、Metafile オブジェクトを使用して一連のグラフィックス コマンドを記録し、記録されたコマンドを SampleMetafile.emf という名前のファイルに保存します。 メタファイル コンストラクターはデバイス コンテキスト ハンドルを受け取り、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);

注意

メタファイルを記録するには、メタファイル オブジェクトに基づいて Graphics オブジェクトを作成する必要があります。 メタファイルの記録は、 その Graphics オブジェクトが削除されるか、スコープ外になったときに終了します。

 

メタファイルには、メタファイルの記録に使用される Graphics オブジェクトによって定義される、独自のグラフィックス状態が含まれています。 メタファイルの記録中に設定した Graphics オブジェクトのプロパティ (クリップ領域、ワールド変換、スムージング モードなど) は、メタファイルに格納されます。 メタファイルを表示すると、格納されているプロパティに従って描画が行われます。

次の例では、メタファイルの記録中にスムージング モードが SmoothingModeNormal に設定されているとします。 再生に使用される Graphics オブジェクトのスムージング モードが SmoothingModeHighQuality に設定されていても、メタファイルは SmoothingModeNormal 設定に従って再生されます。 再生前に設定されたスムージング モードではなく、記録中に設定されたスムージング モードが重要です。

graphics.SetSmoothingMode(SmoothingModeHighQuality);
graphics.DrawImage(&meta, 0, 0);