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

8

我所提到的Windows PC显示器不包括Windows CE或手持设备等。

澄清
以下一些人错误地认为我在问监视器上的每英寸点数(DPI)。我所询问的是在GetCaps API调用中LogPixelsX的值:

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

在我看过的例子中,它被设置为88,无论屏幕DPI如何。似乎是一种魔法数字常量。

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

Const LOGPIXELSX = 88

这对于所有显示器(甚至是宽屏与普通显示器)都是普遍相同的吗? 如果不是,怎么找到当前显示器的值。(MSDN指出它对于计算机上的特定所有显示器都是相同的。

在具有多个显示器的系统中,此值对所有显示器均相同。

5个回答

14

回答您对问题的澄清:

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

MSDN上的注释指的不是参数,而是返回的值。


1
好的,现在我感觉像个白痴。我从没意识到那是一个常数来确定你所要的是什么。我以为那是度量单位。谢谢! - Clay Nichols
1
我觉得自己很蠢,花了这么长时间才明白你在问什么,所以我们算是扯平了。 - Mark Ransom

6

除非在显示设置中更改,否则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


3
88是LOGPIXELSX的值,你需要将这个值传递给GetDeviceCaps()函数,以获取X轴上每英寸的逻辑像素数。 - codekaizen
实际上,我见过一些带有极高分辨率屏幕的笔记本电脑,预先选择了144 DPI。虽然这些型号很少见,但确实存在。 - Adrian McCarthy
@AdrianMcCarthy,好的了解!我很想有一个具体的模型作为例子。 - Mark Ransom
截至Windows 10,系统仍然以相同的方式计算:96 x 系统缩放。因此它并不是真正的物理DPI。系统缩放设置在“显示设置”>“缩放和布局”>“更改文本、应用程序和其他项目的大小”中。 - Greg Wittmeyer
@Gammadyne 我并不期望默认设置会发生变化,随着显示器分辨率的提高,它们也变得更大了。在近10年的时间里,我们几乎没有取得太多进展。 - Mark Ransom
@AdrianMcCarthy 我几年前吃了个大亏,发现Surface平板是那种罕见的型号之一。 - Mark Ransom

2
请参考SetProcessDPIAware()(Vista)和GetDeviceCaps(...)来获得DPI。
XP的DPI为96或120,而Vista则有一个滑动条来调整“连续”的DPI设置。在Vista上,DWM会自动缩放您的应用程序,除非您明确指出您是DPI感知的。对于XP,您应该同时考虑96和120。

4
XP可以设置其他dpi值。你可以期望在视力不好的显示器上看到大于120dpi的分辨率。 - bobince
在Mac上呢?因为它们的显示屏看起来总是比XP或Vista更“清晰”? - CodeKiwi
因为有关XP仅有两种模式的错误信息(正如bobince所指出的那样)而被投反对票。 - Aardvark

1

对于图像的情况,需要考虑图像分辨率(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;

    }

0
在Windows中,两个标准的DPI设置是96 dpi(正常大小)和120 dpi(大号)。我相信有一个Win32调用可以获取此设置,但我不确定应该指向哪里。MSDN可能会有你的答案。
编辑:我应该澄清一下,我的意思是Windows XP。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接