我使用 Delphi 10.3 Rio,并且需要知道螢屏 PixelsPerInch 比率來相應地擴展我的應用程式。
用
編輯:
我設法用這段代碼獲得了真正的 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;
uj5u.com熱心網友回復:
作業系統 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值正確縮放字體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/418500.html
標籤:
