录制图元文件

Image 类继承的 Metafile 类允许记录一系列绘图命令。 录制的命令可以存储在内存中、保存到文件或保存到流中。 图元文件可以包含矢量图形、光栅图像和文本。

以下示例创建 图元文件 对象。 该代码使用 Metafile 对象来记录一系列图形命令,然后将记录的命令保存在名为 SampleMetafile.emf 的文件中。 请注意, 图元文件 构造函数接收设备上下文句柄, 图形 构造函数接收 图元文件 对象的地址。 录制停止 (并且当 Graphics 对象超出范围时,录制的命令将保存到文件) 。 最后两行代码通过创建新的 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 对象 (剪辑区域、世界转换、平滑模式等) 的任何属性都将存储在图元文件中。 显示图元文件时,将根据存储的属性完成绘图。

在以下示例中,假设在录制图元文件期间,平滑模式已设置为 SmoothingModeNormal。 即使用于播放的 Graphics 对象的平滑模式设置为 SmoothingModeHighQuality,也会根据 SmoothingModeNormal 设置播放图元文件。 重要的是录制期间设置的平滑模式,而不是播放前设置的平滑模式。

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