如何让主窗体出现在第二个显示器上

3

我使用 Delphi 10,有两个显示器。当我创建默认的 VCL 应用程序并运行应用程序时,主窗体总是出现在第一个显示器上。有没有办法让它默认出现在第二个显示器上?

这可能是 IDE、属性或代码中的选项。

谢谢。


1
默认情况下?不是。在代码中?是的。 - undefined
4
通常我建议你不要这样做。让用户放置表单但记住他们离开的位置,在下次显示表单时把它放回那里。你的设计夺走了用户的控制力。 - undefined
此设计在第二个显示器不存在时会失败。正如David所说,常见的模式是在关闭时记住表单的X、Y位置,如果它仍然是可见监视器上的可见区域,您可以将其用作恢复时的初始位置。如果要小心谨慎地保存表单位置,并且在监视器布局更改时不要使表单出现在用户看不见的地方,那么涉及到相当多的代码。 - undefined
我是你的用户。我有6个显示器,我希望它默认显示在右上角。但是你却强制它总是显示在左下角。 - undefined
1
尚未测试主窗体,但可以在不同的监视器上显示附加窗体(尽管是最大化形式)。请查看此问题。无需费心计算/偏移坐标。https://stackoverflow.com/questions/6368276/delphi-maximize-a-form-to-a-particular-screen - undefined
2个回答

11

TForm有一个DefaultMonitor属性,默认设置为dmActiveForm。当没有活动窗体时,使用主监视器。但是,没有办法将DefaultMonitor特定地设置为第二个监视器。

TForm还有一个Monitor属性,但出于某种原因,它是只读的。

因此,要在特定监视器上显示TForm,可以在全局TScreen.Monitors[]列表中找到所需的监视器,然后执行以下操作之一:

  1. 手动设置表单的 Left/Top 属性,使其坐标在显示器的 BoundsRectWorkareaRect 属性范围内。

  2. 将显示器传递给表单的公共 MakeFullyVisible() 方法。


TForm也有一个Monitor属性,但由于某种原因它是只读的 - 对于这个属性是只读的我并不感到惊讶。如果设置了这个属性,表单应该做什么呢?我无法想象。 - undefined
1
@SirRufo 它可以做与 MakeFullyVisible() 相同的事情 - 将窗体移动到指定的监视器上。 - undefined
也许,但MakeFullyVisible所做的不仅仅是改变监视器,方法名称告诉你了这一点。仅仅改变属性可能会引起一些不希望的行为。我也会将其实现为只读。 - undefined

2

我有两个1600像素宽的显示器。我的主显示器在右边,因此,为了将表单放置在左侧,我需要给他的Left属性传递一个负值。

procedure TForm1.Button1Click(Sender: TObject);
begin
  // (3200 / 2 = + 1600) * -1 = -1600
  Left := (Screen.DesktopWidth div 2) * -1;
end;

结果是-1600,这意味着它在我的次要显示器最左边。

你也可以通过调用Screen.Monitors[i].Left来获取每个显示器的“最左”位置,类似于以下代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
  lMens: string;
begin
  lMens := '';
  for I := 0 to Screen.MonitorCount - 1 do
  begin
    lMens := lMens + ' | '
             + Format('%d - Left = %d', [i, Screen.Monitors[i].Left])
  end;
  ShowMessage(lMens);
end;

我希望这能对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接