【问题标题】:How to implement zooming in GDI-drawn MFC's CScrollView如何在 GDI 绘制的 MFC 的 CScrollView 中实现缩放
【发布时间】:2012-02-05 02:53:10
【问题描述】:

我正在我的 CScrollView 中使用 GDI 绘制一些图形和文本。我需要实现缩放功能。我只需要放大 out 功能,不需要放大 in 超出正常渲染的范围。

这是我最好的想法:

  1. 使用带有 SetWindowExt/SetViewportExt 的 MM_ANISOTROPIC 映射模式... 这种方法的问题是它不能缩放文本。有没有办法强制 MFC 也缩放文本?我唯一能想到的就是根据选定的缩放值设置文本字体大小,但我不确定这是否会很好看……

  2. 绘制到内存 DC,并使用 StretchBlt 将 blit 到适当大小的客户区(使用 SetScrollSizes... 设置)。这将解决文本缩放问题。

还希望在该过程中具有抗锯齿效果。我认为上述两种方法本身都应该实现这一点,但我不知道哪个看起来更好。此外,我稍后将不得不实现打印/打印预览功能(使用 MFC 的标准实现从 doc/view 架构),所以我需要与此兼容的方法。

需要您的建议。走哪条路,为什么。也许其他选项也存在?..

【问题讨论】:

    标签: c++ mfc gdi


    【解决方案1】:

    您真的不想在使用 MFC 时弄乱映射模式 - MFC 本身已经将它用于(至少)打印预览功能。

    我想看看SetWorldTransform 是否适合你。至少对于矢量/TrueType 字体,它将与其他所有内容一起缩放文本。请注意,在SetWorldTransform 起作用之前,您需要使用GM_ADVANCED 调用SetGraphicsMode

    【讨论】:

    • 感谢您的回复,杰瑞。不幸的是,您提到的方法有两个问题:它不缩放文本(使用 DrawText API 绘制),并且它没有抗锯齿效果(可能是因为它执行坐标和大小的逻辑转换,但例如 LineTo 函数仍然绘制锯齿线)。所以这给我留下了我上面描述的第二种方法(绘制到 mem dc 然后是 StretchBlt) - 你怎么看?你能推荐它吗?..
    【解决方案2】:

    我最终使用了我在问题中提出的第二种方法,但使用了 DIB 而不是 DDB(以及 StretchDIBits() 而不是 StretchBlt()),因为事实证明它引起的问题较少,尤其是在使用大位图和打印时.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 2012-02-20
      相关资源
      最近更新 更多