C# 像素与毫米的一致性

C# 像素与毫米的一致性,c#,screen,wysiwyg,gdi,dimension,C#,Screen,Wysiwyg,Gdi,Dimension,我正在做: PhysicalParameters() { IntPtr DeskTopHWND = GetDesktopWindow(); IntPtr HDC = GetDC(DeskTopHWND); int mmX = GetDeviceCaps(HDC, HORZSIZE); int mmY = GetDeviceCaps(HDC, VERTSIZE); int pxX = GetDe

我正在做:

        PhysicalParameters()
    {
        IntPtr DeskTopHWND = GetDesktopWindow();
        IntPtr HDC = GetDC(DeskTopHWND);
        int mmX = GetDeviceCaps(HDC, HORZSIZE);
        int mmY = GetDeviceCaps(HDC, VERTSIZE);
        int pxX = GetDeviceCaps(HDC, HORZRES);
        int pxY = GetDeviceCaps(HDC, VERTRES);
        ReleaseDC(DeskTopHWND, HDC);
        double CoeffPIX_MM_X = 1.0 * mmX / pxX;
        double CoeffPIX_MM_Y = 1.0 * mmY / pxY;
    }
两者的结果均为0.25

但我看到的(WordWYSIWYG)应该是0.27左右


请解释一下主题。

每个设备的HORZSIZE、HORZRES、VERTSIZE和VERTRES将略有不同。

典型的LCD显示器的密度为每英寸96像素。这转化为像素大小为0.0104167英寸或0.265毫米

然而,制造技术差别很大,因此像素大小不是固定的。不同的显示器和设备会有不同的音高和密度。因此,简单的答案是,像素和度量单位之间没有相关性。像素是您(或设备制造商)想要的大小

参考资料:


调用HORZSIZE的
GetDeviceCaps
实际上并不能得到显示器的水平尺寸-它可以得到当前分辨率下96 DPI显示器的尺寸


当然,96 DPI是默认值-用户可以设置系统DPI,如果他们设置准确,您将获得正确的显示器大小值。不过,几乎没有人会这样做——因此,假设96 DPI,您几乎总能得到返回值。

您压扁显示器了吗?或者拉伸它?0.27不是大约0.25吗?;)您期望的限制是什么?是的,但即使考虑到这一事实,大小和分辨率之间的比率也应该是可靠的,因为它们都基于96DPI。是的,纵横比通常是正确的,因为它采用的像素形状是目前最常见的,但在任何显示器上,如果您的分辨率不精确到96DPI,大小与分辨率的比率将是错误的。当他谈论MSWord和WSIWYG时,我假设他正在用一把真的标尺测量屏幕上的标尺。我如何将我的文档从屏幕转移到打印机?如何确保屏幕在用户PC上以正确的尺寸打印?在打印过程中,使用打印机DC执行相同操作?您可以尝试调用
SetProcessDPIAware
,然后使用
LOGPIXELSX
LOGPIXELSY
调用
GetDeviceCaps
,以获取DPI信息,但这只有在驱动程序正确地向监视器询问DPI上的EDID信息时才是正确的,这是一个垃圾球。请注意,如果您不调用
SetProcessDPIAware
(或在清单中设置),您将始终得到一个假号码(96或用户设置的任何号码)。实际上,唯一100%可靠的方法是要求用户使用实际标尺校准你的应用程序,即使这样,大多数人也会跳过这一步。>要求用户使用实际标尺校准你的应用程序在我的情况下,唯一的方法是如何将我的文档从屏幕传输到打印机?如何确保屏幕在用户PC上以正确的尺寸打印?在打印过程中,是否对打印机DC执行相同的操作?糟糕。你可以控制打印在打印机上的东西的尺寸,查看PostScript、PDF和其他打印格式。由于各种超出您控制的因素,包括用户选择的分辨率等,您永远无法保证显示器上显示的项目具有特定的大小。