在我的程序中,我需要"回放"或"解析"窗口元文件(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绘图.
非常感谢任何帮助.
不幸的是,Graphics.EnumerateMetafile是Win32 API周围非常非常薄的一层.对于EMF中的每条记录,您将获得特定于记录的结构的非托管内存地址.没有关于它可能包含的内容的文档 - 但是,在Win32世界中也没有太多可继续的内容.
所以你需要参考古代文本!
本书附带了一个代码示例CD-ROM,其中包含使用EMF回放API的示例程序.
这给你留下了两个问题.
这本书显然已绝版,因此请确保您购买的任何用过的副本都包含一张可用的CD-ROM.
示例代码全部使用C/C++,并且为100个左右的结构声明必要的互操作将是一项非常重要的任务,用于描述所有EMF记录.
所以另一种方法可能是在.NET中声明一个巨大的接口,它有一个方法用于你需要拦截的每个GDI调用,然后使用C++/CLI来调整示例C++代码,以便它调用每个记录的巨大接口.
更新
虽然用于EMF播放的MSDN文档不包含特定EMF记录的详细信息,但Microsoft已于2006年单独发布了完整规范:
我上面链接的书的作者也可以下载CDROM样本的源代码: