2012-01-07 408 views
0

我在CScrollView中用GDI绘制了一些图形和文本。我需要实现缩放功能。我只需要变焦功能,不需要变焦比通常呈现更多。如何在GDI绘制的MFC中实现缩放CScrollView

这里是我最好的想法:

  1. 使用MM_ANISOTROPIC映射模式,SetWindowExt/SetViewPortExt函数......这种方式的问题在于,它不适合文本。有没有办法强制MFC扩展文本?我只能想到的是根据所选的缩放值设置文本字体大小,但我不确定这是否会看起来很好...毕竟...

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

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

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

回答

0

我结束了使用我的问题提出的第二个方法,但所用的DIB代替DDBS(和StretchDIBits()而不是StretchBlt()),因为它被证明导致较少的问题,使用大位图尤其是当和打印时。

1

当你使用MFC时,你真的不希望混淆映射模式 - MFC本身已经将它用于(至少)打印预览功能。

我会看看如果SetWorldTransform会为你工作。至少使用vector/TrueType字体时,它会将文本与其他所有内容一起缩放。请注意,在SetWorldTransform工作之前,您需要拨打SetGraphicsMode并拨打GM_ADVANCED

+0

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