gpt4 book ai didi

delphi - 如何在辅助显示器上显示表单?

转载 作者:行者123 更新时间:2023-12-03 14:51:57 24 4
gpt4 key购买 nike

我正在用 Delphi 编写一个屏幕保护程序。我想要的是在每个显示器上全屏显示 TpresentationFrm。为此,我编写了以下(不完整)程序:

program ScrTemplate;

uses
...

{$R *.res}

type
TScreenSaverMode = (ssmConfig, ssmDisplay, ssmPreview, ssmPassword);

function GetScreenSaverMode: TScreenSaverMode;
begin
// Some non-interesting code
end;

var
i: integer;
presentationForms: array of TpresentationFrm;

begin
Application.Initialize;
Application.MainFormOnTaskbar := True;

case GetScreenSaverMode of
ssmConfig:
Application.CreateForm(TconfigFrm, configFrm);
ssmDisplay:
begin
SetLength(presentationForms, Screen.MonitorCount);
for i := 0 to high(presentationForms) do
begin
Application.CreateForm(TpresentationFrm, presentationForms[i]);
presentationForms[i].BoundsRect := Screen.Monitors[i].BoundsRect;
presentationForms[i].Visible := true;
end;
end
else
ShowMessage(GetEnumName(TypeInfo(TScreenSaverMode), integer(GetScreenSaverMode)));
end;

Application.Run;
end.

当执行ssmDisplay代码时,确实创建了两个表单(是的,我正好有两个监视器)。但它们都出现在第一个监视器上(索引 0,但不是主监视器)。

单步执行代码时,我发现 Screen.Monitors[i].BoundsRect 是正确的,但由于某种原因,表单获得了不正确的边界:

Watch Name                          Value (TRect: Left, Top, Right, Bottom, ...)
Screen.Monitors[0].BoundsRect (-1680, 0, 0, 1050, (-1680, 0), (0, 1050))
Screen.Monitors[1].BoundsRect (0, 0, 1920, 1080, (0, 0), (1920, 1080))

presentationForms[0].BoundsRect (-1680, 0, 0, 1050, (-1680, 0), (0, 1050))
presentationForms[1].BoundsRect (-1920, -30, 0, 1050, (-1920, -30), (0, 1050))

第一个表单获得了所需的位置,但第二个表单没有。它不是从 x=0 到 1920,而是占据 x=-1920 到 0,即它出现在第一个监视器上,第一个窗体上方。怎么了?完成我想要的事情的正确程序是什么?

最佳答案

表单必须可见才能使用 BoundRect 设置边界。

像这样反转行:

presentationForms[i].Visible := true;
presentationForms[i].BoundsRect := Screen.Monitors[i].BoundsRect;

关于delphi - 如何在辅助显示器上显示表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3118751/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com