通过Windows PC显示器,我不是指Windows CE或手持设备等
澄清
下面的一些人错误地认为我在问显示器上DPI(每英寸点数)是多less。 我要求的是GetCaps API调用中LogPixelsX的值:
LOGPIXELSX沿屏幕宽度每逻辑英寸的像素数。
在我看到的例子中, 无论屏幕DPI 如何 ,它都设置为88。 似乎是一个常数的魔法数字。
在相关的问题我使用GetDeviceCaps来计算当前屏幕字体DPI。 我发现的代码示例都有:
常量LOGPIXELSX = 88
这是所有显示器(即使宽屏vs普通显示器)普遍相同? 如果不是,我如何find当前的显示。 (MSDN表示对于特定计算机上的所有显示器都是一样的。
在具有多个显示器的系统中,这个值对于所有的显示器是相同的。
为了回答你对这个问题的澄清:
LOGPIXELSX是您传递给GetDeviceCaps以获取当前监视器分辨率(技术上是水平分辨率,但所有现代显示器具有相等的水平和垂直分辨率)的参数。 是的,它总是88 – 如果你想从GetDeviceCaps得到不同的值,你会传入一个不同的值。 例如,要获得每像素的位数,就要传递12的BITSPIXEL常量。这些魔术常数在Windows API文件WINGDI.h中定义。
MSDN中的说明不是指参数,而是返回的值。
除非您在显示设置中更改Windows,否则Windows始终具有96 DPI的分辨率。 在XP上,您可以在“显示属性” – >“设置”下的“高级”对话框中找到它。 我不知道它在其他版本的Windows中找到。
你是正确的GetDeviceCaps(LOGPIXELSX)将返回DPI,除了一个小警告。 从Vista开始,Windows可能会骗你实际配置的分辨率。 您需要使您的应用程序能够识别DPI以获得配置的真实图像。 这里有一个微软的页面提供了一些细节,特别强调了Windows 7的变化。
http://msdn.microsoft.com/en-us/library/dd464659(VS.85).aspx
另一个链接:
http://msdn.microsoft.com/en-us/library/ms701681(VS.85).aspx
请参阅SetProcessDPIAware() (用于Vista)和GetDeviceCaps(…)以获取DPI。
XP有96或120 dpi。 Vista实际上有一个滑块可以通过DPI设置的“连续”进行调整。 在Vista上,DWM负责扩展您的应用程序,除非您明确地表明您是DPI感知的。 对于XP,你应该计划96和120。
对于图像的情况下,图像分辨率(DPIX,DPIY)将采取其他恒定的显示器分辨率。
public struct RECT_TAG { public int iLeft; public int iTop; public int iHeight; public int iWidth; } public static RECT_TAG ConvertTwipsToPixels(RECT_TAG pobjRect, int plXDPI, int plYDPI) { pobjRect.iLeft = pobjRect.iLeft * plXDPI / 1440; pobjRect.iTop = pobjRect.iTop * plYDPI / 1440; pobjRect.iWidth = pobjRect.iWidth * plXDPI / 1440; pobjRect.iHeight = pobjRect.iHeight * plYDPI / 1440; return pobjRect; }
Windows中的两个标准DPI设置是96 dpi(普通尺寸)和120 dpi(大尺寸)。我确定有一个Win32调用来获取这个设置,但我不确定在哪里指导你。 MSDN可能有你的答案。
编辑:我应该澄清,通过Windows我的意思是Windows XP