如何在 GDI 绘制的 MFC 的 CScrollView 中实现缩放

How to implement zooming in GDI-drawn MFC's CScrollView

本文关键字:CScrollView 实现 缩放 MFC GDI 绘制      更新时间:2023-10-16

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

以下是我最好的想法:

  1. 将MM_ANISOTROPIC映射模式与SetWindowExt/SetViewportExt一起使用。。。这种方法的问题在于它不能缩放文本。是否有任何方法可以强制MFC缩放文本?我唯一能想到的就是根据选择的缩放值设置文本字体大小,但我不确定这是否会看起来很好。。。

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

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

需要你的建议。该走哪条路以及为什么。也许还有其他选择?。。

当您使用MFC时,您真的不想破坏映射模式——MFC本身已经将其用于(至少)打印预览功能。

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

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