Visual C++ 中的缩放/缩放 CWnd 控件

Posted

技术标签:

【中文标题】Visual C++ 中的缩放/缩放 CWnd 控件【英文标题】:Zoom/Scale CWnd Controls in Visual C++ 【发布时间】:2012-07-12 03:31:30 【问题描述】:

我们有一个 CWnd,上面有几个控件(CButton、CEdit、CStatic 等),我们希望找到一种方法来允许用户放大和缩小,从而使控件变大/变小。控件本身需要更改大小以及控件内的文本标签(如按钮文本)。

我正在查看网络上记录的 CZoomView 并使用 CDC SetMapMode 到 MM_ISOTROPIC,但这似乎真的只在 OnDraw 方法中有用,因为 CZoomView 在实现时有一个 TODO 来实现绘图代码。由于这些是 Microsoft 控件,我们只是让它们自己绘制。

这甚至可能吗?似乎我应该能够使用调整设备上下文来认为设备到逻辑单位比例是不同的,但我无法想出如何让控件来兑现这一点。

int previousMode = pDC->SetMapMode(MM_ISOTROPIC);
CSize previousWin = pDC->SetWindowExt(100,100);
CSize previousExt = pDC->SetViewportExt(m_zoom, m_zoom);

想法或想法?

【问题讨论】:

但是为什么你需要“缩放”一个控件呢? 想一想您如何能够使用此页面这样的表单更改网页浏览器的缩放比例。缩放时,它会以相同的比例更改所有文本和控件的大小。我们正在寻找一种在 CWnd 中执行此操作的方法,但它似乎不可行。无论如何,我现在已经离开了那个项目,所以它不再在我的盘子里了。 【参考方案1】:

,这对于 Win32 用户/标准/通用控件是不可能的,因为 Windows 的“User32”层都是基于像素的,而您提到的 GDI 功能在该级别不起作用,并且在用户 API 中没有等效项(窗口句柄与设备上下文)。


我知道这是一个老问题,我回答不是为了得分。我本来打算自己问同样的问题,但是在我输入完问题后遇到了这个问题。由于您不应该在这里提出重复的问题,因此我发布此答案,而是希望有人会出现并用更好的答案证明我错了。或者可能马克想出了答案,并会收到我的答案通知并分享他学到的东西。在我的例子中,我需要制作一个像 Adob​​e Acrobat 这样的用户界面,带有可填写的表单,但基本原理是一样的。

【讨论】:

感谢分享。我从来没有找到一个好的解决方案,我认为你提到的确切原因没有办法。如果其他人找到方法,他们可以提供他们的答案,但现在我会接受你的答案,因为我同意。 这在 MFC 中绝对不可能,但在 Qt 中很容易实现,甚至无需编码。【参考方案2】:

为什么不直接更改 Windows 中的 DPI 设置(显示 -> 设置自定义文本大小)?这是使内容变小/变大的常用方法,如果用户在阅读内容时遇到困难,他们应该这样做。

Windows 标准控件具有“DPI 感知”功能,因此您可以免费进行缩放。

【讨论】:

如果每个用户想要影响他们的所有应用程序,这是一个选项。我们需要使这个特定的表单与全局 DPI 设置分开缩放。说来话长……

以上是关于Visual C++ 中的缩放/缩放 CWnd 控件的主要内容,如果未能解决你的问题,请参考以下文章

Android自定义ImageView实现图片缩放滑动,双击放大缩小,多点触控缩放

Android自定义ImageView实现图片缩放滑动,双击放大缩小,多点触控缩放

有人可以解释多点触控缩放是不是应该适用于 UITextView 或 UIScrollView

IOS:仅使用多点触控缩放 uiscrollview

ActionScript 3 As3:多点触控缩放和旋转

WPF 获取元素(Visual)相对于屏幕设备的缩放比例,可用于清晰显示图片