gpt4 book ai didi

德尔福7 : Center form position on multiple monitors

转载 作者:行者123 更新时间:2023-12-03 02:44:07 25 4
gpt4 key购买 nike

我有一个 TForm,并将“位置”设置为 poMainFormCenter。

当我打开该表单时,它会正确显示在主表单的中心。

但是,在多个屏幕(2 个显示器)上,当我将应用程序放在辅助显示器中时,该窗体不会显示在主窗体的中心。

它仍然显示在主显示器中,位于屏幕边缘。

我的应用程序没有什么特别的,我只设置了 Position 属性。

有人知道如何解决这个问题吗?

我使用的是 Delphi 7 和 Windows XP SP3。

最佳答案

除了看鼠标之外,Jlouro 的想法是正确的。 Screen.Monitors[] 包含每个屏幕上的信息。

我有一个标准程序,可以遍历显示器列表并找出左上角的位置,以决定将其放置在哪个显示器上。虽然我的代码没有居中(我只是在确保窗口完全位于它出现的任何监视器内之后),但想法保持不变。请注意,您必须考虑窗口不在任何监视器上显示的情况 - 我通过将其扔到第一个监视器来处理这种情况。 (当保存的位置位于不再存在的监视器上时,就会发生这种情况——要么被删除,要么在另一台机器上运行。)

自从我搞乱这个以来已经很长时间了,它多年来没有给我带来任何麻烦,所以我没有在比 XP/Delphi 7 更新的任何东西上测试过它。

请注意,这只是为了确保表单可见并且完全在一台显示器上,不会尝试将其居中。

Function        PointInBox(x, y, x1, y1, x2, y2 : Integer) : Boolean;

Begin
Result := (X >= X1) And (X <= X2) And (Y >= Y1) And (Y <= Y2);
End;

Function Overlapping(x11, y11, x12, y12, x21, y21, x22, y22 : Integer) : Boolean;

Var
tx1, ty1, tx2, ty2 : Integer;

Begin
Tx1 := Max(x11, x21);
Tx2 := Min(x12, x22);
Ty1 := Max(y11, y21);
Ty2 := Min(y12, y22);
Result := (Tx1 < Tx2) And (Ty1 < Ty2);
End;

Function GetWhere(Form : TForm) : Integer;

Var
Loop : Integer;
Where : Integer;

Begin
Where := -1;
For Loop := 1 to Screen.MonitorCount do
With Screen.Monitors[Loop - 1] do
If PointInBox(Form.Left, Form.Top, Left, Top, Left + Width - 1, Top + Height - 1) then
Where := Loop - 1;
If Where = -1 then // Top left corner is wild, check for anything
For Loop := 1 to Screen.MonitorCount do
With Screen.Monitors[Loop - 1] do
If Overlapping(Form.Left, Form.Top, Form.Left + Form.Width - 1, Form.Top + Form.Height - 1, Left, Top, Left + Width - 1, Top + Height - 1) then
Where := Loop - 1;
Result := Where;
End;

Procedure GetLimits(Where : Integer; var X, Y, WWidth, WHeight : Integer);

Var
R : TRect;

Begin
If Where < 0 then
Begin
SystemParametersInfo(Spi_GetWorkArea, 0, @R, 0);
X := R.Left;
Y := R.Top;
WWidth := R.Right - R.Left + 1;
WHeight := R.Bottom - R.Top + 1;
End
Else With Screen.Monitors[Where] do
Begin
X := Left;
Y := Top;
WWidth := Width;
WHeight := Height;
End;
End;

Procedure EnsureValidDisplay(Form : TForm);

Var
Left : Integer;
Top : Integer;
Width : Integer;
Height : Integer;
Where : WindowPlacement;

Begin
GetLimits(GetWhere(Form), Left, Top, Width, Height);
Where.Length := SizeOf(Where);
Where.Flags := 0;
GetWindowPlacement(Form.Handle, @Where);
If Form.Left < Left then
Where.rcNormalPosition.Left := Left
Else If Form.Left + Form.Width > Left + Width then
Where.rcNormalPosition.Left := Left + Width - Form.Width;
If Form.Top < Top then
Where.rcNormalPosition.Top := Top
Else If Form.Top + Form.Height > Top + Height then
Where.rcNormalPosition.Top := Top + Height - Form.Height;
If Form.Width > Width then
Where.rcNormalPosition.Right := Where.rcNormalPosition.Left + Width
Else
Where.rcNormalPosition.Right := Where.rcNormalPosition.Left + Form.Width;
If Form.Height > Height then
Where.rcNormalPosition.Bottom := Where.rcNormalPosition.Top + Height
Else
Where.rcNormalPosition.Bottom := Where.rcNormalPosition.Top + Form.Height;
SetWindowPlacement(Form.Handle, @Where);
End;

关于德尔福7 : Center form position on multiple monitors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10089541/

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