已知问题还是我忽略了什么? IPicture提供错误的大小@ 125%(但不正常或150%)

时间:2011-08-03 19:17:44

标签: windows winapi

我想我知道发生了什么事。请参阅此消息末尾的第二个编辑。

在C / C ++的Win32应用程序中,我正在使用(不是原作者)使用IPicture类在对话框中绘制位图的代码。它以正常大小工作,当用户将“文本放大率”缩放到150%时,图形自动缩放,但不是125%。

提醒一下,Windows允许您进入轻松访问(在Windows 7中)和“将文本和图标的大小更改为”正常(100%),中等(125%)或更大(150%)

当以100%运行时,IPicture以HIMETRIC(类似于TWIP)值20505加载图形(像素宽度大小775),当以150%运行时,在这些比例下,它在屏幕上正确绘制(第二个是放大的)但是,按比例正确),但在125%处,它具有正常尺寸(在较大的对话框中),HIMETRIC宽度为16404(小于其他两个,正确缩放)。

所以看起来由于某种原因,宽度和高度给出125%的超出规模值,尽管它们在100%(较小)和150%(较高)下正常工作。有什么想法吗?

编辑:

LONG gwWidth, gwHeight; // HIMETRIC units
m_spIPicture->get_Width(&gwWidth);
m_spIPicture->get_Height(&gwHeight);
{
     char msg[80];
     sprintf(&msg[0], "Preparing width %d height %d HIMETRICs\n", gwWidth, gwHeight);
     OutputDebugString(msg);
}

其中

IPicture* m_spIPicture;

所有图形都是这样的,它不仅仅是我所询问的那个。每个报告的正确大小为125%,相同的值报告为100%和150%。

我很想手工做这些事情(至少,自己去做DPI并计算价值)。

编辑:混淆是为什么我得到100%和150%的相同值,但125%的缩放比例不同。随着任何编号系统的变化,我预计(通常)三种结果之一 - 没有变化,变化逐渐变高,变化逐渐变低。

在阅读有关DPI虚拟化的更多信息时,此页面http://msdn.microsoft.com/en-us/library/dd464659.aspx解释了这句话的谜团“当DPI设置为144时,操作系统会自动启用DPI虚拟化。” (注意144是150%模式)。

我还在学习这个应用程序(我从其他地方继承了它),但显然它不是DPI意识到的,这意味着它会虚拟化,在这种情况下(差不多)很好,但是虚拟化直到150%,这意味着我们有点吝啬125%。所以,我要么需要将其虚拟化为125%,要么意识到125%和150%,但至少现在我知道它为什么表现不同。

2 个答案:

答案 0 :(得分:0)

将您的HIMETRIC值转换为20505得到8.073英寸;分成像素数(775)得到96 DPI。这是标准的Windows配置,到目前为止一直很好。

将您的HIMETRIC值转换为16404得到6.458英寸;分成像素数给出120 DPI。这正好是96 * 125%,所以看起来也好。

150%的设定应该给出144 DPI;那么HIMETRIC值应该是13670.你确定get_Width在这里返回与普通模式相同的值吗?

查看您调用Render的示例代码非常有用。

答案 1 :(得分:0)

我现在不在办公室,所以我不能轻易地挖掘代码,但是,我希望第三个数字。我要么预计所有数字都是相同的,要么所有数字都不同,而且它们之间的一个可能原因就像它们似乎不合理(我不会厌恶你的解释)。在任何情况下,它都不起作用。我已经多次运行它检查不同的值,希望我错了,但我一直得到这些数字。

我会再次看一下,如果我没有看到任何与zillionth + 1次相关的不同行为,我会发布代码。

由于

  • 标签