gpt4 book ai didi

delphi - 多显示器 - 在鼠标光标所在的显示器中打开应用程序窗口

转载 作者:行者123 更新时间:2023-12-03 15:30:19 25 4
gpt4 key购买 nike

我有一个带有“打开”按钮的 Delphi 7 主窗体,可以打开另一个窗体,如下所示:

procedure TForm1.Button1Click(Sender: TObject);
begin
try
Application.CreateForm(TfrmPswd, frmPswd);
Application.NormalizeTopMosts;
Application.ProcessMessages;
frmPswd.ShowModal;
finally
frmPswd.Release;
frmPswd := nil;
end;
end;

在 frmPswd OnCreate 事件上,我试图将其集中,具体取决于鼠标光标所在的监视器,如下所示:

procedure TfrmPswd.FormCreate(Sender: TObject);
var
Monitor: TMonitor;
begin
Monitor := Screen.MonitorFromPoint(Mouse.CursorPos);
frmPswd.Top := Round((Monitor.Height - frmPswd.Height) / 2);
frmPswd.Left := Round((Monitor.Width - frmPswd.Width) / 2);
end;

当主窗体与鼠标光标位于同一监视器中时,frmPswd 窗体将按预期在该监视器的中心打开。但是当主窗体位于与鼠标不同的显示器中时,frmPswd 出现在一个奇怪的位置,我不明白为什么。

编辑:

以下是 Remy Lebeau 要求的结果,即使使用新代码:

Monitor := Screen.MonitorFromPoint(Mouse.CursorPos);
Self.Left := Monitor.Left + ((Monitor.Width - Self.Width) div 2);
Self.Top := Monitor.Top + ((Monitor.Height - Self.Height) div 2);

Monitor 0
Top: 0
Left: 0
Width: 1440
Height: 900

Monitor 1
Top: -180
Left: -1920
Width: 1920
Height: 1080

frmPswd.Width = 200
frmPswd.Height = 200

Main form in Monitor 0 and Mouse cursor in Monitor 0
frmPswd.Top = 350
frmPswd.Left = 620

Main form in Monitor 1 and Mouse cursor in Monitor 1
frmPswd.Top = 260
frmPswd.Left = -1060

Main form in Monitor 0 and Mouse cursor in Monitor 1
frmPswd.Top = 440
frmPswd.Left = 860

Main form in Monitor 1 and Mouse cursor in Monitor 0
frmPswd.Top = 170
frmPswd.Left = -1300

最佳答案

您不应该像这样使用Application.CreateForm()。请改用 TfrmPswd.Create()。并使用 Free() 而不是 Release()

摆脱 Application.NormalizeTopMosts()Application.ProcessMessages() 调用,它们根本不属于此代码。

OnCreate 事件中,使用 Self 而不是全局 frmPswd 变量。

您需要将 Monitor.LeftMonitor.Top 偏移量添加到新坐标,以考虑不从偏移量 0,0 开始的监视器Virtual Screen .

尝试更多类似这样的事情:

procedure TForm1.Button1Click(Sender: TObject);
var
frm: TfrmPswd;
begin
frm := TfrmPswd(nil);
try
frm.ShowModal;
finally
frm.Free;
end;
end;

procedure TfrmPswd.FormCreate(Sender: TObject);
var
Monitor: TMonitor;
begin
Monitor := Screen.MonitorFromPoint(Mouse.CursorPos);
Self.Left := Monitor.Left + ((Monitor.Width - Self.Width) div 2);
Self.Top := Monitor.Top + ((Monitor.Height - Self.Height) div 2);
end;

关于delphi - 多显示器 - 在鼠标光标所在的显示器中打开应用程序窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36096046/

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