Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface 如何正确设计高DPI感知(4k就绪)的Delphi应用程序UI?_User Interface_Delphi_Highdpi - Fatal编程技术网

User interface 如何正确设计高DPI感知(4k就绪)的Delphi应用程序UI?

User interface 如何正确设计高DPI感知(4k就绪)的Delphi应用程序UI?,user-interface,delphi,highdpi,User Interface,Delphi,Highdpi,这是我第一次在用delphi创建“复杂”的UI时遇到一些问题。我使用4K监视器进行开发和测试,但存在一些扩展问题 我的应用程序使用2列设计,想象一下源代码管理下的diff视图,其中有一个左窗格和一个右窗格,它们在组件方面镜像自己,但这些组件的内容(文本)不同 为了给您一个想法,我在表单上执行以下操作: edtFixExifLeftFile.Width := Floor((pnlFixExifTop.ClientWidth - (bbpFixExifBrowseLeft.Width * 2 + 4

这是我第一次在用delphi创建“复杂”的UI时遇到一些问题。我使用4K监视器进行开发和测试,但存在一些扩展问题

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

为了给您一个想法,我在表单上执行以下操作:

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;
这样,两列都占用了50%的空间。当在高清环境(1080p)中使用时,这是完美的像素,但在4K环境中,缩放(my
TForm.Scaled=True
)会完全“吃掉”其中一个边距(我使用8px边距,缩放比预期高出约9px)。这会使4K中的显示错误(右侧的TED会使TForm溢出一点)

如何在高清和4K环境中创建像素完美的用户界面?编写组件大小代码的正确方法是什么

我使用Delphi(10.3)的最新版本,不使用花哨的组件(仅使用“库存”VCL)。

在阅读了一篇好文章后,我结束了这项工作:

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

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

您必须在坐标中考虑DPI,而代码则不考虑。您可以使用两列设置为50%宽度的TGridPanel。VCL为DPI更改提供两个事件-OnBeforeMonitorDpiChanged和OnAfterMonitorDpiChanged。尽管VCL可以很好地扩展大部分内容,但我发现我通常需要在OnAfterMonitorDpiChanged事件中应用一些额外的功能。为了将Dpi考虑在内,我还使用了MulDiv函数,例如MuldDiv(5,Monitor.PixelsPerInch,96),而不仅仅是5。了解这些功能。您还可以同步高度,例如在OnAfterMonitorDpiChange中的TButton和TEdit之间。