【发布时间】:2021-06-28 09:26:51
【问题描述】:
该问题已在here 进行过讨论,但人们选择了一个不准确的解决方案。我正在使用带有BS_AUTOCHECKBOX 标志的CButton 类。有没有一种精确的方法来确定 Windows/MFC 上带有黑色边框(带有复选标记)的正方形的大小?还有这个方块和文字的差距?
我意识到,差距可以这样计算(scale_factor取决于客户端当前屏幕DPI - 100%dpi,scale_factor==1;150%dpi,scale_factor==1.5等)
std::ceil(3 * scale_factor)
我需要我的解决方案根据客户端的屏幕分辨率/DPI 设置返回真实尺寸。 Windows 在 100% DPI 上创建这个正方形 13x13px,在 125% DPI 上创建 16x16px,但在 150% 和 175% DPI 上都创建 20x20px!因此,不可能将 13 与 scale_factor 相乘。
这段代码
int x = GetSystemMetrics(SM_CXMENUCHECK);
int y = GetSystemMetrics(SM_CYMENUCHECK);
在 100% DPI 时返回 15px,在 125% DPI 时返回 19px,如果我减去
int xInner = GetSystemMetrics( SM_CXEDGE );
int yInner = GetSystemMetrics( SM_CYEDGE );
它返回 2px(在每个 DPI 设置 (???) 上),我在 100% dpi 上得到 13px,但在 125% DPI 上得到 17px(应该是 16),并且错误只会随着更高的 DPI 而变大。问题是SM_CXMENUCHECK 不代表标准的CButton 复选框。
我想避免自定义绘图。有没有办法用像素精度来做到这一点(如果没有,你想出的最好的解决方案是什么)?非常感谢。
编辑: 澄清一下,我需要一个函数(或某种算法),它将在 100% 缩放时返回 13px,在 125% 时返回 16px,在 150% 和 175% 时返回 20px(以及任何其他可能的缩放)。这意味着我需要一个真实大小的复选框(由 Windows 根据当前在客户端屏幕上设置的分辨率绘制)。
【问题讨论】:
-
附带问题:它必须是一个按钮吗?也可以映射到点击事件的标准复选框呢?
-
这里有一些关于主题的答案值得调查:stackoverflow.com/questions/22689311/get-the-size-of-checkbox
-
我不知道如何在 MFC 中以另一种方式创建“标准复选框”,而不是通过创建带有复选框标志的 CButton。这些主题看起来很有希望,谢谢!我试试看。
-
我需要从代码中动态创建控件。无论如何,问题已经得到解答,感谢您的帮助。
标签: windows winapi checkbox mfc win32gui