我有一个Delphi 7主表单,其中包含" open"按钮,打开另一个表单,就像这样:
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
答案 0 :(得分:3)
您不应该像这样使用Application.CreateForm()
。请改用TfrmPswd.Create()
。并使用Free()
代替Release()
。
摆脱Application.NormalizeTopMosts()
和Application.ProcessMessages()
来电,它们根本不属于此代码。
在OnCreate
事件中,使用Self
代替全局frmPswd
变量。
您需要将Monitor.Left
和Monitor.Top
偏移量添加到新坐标中,以便考虑不在Virtual Screen的偏移0,0处开始的监视器。
尝试更像这样的事情:
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;