所有 Windows PC 显示器上的每英寸像素数是标准的吗? GetDeviceCaps WinAPI 调用中的 (LogPixelsX)

Posted

技术标签:

【中文标题】所有 Windows PC 显示器上的每英寸像素数是标准的吗? GetDeviceCaps WinAPI 调用中的 (LogPixelsX)【英文标题】:Is the number of Pixels per Inch standard on all Windows PC displays? (LogPixelsX) in the GetDeviceCaps WinAPI call 【发布时间】:2009-03-14 04:16:23 【问题描述】:

Windows PC 显示器不是指 Windows CE,也不是手持设备等。

澄清 下面的一些人错误地认为我在问显示器上的 DPI(每英寸点数)是多少。我要的是 GetCaps API 调用中 LogPixelsX 的值:

LOGPIXELSX 沿屏幕宽度每逻辑英寸的像素数。

在我看到的示例中,它设置为 88,无论屏幕 DPI。似乎是一个幻数类型的常数。

在相关的Question 中,我使用 GetDeviceCaps 来计算当前的屏幕字体 DPI。我找到的代码示例都有:

常量 LOGPIXELSX = 88

这对于所有显示器(即使是宽屏显示器和普通显示器)都一样吗? 如果没有,我如何为当前显示找到它。 (MSDN 指出对于特定计算机上的所有显示器都是相同的。

在具有多个显示监视器的系统中,此值对于所有监视器都是相同的。

【问题讨论】:

【参考方案1】:

回答您对问题的澄清:

LOGPIXELSX 是您传递给 GetDeviceCaps 以获取当前显示器分辨率的参数(技术上是水平分辨率,但所有现代显示器都具有相同的水平和垂直分辨率)。是的,它总是 88 - 如果您想从 GetDeviceCaps 获得不同的值,您将传入不同的值。例如,要获取每个像素的位数,您需要传递 BITSPIXEL 常量,即 12。这些魔术常量在 Windows API 文件 WINGDI.h 中定义。

MSDN 中的注解指的不是参数,而是返回值。

【讨论】:

好吧,我现在觉得自己像个白痴。我从来没有想过它是一个常数来确定你所要求的什么。我以为是计量单位。谢谢! 我觉得自己像个白痴,花了这么长时间才弄清楚你要什么,所以我们是平等的。【参考方案2】:

Windows 的分辨率始终为 96 DPI,除非您在显示设置中更改它。在 XP 上,您可以在“显示属性”->“设置”下的“高级”对话框中找到它;我不知道在其他版本的 Windows 中哪里可以找到。

GetDeviceCaps(LOGPIXELSX) 将返回 DPI 是正确的,但有一点需要注意。从 Vista 开始,Windows 可能会对您实际配置的分辨率撒谎。您需要让您的应用程序具有 DPI 感知能力,以获取配置的真实情况。这是一个 Microsoft 页面,提供了一些详细信息,特别强调了 Windows 7 中的变化。

http://msdn.microsoft.com/en-us/library/dd464659(VS.85).aspx

还有一个链接:

http://msdn.microsoft.com/en-us/library/ms701681(VS.85).aspx

【讨论】:

88 是 LOGPIXELSX 的值,它是传递给 GetDeviceCaps() 以获取 X 轴上每英寸的逻辑像素的值。 实际上,我见过几台笔记本电脑配备了非常高分辨率的屏幕,预选了 144 DPI。它们是罕见的模型,但确实会发生。 @AdrianMcCarthy,很高兴知道!我希望有一个特定的模型作为示例。 从 Windows 10 开始,系统仍然以相同的方式计算它:96 x 系统规模。因此,它不是真正的物理 DPI。系统比例设置在显示设置 > 比例和布局 > 更改文本、应用和其他项目的大小 @Gammadyne 我不希望默认设置会改变,因为显示器的分辨率越来越高,它们也越来越大。近 10 年来,我们没有取得太大进展。【参考方案3】:

请参阅SetProcessDPIAware()(适用于 Vista)和GetDeviceCaps(...) 以获取 DPI。

XP 有 96 或 120 dpi。 Vista 实际上有一个滑块可以通过 DPI 设置的“连续体”进行调整。在 Vista 上,DWM 负责缩放您的应用程序,除非您明确指出您是 DPI 感知的。对于 XP,您应该同时计划 96 和 120。

【讨论】:

XP 也可以设置其他 dpi 值。您绝对可以期望在视障者的显示器上看到 >120dpi。 在 mac 上怎么样,因为它们的显示总是比 xp 或 vista“清晰”? 对 XP 只有 2 种模式的不正确信息投了反对票(正如 bobince 指出的那样不正确)。【参考方案4】:

对于图像的情况,图像分辨率(DPIX,DPIY)将采用其他恒定的监视器分辨率。图像 dpi 的 twips 到像素转换如下:

    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;

    

【讨论】:

【参考方案5】:

Windows 中的两个标准 DPI 设置是 96 dpi(普通尺寸)和 120 dpi(大尺寸) . MSDN 可能有你的答案。

编辑:我应该澄清一下,我所说的 Windows 是指 Windows XP

【讨论】:

以上是关于所有 Windows PC 显示器上的每英寸像素数是标准的吗? GetDeviceCaps WinAPI 调用中的 (LogPixelsX)的主要内容,如果未能解决你的问题,请参考以下文章

Android开发里的像素单位dppxptsp的比较

打印常识:A4纸张在显示器上应该要多少像素?

Bitmap的内存计算方式

Android 中的长度单位pxdpsp

android 尺寸适配相关

移动设备的尺寸