Delphi 和 High-DPI:在运行时创建的控件位置错误
Posted
技术标签:
【中文标题】Delphi 和 High-DPI:在运行时创建的控件位置错误【英文标题】:Delphi and High-DPI: Controls created on runtime obtain wrong position 【发布时间】:2019-09-02 10:05:21 【问题描述】:我在高 DPI 应用程序中运行时创建的控件的定位存在问题。例如,我创建了一个标签,并想创建一个图像并将其直接放置在标签的右侧。
if USER_EMAIL <> '' then
begin
lblSummary_Email := TcxLabel.Create(pnlSummary);
with lblSummary_Email do
begin
Caption := 'E-Mail: ' + USER_EMAIL;
Top := 125;
Left := 278;
AutoSize := true;
Parent := pnlSummary;
end;
with TcxImage.Create(pnlSummary) do
begin
Width := 17;
Height := 17;
Top := lblSummary_Email .Top;
Left := lblSummary_Email .Left + lblSummary_Email .Width + 10;
Picture := imgConfirmed.Picture;
Properties.ShowFocusRect := false;
Style.BorderStyle := ebsNone;
Enabled := false;
Parent := pnlSummary;
end;
end;
图片位置不正确。这表明我在运行时设置的位置将直接转换为 High-DPI。如何避免这种情况或如何在高 DPI 应用程序中为运行时创建的控件设置正确的位置?
【问题讨论】:
图片正好放置在您指定的位置。您需要通过缩放坐标来添加代码以说明当前 dpi。 您似乎仍然在使用 DevEx 组件:您是否考虑过使用 Layout Control 来摆脱这些问题? 【参考方案1】:当您在运行时创建组件时,它会以 96 DPI 创建。
将父级分配给控件将缩放位置/大小以符合该父级的 DPI。
因此,您将 Left/Top 设置为 96 DPI (100%) 像素坐标,并在分配 Parent 时,将其转换为(例如)150% 像素坐标。
因此,要解决您的问题,您应该在设置控件边界之前分配父级:
if USER_EMAIL <> '' then
begin
lblSummary_Email := TcxLabel.Create(pnlSummary);
with lblSummary_Email do
begin
Parent := pnlSummary;
Caption := 'E-Mail: ' + USER_EMAIL;
Top := 125;
Left := 278;
AutoSize := true;
end;
with TcxImage.Create(pnlSummary) do
begin
Parent := pnlSummary;
Width := 17;
Height := 17;
Top := lblSummary_Email .Top;
Left := lblSummary_Email .Left + lblSummary_Email .Width + 10;
Picture := imgConfirmed.Picture;
Properties.ShowFocusRect := false;
Style.BorderStyle := ebsNone;
Enabled := false;
end;
end;
标签的父级分配在定位之前的移动取决于您分配的坐标是否应该缩放(如果是,请将其留在原来的位置),还是绝对的(即始终位于 (278,175) 像素坐标处与缩放无关)。
【讨论】:
以上是关于Delphi 和 High-DPI:在运行时创建的控件位置错误的主要内容,如果未能解决你的问题,请参考以下文章
创建安装程序时如何确保从设计时包中正确“需要”定义 Delphi 运行时包
delphi中,怎样设置新窗体打开时,就运行指定的SQL语句