这个问题已经在这里讨论过,但人们接受了一个不准确的解决方案。我正在使用带有
我需要我的解决方案根据客户端的屏幕分辨率/DPI设置返回真实大小。在100% DPI下,Windows会创建一个正方形13x13像素,125% DPI下为16x16像素,但在150%和175% DPI下均为20x20像素!因此,不可能仅仅将13乘以
这段代码
该函数返回2像素(在每个DPI设置上),我在100% DPI上得到了13像素,但在125% DPI上得到了17像素(应该是16),并且随着更高的DPI,误差只会变大。问题在于SM_CXMENUCHECK不代表标准的CButton复选框。
我想避免自定义绘图。有没有办法以像素精度来解决这个问题(如果没有,你提出的最佳解决方案是什么)?非常感谢您的帮助。
编辑: 为了澄清,我需要一个函数(或一些算法),它将在100%缩放时返回13px,在125%时返回16px,在150%和175%时返回20px(以及任何其他可能的缩放)。这意味着我需要复选框的真实大小(由Windows根据客户端屏幕上当前设置的分辨率绘制)。
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设置返回真实大小。在100% DPI下,Windows会创建一个正方形13x13像素,125% DPI下为16x16像素,但在150%和175% DPI下均为20x20像素!因此,不可能仅仅将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 );
该函数返回2像素(在每个DPI设置上),我在100% DPI上得到了13像素,但在125% DPI上得到了17像素(应该是16),并且随着更高的DPI,误差只会变大。问题在于SM_CXMENUCHECK不代表标准的CButton复选框。
我想避免自定义绘图。有没有办法以像素精度来解决这个问题(如果没有,你提出的最佳解决方案是什么)?非常感谢您的帮助。
编辑: 为了澄清,我需要一个函数(或一些算法),它将在100%缩放时返回13px,在125%时返回16px,在150%和175%时返回20px(以及任何其他可能的缩放)。这意味着我需要复选框的真实大小(由Windows根据客户端屏幕上当前设置的分辨率绘制)。