Share via


メタファイル (GDI+)

Windows GDI+ には メタファイル クラスが用意されているため、メタファイルを記録および表示できます。 メタファイルはベクター画像とも呼ばれ、一連の描画コマンドと設定として格納される画像です。 Metafile オブジェクトに記録されるコマンドと設定は、メモリに格納することも、ファイルまたはストリームに保存することもできます。

GDI+ では、次の形式で格納されたメタファイルを表示できます。

  • Windows メタファイル形式 (WMF)
  • 拡張メタファイル (EMF)
  • EMF+

GDI+ では、EMF および EMF+ 形式でメタファイルを記録できますが、WMF 形式では記録できません。

EMF+ は、GDI+ レコードを格納できる EMF の拡張機能です。 EMF+ 形式には、EMF+ Only と EMF+ Dual の 2 種類があります。 EMF+ Only メタファイルには GDI+ レコードのみが含まれます。 このようなメタファイルは GDI+ で表示できますが、Windows グラフィックス デバイス インターフェイス (GDI) では表示できません。 EMF+ Dual メタファイルには、GDI+ と GDI のレコードが含まれます。 EMF+ Dual メタファイル内の各 GDI+ レコードは、代替 GDI レコードとペアになっています。 このようなメタファイルは GDI+ でも GDI でも表示できます。

次の例では、1 つの設定と 1 つの描画コマンドをディスク ファイルに記録します。 この例では Graphics オブジェクトを作成し、 Graphics オブジェクトのコンストラクターが Metafile オブジェクトのアドレスを引数として受け取る点に注意してください。

myMetafile = new Metafile(L"MyDiskFile.emf", hdc);
myGraphics = new Graphics(myMetafile);
   myPen = new Pen(Color(255, 0, 0, 200));
   myGraphics->SetSmoothingMode(SmoothingModeAntiAlias);
   myGraphics->DrawLine(myPen, 0, 0, 60, 40);
delete myGraphics;
delete myPen;
delete myMetafile;

前の例に示すように、 Graphics クラスは 、Metafile オブジェクトで命令と設定を記録するためのキーです。 Graphics オブジェクトのメソッドに対して行われた呼び出しは、メタファイル オブジェクトに記録できます。 同様に、 Graphics オブジェクトの任意のプロパティを設定し、その設定を メタファイル オブジェクトに記録できます。 Graphics オブジェクトが削除されるか、スコープ外になると、記録は終了します。

次の例では、前の例で作成したメタファイルを表示します。 メタファイルは、左上隅が (100, 100) の位置になるように表示されます。

Graphics myGraphics(hdc);
Image myImage(L"MyDiskFile.emf");
myGraphics.DrawImage(&myImage, 100, 100);

次の例では、 Metafile オブジェクトのいくつかのプロパティ設定 (クリッピング領域、ワールド変換、スムージング モード) を記録します。 その後、コードは複数の描画命令を記録します。 手順と設定はディスク ファイルに保存されます。

myMetafile = new Metafile(L"MyDiskFile2.emf", hdc); 
myGraphics = new Graphics(myMetafile);
   myGraphics->SetSmoothingMode(SmoothingModeAntiAlias);
   myGraphics->RotateTransform(30);

   // Create an elliptical clipping region.
   GraphicsPath myPath;
   myPath.AddEllipse(0, 0, 200, 100);
   Region myRegion(&myPath);
   myGraphics->SetClip(&myRegion);

   Pen myPen(Color(255, 0, 0, 255));
   myGraphics->DrawPath(&myPen, &myPath);

   for(INT j = 0; j <= 300; j += 10)
   {
      myGraphics->DrawLine(&myPen, 0, 0, 300 - j, j);
   }
delete myGraphics;
delete myMetafile;

次の例では、前の例で作成したメタファイル イメージを表示します。

myGraphics = new Graphics(hdc);
myMetafile = new Metafile(L"MyDiskFile.emf");
myGraphics->DrawImage(myMetafile, 10, 10);

次の図は、上記のコードの出力を示しています。 アンチエイリアシング、楕円クリッピング領域、30 度回転に注意してください。

楕円の外側の点から始まる線で塗りつぶされた楕円を含むウィンドウのスクリーン ショット