在我的程序中,我需要“回放”或“解析”窗口元文件(WMF和EMF)。我已经通过MSDN和Google挖掘了,我最接近的是图形。 EnumerateMetafile方法。我可以让它工作,因为我的EnumerateMetafileProc回调被调用,然后我可以调用PlayRecord。缺少的是如何从该回调中获取有用的数据。
示例我查看了:http://msdn.microsoft.com/en-us/library/ms142060.aspx
回调有一个recordType参数,它是一个ENUM。这看起来很有用,除非它们似乎无法将数据转换为任何有用的类型。
我的目标是回放WMF / EMF的创建,这样我就可以对具有类似(DrawLine,DrawPoint,DrawArc)等方法的专用图形类进行函数调用。从某种意义上说,我正在以完全不同的格式(转换)重新创建WMF / EMF绘图。
非常感谢任何帮助。
答案 0 :(得分:9)
Graphics.EnumerateMetafile是Win32 API周围非常非常薄的一层。对于EMF中的每条记录,您将获得特定于记录的结构的非托管内存地址。没有关于它可能包含的内容的文档 - 但是,在Win32世界中也没有太多可用的内容。
所以你需要查阅古代文本!
This book came with a code sample CD-ROM,其中包含使用EMF播放API的示例程序。
这会给你带来两个问题。
这本书显然已绝版,因此请确保您购买的所有用过的副本都包含一张可用的CD-ROM。
示例代码全部使用C / C ++,并且为100个左右的结构声明必要的互操作将是一项非常重要的任务,用于描述所有EMF记录。
< / LI> 醇>所以另一种方法可能是在.NET中声明一个巨大的接口,它有一个方法用于你需要拦截的每个GDI调用,然后使用C ++ / CLI来调整示例C ++代码,以便它调用你的每个巨大的接口记录。
<强>更新强>
虽然用于EMF播放的MSDN文档不包含特定EMF记录的详细信息,但Microsoft已于2006年单独发布了完整规范:
MS-EMF: Enhanced Metafile Format
我上面链接的这本书的作者也提供了下载CDROM样本的源代码:
答案 1 :(得分:3)
想法是循环WMF记录并将形状,画笔等转换为其他格式
WmfDocument wmf = new WmfDocument();
wmf.Load(path);
foreach (var record in wmf.Records)
{
if (record is WmfCreateBrushIndirectRecord)
{
var brush = record as WmfCreateBrushIndirectRecord;
Console.WriteLine("Color: " + brush.Color);
Console.WriteLine("Style: " + brush.Style);
Console.WriteLine("Hatch: " + brush.Hatch);
//Do something with brush here...
}
else if (record is WmfRectangleRecord)
{
var rectangle = record as WmfRectangleRecord;
//Do something with rectangle...
}
else if ... //Other shapes to be implemented
}