在Windows 7下,我使用以下代码获取以mm为单位的物理宽度。 ' hSize'是482,它比实际尺寸大得多,约为310(用尺子测量)。这是为什么?
HDC screen = GetDC(NULL);
int hSize=GetDeviceCaps(screen,HORZSIZE);
PS:我需要DPI值来渲染地图。
答案 0 :(得分:10)
正如评论所示,GetDeviceCaps(HORSZIE / VERTSIZE)众所周知是不准确的。它总是那样,而且可能总是这样。你无能为力,所以你必须假装这个API不存在并继续前进。它无法帮助您找到显示器的实际尺寸。您最好只假设一个固定的默认值,并让用户在必要时手动调整尺寸。
幸运的是,有人已经做过研究并想出了一种更好的方法来查找Windows上显示器的物理尺寸。在一篇名为Reading Monitor Physical Dimensions, or: Getting the EDID, the Right Way的博客文章中,Ofek介绍了如何使用Windows的SetupAPI从montior的EDID获取更准确的维度。程序概要描述如下:
- 调用SetupDiGetClassDevsEx获取HDEVINFO句柄。
- 在调用SetupDiEnumDeviceInfo时使用此HDEVINFO来填充SP_DEVINFO_DATA结构。
- 在调用SetupDiOpenDevRegKey时同时使用HDEVICE和HDEVINFO,最终将HKEY转换为所需的注册表项 - 持有EDID块。
醇>
链接的博客条目包含示例代码,以及他尝试的其他替代方法的信息。
请注意,即使EDID也不总是准确的。虽然显示器本身所说的是它自己的尺寸,但仍有很多错误的机会。供应商很容易在EDID中出现尺寸错误,显示器仍然可以正常工作,因此没有动力去实现这些价值。