GetDeviceCaps获取的物理屏幕尺寸不是我屏幕的实际物理尺寸
physical screen size acquired by GetDeviceCaps is not the actual physical size of my screen
在Windows7下,我使用以下代码获取屏幕的物理宽度(以毫米为单位)。 '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 describes how you can get more accurate dimensions from the montior's EDID 的博客条目中,使用 Windows' 设置 API。程序概要如下:
- Call
SetupDiGetClassDevsEx
to get an HDEVINFO
handle.
- Use this
HDEVINFO
in a call to SetupDiEnumDeviceInfo
to populate an SP_DEVINFO_DATA
struct.
- Use both
HDEVICE
and HDEVINFO
in a call to SetupDiOpenDevRegKey
, to finally get an HKEY
to the desired registry key – the one that
holds the EDID block.
链接的博客条目包含示例代码,以及有关他尝试过的其他替代方法的信息。
请注意,即使是 EDID 也不总是准确的。虽然显示器本身所说的是它自己的尺寸,但仍然有很多出错的机会。供应商很容易将 EDID 中的尺寸弄错,而显示器仍然可以正常工作,因此没有动力让这些值正确。
在Windows7下,我使用以下代码获取屏幕的物理宽度(以毫米为单位)。 '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 describes how you can get more accurate dimensions from the montior's EDID 的博客条目中,使用 Windows' 设置 API。程序概要如下:
- 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 中的尺寸弄错,而显示器仍然可以正常工作,因此没有动力让这些值正确。