7

对于 Windows PC 显示器,我不是指 Windows CE 或手持设备等。

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

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

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

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

常量 LOGPIXELSX = 88

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

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

4

5 回答 5

13

要回答您对问题的澄清:

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

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

于 2009-03-14T06:11:43.650 回答
6

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

于 2009-03-14T04:37:02.660 回答
2

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

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

于 2009-03-14T04:53:27.050 回答
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;

    }
于 2010-09-16T07:22:49.720 回答
0

Windows 中的两个标准 DPI 设置是 96 dpi(正常尺寸)和 120 dpi(大尺寸)。我确信有一个 Win32 调用来获取此设置,但我不确定在哪里指导你。MSDN 可能有你的答案。

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

于 2009-03-14T04:20:49.547 回答