在MFC中实现缩放控件

时间:2009-04-23 11:08:51

标签: c++ mfc scroll zoom pixel

我正在开发一个'打印预览'工具,以显示带有矩形阵列样本点的幻灯片的概述。

载玻片通常为25×75mm,斑点样品的直径通常为0.1mm。滑块周边通常有2毫米的间隙,没有印刷斑点。

斑点(间距)之间的距离精确到0.01mm。例如,0.20和0.29mm的间距需要在像素中区分。代表斑点本身,只要斑点可见且不重叠,100%的准确度在这个阶段可能并不重要。

我希望了解使用哪些技术来创建幻灯片/点的位图表示以及使用任意放大级别查看幻灯片布局。

这不一定非常复杂 - 1:1表示加上越来越小的放大倍数。我可能无法缩小太多,因为斑点会变得太小而无法表现。

对于更大的放大倍数,我可能还需要知道实现水平/垂直滚动控件,但我稍后会解决这个问题。

我想了解一下我应该注意的任何编程和缩放技术,以便正确实现缩放工具。我最近一直在使用StretchBlt函数来改变图像大小,看起来没问题,但是任何其他相关信息都会有用。

干杯。

1 个答案:

答案 0 :(得分:1)

让我们从头开始:

  • 为什么不使用:: AFXPrintPreview()和MFC的其他打印预览功能?

  • '幻灯片'和'点'特定于您的行业我认为 - 它们与问题相关还是仅仅是为了说明?

  • StretchBlt()不会对你有好处,因为它只会让你进行像素级“缩放”,你需要的是以更高的精度绘制控件的某个部分。即使您不打算使用MFC打印预览内容,也要查看它是如何完成的。

  • Windows控件具有滚动和缩放所需的所有功能。它们位于设备上下文中:SetWindowExt(),SetViewportExt(),SetViewportOrg()等。查看MSDN“CDC成员”页面的“坐标函数”。话虽这么说,我曾经“手动”实现缩放和滚动,通过跟踪滚动条位置,缩放我的控制命令等。这是一个痛苦的屁股和回头看,我应该使用Windows设施。但是,它们也不容易使用,这就是为什么我认为自己最初可以做得更好 - 结果证明我错了:)

  • 最后,虽然我无法从你的问题中确定你是否真的在那条船上,但不要考虑物理距离(毫米等)。你想要做的第一件事是将形状绘制到屏幕上,在元素之间使用正确的比例。然后你想放大/缩小。最后,只有当你到达印刷部分时才会发挥物理措施的作用。您需要弄清楚的唯一一件事(这里略微简化)是“获得所需输出所需的正确缩放比率是多少”。这有点棘手,但与您的问题的第一部分(如何将组件绘制到屏幕)几乎没有关系。

如果您遇到麻烦,请不要犹豫,发布更具体的问题。我在这里打印预览和打印代码作为打印过程中“通用”部分的一个例子,尽管每个应用程序的细节明显不同。