在Windows 7下,我使用以下代码获取屏幕的物理宽度(单位为毫米)。'hSize'是482,远大于实际尺寸(用尺子测量约为310)。为什么会这样呢?
HDC screen = GetDC(NULL);
int hSize=GetDeviceCaps(screen,HORZSIZE);
PS: 我需要DPI值来渲染地图。
GetDeviceCaps(HORSIZE/VERTSIZE)
极不准确。它一直是这样,可能也会一直是这样。你无能为力,所以你只需假装这个API不存在并继续前进。它不能帮助你找到显示器的真实尺寸。最好假设一个固定的默认值,如果需要让用户手动调整尺寸。
幸运的是,已经有人进行了研究并找到了在Windows上查找显示器物理尺寸的更好方法。在一篇名为Reading Monitor Physical Dimensions, or: Getting the EDID, the Right Way的博客文章中,Ofek描述了如何使用Windows的SetupAPI从显示器的EDID中获取更精确的尺寸。该过程的概述如下:SetupDiGetClassDevsEx
来获取一个HDEVINFO
句柄。
使用此HDEVINFO
在调用SetupDiEnumDeviceInfo
以填充SP_DEVINFO_DATA
结构体。
同时在调用SetupDiOpenDevRegKey
时,使用HDEVICE
和HDEVINFO
来最终获得所需注册表键的HKEY
- 即包含EDID块的键。
链接的博客文章包含示例代码以及作者尝试的其他替代方法的信息。
HORZSIZE
返回的值是一个基于配置的DPI和像素数量的近似值。它旨在作为逻辑测量而非物理测量。它可能会有相当大的误差,但您无法对其进行任何更改。 - Mark RansomLOGPIXELSX
和LOGPIXELSY
被记录为提供这些值。 (除非我错了,否则请随意纠正我。) - andlabs