EMF 记录旋转用于 EMR_POLYGON16






2.71/5 (4投票s)
2002年11月18日
2分钟阅读

64445

1917
EMR_POLYGON16 的 EMF 记录旋转
引言
当我决定构建一个类似 PowerPoint 的可视化编辑器时,我首先要做的是将剪贴板内容粘贴到我的视图中。但这在 MSDN、CodeGuru 等地方到处都是,比如 DrawCli
、JTDraw
等。
但是第二部分,当我需要旋转剪贴板图像时,情况就不同了。我根本找不到任何提示。
也许是因为我搜索能力差吧.. :( 无论如何,我决定旋转 EMF。
API 函数 SetWorldTransform()
在 Win98 上不受支持。实际上,我正在 Win2K 上工作,但我希望在不使用任何 GDI 转换函数的情况下旋转 EMF。
我认为旋转 EMF 图像的步骤如下
- 将继承自
COleClientItem
的对象绘制到CMetaFileDC(A_DC)
。 - 从
A_DC
获取 EMF。 - 将获取的 EMF 位图以旋转的方式绘制到另一个
CMetaFileDC(B_DC)
。 - 从
B_DC
获取 EMF。 - 将旋转后的 EMF 文件绘制到输出 DC。
枚举 EMF(或 WMF)需要 CALLBACK
函数。可以使用全局作用域,但我将其放入我的 CItem
类中作为 static
成员函数。非static
成员函数不能在 EnumEnhMetaFile
中用作 CALLBACK
函数。
包含的源文件按以下顺序构建
- 创建一个新的 MFC (EXE) 项目,并选择 Ole Container 选项。
CblahblahCntrItem
类是继承自COleClientItem
的类。因此,如果您希望您的项目具有某些属性,请将您的内容放入C~~CntrItem
类中。- 添加
ID_EDIT_PASTE
事件处理程序。 - 自定义绘制函数。
就是这样!
下载项目并构建。运行 MROT 并在系统的剪贴板上获取一些矢量图像,然后将其粘贴到 MROT 中。
然后你可以在 MROT 的视图上看到剪贴画。然后按下 RIGHT 或 LEFT 游标键。然后,图像将以 5 度为单位旋转。
MROT 仅处理 EMR_POLYGON16
记录。因此,如果您的剪贴画包含其他多边形记录或矩形记录... MROT 无法很好地显示和旋转它。
您 MSDN CD 上的 MSDN\TECHART\1619\EMFDCODE.EXE 可以帮助您检查源剪贴画。
现在我认为,构建类似 PowerPoint 的可视化编辑器并不困难(我说的是编辑器..:)),但如果您像我一样 approach,将花费很长时间。我将转向 GDI+,因为我根本不必转换任何多边形点。
附:您可能想知道 ConvertEMF
成员函数是做什么用的。一些剪贴画有自己的映射方面。Mapmode
为 MM_ANISOTROPIC
,并且 Window/Viewport Extents 反转... 因此,相同的旋转命令对这些类型的剪贴画的作用会有所不同... ConvertEMF
将 WindowExt
反转的剪贴画转换为非反转的剪贴画。
有人可以处理所有 EMF 记录进行旋转吗?:)
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。