我有一个 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出现在一个奇怪的位置,我不明白为什么。
编辑:
以下是雷米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
型
2条答案
按热度按时间nqwrtyyt1#
你不应该像这样使用
Application.CreateForm()
。使用TfrmPswd.Create()
。使用Free()
代替Release()
。去掉
Application.NormalizeTopMosts()
和Application.ProcessMessages()
调用,它们根本不属于这段代码。在
OnCreate
事件中,使用Self
代替全局变量frmPswd
。您需要将
Monitor.Left
和Monitor.Top
偏移量添加到新坐标中,以考虑不从Virtual Screen偏移量0,0处开始的监视器。试试类似这样的东西:
字符串
型
23c0lvtd2#
这也可以在微软PowerToys的帮助下实现。如果你将有一个选项,使用活动焦点或鼠标指针下花式区域。