delphi 不同屏幕分辨率之间的坐标缩放

6ioyuze2  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(221)

我在一台屏幕分辨率为96的笔记本电脑上用 Delphi 10开发了一些项目。我现在在一台屏幕分辨率为201的Microsoft Surface上使用Delphi 10.4 Community Edition。在缩放应用程序时,是否有一个函数或设置可以自动转换数字定义的坐标?为了说明我的意思,我添加了以下代码片段。

procedure TForm1.Button1Click(Sender: TObject);
begin
  with Canvas do
  begin
    MoveTo(0,0);
    LineTo(400,250);
    MoveTo(0,0);
    LineTo(ClientWidth,ClientHeight);
  end;
end;

绘制的第一条线不缩放,第二条线显然缩放。
请允许我补充一句:
如果我在屏幕分辨率为96的旧笔记本电脑上编译相同的代码,然后在屏幕分辨率为201的Surface笔记本电脑上运行exe文件,它的缩放范围还可以,我希望有一个工具可以在我的新电脑上编译我的旧程序,而不必手动更改所有涉及坐标x和y的代码。

f45qwnt8

f45qwnt81#

在TCanvas中没有内置的坐标缩放。你可以使用这个CLASS HELPER:

TYPE
  TFormHelper = CLASS HELPER FOR TForm
                  FUNCTION Scale(Value : INTEGER) : INTEGER;
                END;

FUNCTION TFormHelper.Scale(Value : INTEGER) : INTEGER;
  BEGIN
    Result:=MulDiv(Value,CurrentPPI,Screen.DefaultPixelsPerInch)
  END;

如以下所示使用:

procedure TForm1.Button1Click(Sender: TObject);
begin
  with Canvas do
  begin
    MoveTo(Scale(0),Scale(0)); // Not needed, as 0 scaled is always 0, but... //
    LineTo(Scale(400),Scale(250));
    MoveTo(0,0);
    LineTo(ClientWidth,ClientHeight);
  end;
end;
dy1byipe

dy1byipe2#

为了在我的新电脑上运行用 Delphi 10开发的项目,使用Delphi 10.4社区版,我将设置项目选项-〉应用程序-〉清单-〉DPI感知更改为GDI缩放,这一切都像一个魅力。

相关问题