4

我使用 Delphi 10.3 Rio,并且需要知道屏幕 PixelsPerInch 比率来相应地扩展我的应用程序。

公式计算,我的屏幕有 142 ppi。(实际值是:15.5" 对角线和 1920 x 1080 分辨率)。但是当我在 Delphi 中读取该Screen.PixelsPerInch属性时,我得到 134 !而且这个值也是我创建PixelsPerInch的每个属性中的报告TForm。那么,为什么会有这种差异?真正的ppi?

AIDA64 报告的实际值为 142 ppi...所以我认为 Delphi 中的每英寸像素比率有问题... 在此处输入图像描述

编辑:

我设法用这段代码获得了真正的 PPI……但我无法在每个 Delphi 组件中更改它。所以,如果我在我的组件中使用这个值,我会不会把一切都搞砸了?

procedure TForm1.FormCreate(Sender: TObject);
var PhiW, PhiH, PixW, PixH: Integer;
    DC: HDC;
    PhiD, PixD, PPI: Real;
begin
 DC:= Form1.Canvas.Handle;
 PhiW:= GetDeviceCaps(DC, HORZSIZE);
 PhiH:= GetDeviceCaps(DC, VERTSIZE);
 PixW:= GetDeviceCaps(DC, HORZRES);
 PixH:= GetDeviceCaps(DC, VERTRES);
 PhiD:= (Sqrt((PhiW*PhiW)+(PhiH*PhiH)))/25.4;
 PixD:= Sqrt((PixW*PixW)+(PixH*PixH));
 PPI:= PixD / PhiD;
 Label1.Caption:= IntToStr(Round(PPI))+' ppi';
end;
4

1 回答 1

1

操作系统 PPI

没有错误,Delphi 在PixelsPerInch.

PPI OS 将返回用于缩放您的应用程序的不是实际显示设备的实际 PPI 值,而是虚拟像素密度。

对于开发应用程序,您需要的 PPI 值是操作系统为您提供的值,而不是显示设备的实际 PPI 值。

您需要知道的一切都是操作系统的基线 PPI 和当前 PPI 或比例因子。使用这些数字,您可以从某个基线像素值计算缩放像素的数量。

例如,如果您的控件基线宽度为 100 像素,并且屏幕比例为基线 PPI 的 150%,那么您的运行时控件大小将为 150 像素。

不同的操作系统有不同的基线 PPI。

操作系统 基线 PPI
视窗 96 生产者价格指数
苹果系统 72 生产者价格指数
安卓 160 PPI
iOS 163 生产者价格指数

计算:

ScaledPx := MulDiv(Px, PixelsPerInch, BaselinePixelsPerInch);

ScaledPx := Px * ScaleFactor;

在 Windows 上:

ScaledPx := MulDiv(Px, PixelsPerInch, 96);

为什么需要使用虚拟操作系统 PPI 而不是硬件 PPI?

首先,不同的显示设备具有不同的硬件像素密度。例如,分辨率为 1920x1080 像素的全高清显示器将具有不同的硬件 PPI,具体取决于设备尺寸是 22 英寸还是 24 英寸。第一个将有 100.13 PPI,第二个将有 91.79 PPI。

但是,如果您使用默认的 Windows 缩放设置 (100%),则当您运行 Windows 时,两个显示器的返回值将为 96 像素。显然,该值与这些硬件 PPI 值中的任何一个都不匹配,并且大约接近。

因此,在两台显示器上显示 100 像素正方形将导致该正方形的物理尺寸不同。

接下来,用户可以选择不同的比例设置。有人可能想要使用 125% 的比例,即 120 PPI。如果您在应用程序中使用实际的硬件 PPI,那么对于这样的用户来说,一切都太小了。

因为可以调整虚拟 PPI,所以在编写通用应用程序时了解实际的硬件 PPI 几乎没有用处。对于 DTP 和类似应用程序,有时能够以 1:1 的比例查看设计是有价值的,但在这种情况下,人们通常使用硬件密度与操作系统匹配的监视器,或者用户必须能够输入他的硬件配置,并且该值是用于计算需要精确匹配物理尺寸的像素尺寸。

虽然有 OS API 可以为您提供显示设备的实际硬件 PPI,但在跨平台的许多设备上,由于各种原因,您将很难获得正确的 PPI 值。

字体 PPI

除了一般的虚拟PPI,还有一个可以由用户独立自定义的PPI值——字体PPI。字体比例的基线与不同平台上虚拟 PPI 的基线相同。完全遵守用户设置的应用程序将根据字体 PPI 而不是一般的虚拟 PPI 显示文本数据和其他相关尺寸。

Delphi 当前不支持自定义字体 PPI 值。也就是说,如果您将字体大小设置为 10 pt,则字体的实际像素高度将根据PixelsPerInch-general PPI 计算。

如果用户字体比例设置为 100%(这是最常用的值),那么 Delphi 将根据PixelsPerInch值正确缩放字体。

于 2022-01-21T08:08:02.900 回答