在 Windows 7 下,我使用以下代码获取屏幕的物理宽度(以毫米为单位)。 'hSize' 为 482,比实际尺寸大约 310(用尺子测量)大得多。这是为什么?
HDC screen = GetDC(NULL);
int hSize=GetDeviceCaps(screen,HORZSIZE);
PS:我需要 DPI 值来渲染 map 。
最佳答案
正如注释所指出的,GetDeviceCaps(HORSIZE/VERTSIZE)
是出了名的不准确。一直都是这样,而且可能永远都是这样。您对此无能为力,因此您只能假装此 API 不存在并继续前进。它不会帮助您找到显示器的实际尺寸。您最好假设一个固定的默认值,并让用户在必要时手动调整尺寸。
幸运的是,已经有人在那里进行了研究,并找到了一种更好的方法来查找 Windows 上显示器的物理尺寸。在题为 Reading Monitor Physical Dimensions, or: Getting the EDID, the Right Way 的博客条目中Ofek 描述了如何从监视器的 EDID 中获得更准确的尺寸通过使用 Windows 的 SetupAPI。流程概要如下:
- Call
SetupDiGetClassDevsEx
to get anHDEVINFO
handle.- Use this
HDEVINFO
in a call toSetupDiEnumDeviceInfo
to populate anSP_DEVINFO_DATA
struct.- Use both
HDEVICE
andHDEVINFO
in a call toSetupDiOpenDevRegKey
, to finally get anHKEY
to the desired registry key – the one that holds the EDID block.
链接的博客条目包含示例代码,以及有关他尝试过的其他替代方法的信息。
请注意,即使是 EDID 也不总是准确的。虽然显示器本身所说的是它自己的尺寸,但仍然有很多出错的机会。供应商很容易在 EDID 中的尺寸上犯错误,而显示器仍然可以完美工作,因此没有动力让这些值正确。
关于c++ - GetDeviceCaps获取的物理屏幕尺寸不是我屏幕的实际物理尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30471954/