65.9K
CodeProject 正在变化。 阅读更多。
Home

EMF 记录旋转用于 EMR_POLYGON16

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.71/5 (4投票s)

2002年11月18日

2分钟阅读

viewsIcon

64445

downloadIcon

1917

EMR_POLYGON16 的 EMF 记录旋转

Sample Image - MROT.jpg

引言

当我决定构建一个类似 PowerPoint 的可视化编辑器时,我首先要做的是将剪贴板内容粘贴到我的视图中。但这在 MSDN、CodeGuru 等地方到处都是,比如 DrawCliJTDraw 等。

但是第二部分,当我需要旋转剪贴板图像时,情况就不同了。我根本找不到任何提示。

也许是因为我搜索能力差吧.. :( 无论如何,我决定旋转 EMF。

API 函数 SetWorldTransform() 在 Win98 上不受支持。实际上,我正在 Win2K 上工作,但我希望在不使用任何 GDI 转换函数的情况下旋转 EMF。

我认为旋转 EMF 图像的步骤如下

  1. 将继承自 COleClientItem 的对象绘制到 CMetaFileDC(A_DC)
  2. A_DC 获取 EMF。
  3. 将获取的 EMF 位图以旋转的方式绘制到另一个 CMetaFileDC(B_DC)
  4. B_DC 获取 EMF。
  5. 将旋转后的 EMF 文件绘制到输出 DC。

枚举 EMF(或 WMF)需要 CALLBACK 函数。可以使用全局作用域,但我将其放入我的 CItem 类中作为 static 成员函数。非static 成员函数不能在 EnumEnhMetaFile 中用作 CALLBACK 函数。

包含的源文件按以下顺序构建

  1. 创建一个新的 MFC (EXE) 项目,并选择 Ole Container 选项。
  2. CblahblahCntrItem 类是继承自 COleClientItem 的类。因此,如果您希望您的项目具有某些属性,请将您的内容放入 C~~CntrItem 类中。
  3. 添加 ID_EDIT_PASTE 事件处理程序。
  4. 自定义绘制函数。

就是这样!

下载项目并构建。运行 MROT 并在系统的剪贴板上获取一些矢量图像,然后将其粘贴到 MROT 中。

然后你可以在 MROT 的视图上看到剪贴画。然后按下 RIGHT 或 LEFT 游标键。然后,图像将以 5 度为单位旋转。

MROT 仅处理 EMR_POLYGON16 记录。因此,如果您的剪贴画包含其他多边形记录或矩形记录... MROT 无法很好地显示和旋转它。

您 MSDN CD 上的 MSDN\TECHART\1619\EMFDCODE.EXE 可以帮助您检查源剪贴画。

现在我认为,构建类似 PowerPoint 的可视化编辑器并不困难(我说的是编辑器..:)),但如果您像我一样 approach,将花费很长时间。我将转向 GDI+,因为我根本不必转换任何多边形点。

附:您可能想知道 ConvertEMF 成员函数是做什么用的。一些剪贴画有自己的映射方面。MapmodeMM_ANISOTROPIC,并且 Window/Viewport Extents 反转... 因此,相同的旋转命令对这些类型的剪贴画的作用会有所不同... ConvertEMFWindowExt 反转的剪贴画转换为非反转的剪贴画。

有人可以处理所有 EMF 记录进行旋转吗?:)

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.