如何正确设计一个 Delphi 应用程序 UI 支持高 DPI(4k 就绪)?

How to correctly design a Delphi application UI that is High DPI aware (4k ready)?

我第一次用 delphi 创建 "complex" UI 时遇到了一些问题。我使用 4K 显示器进行开发和测试,我遇到了一些缩放问题。

我的应用程序使用 2 列设计,想想源代码管理下的差异视图,其中您有一个左窗格和一个右窗格,它们在组件方面反映了自己,但这些组件的内容(文本)是不同的。

为了给你一个想法,我在表单调整大小上做了这个:

edtFixExifLeftFile.Width := Floor((pnlFixExifTop.ClientWidth - (bbpFixExifBrowseLeft.Width * 2 + 42)) / 2);
bbpFixExifBrowseLeft.Left := edtFixExifLeftFile.Left + edtFixExifLeftFile.Width + 5;

edtFixExifRightFile.Left := bbpFixExifBrowseLeft.Left + bbpFixExifBrowseLeft.Width + 16;
edtFixExifRightFile.Width := edtFixExifLeftFile.Width;
bbpFixExifBrowseRight.Left := edtFixExifRightFile.Left + edtFixExifRightFile.Width + 5;

这样两列都占 space 的 50%。这在高清环境 (1080p) 中使用时像素完美,但在 4K 环境中缩放(我的 TForm.Scaled = True)完全 "eats" 其中一个边距(我使用 8px 边距,缩放需要大约 9px 更多超出预期)。这使得在 4K 中看起来不对(正确的 TEdit 有点溢出 TForm)。

如何在 HD 和 4K 环境中创建完美的像素 UI?对我的组件调整大小进行编码的正确方法是什么?

我使用最新版本的 Delphi (10.3),我没有使用花哨的组件(仅 "stock" VCL)。

看完好文tutorial by Žarko Gajić我就结束了:

Pad := MulDiv(8, Monitor.PixelsPerInch, 96);
grdpnlCover.Left := pnlCoverImage.Left + pnlCoverImage.Width + Pad;

其中 8 是未缩放的值,96 是设计表单所依据的 DPI。