【问题标题】:How to make main form appear in 2nd monitor如何使主窗体出现在第二个监视器中
【发布时间】:2016-10-12 16:45:35
【问题描述】:

我使用 Delphi 10,当我创建默认 vcl 应用程序并运行应用程序时,我有两个监视器,主窗体总是出现在第一个监视器中,有没有办法让它默认出现在第二个监视器中?

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

谢谢

【问题讨论】:

  • 默认?不,在代码中?是的。
  • 一般我会建议你不要这样做。让用户放置表单,但要记住他们离开的位置,并在下次显示时将其放回原处。您的设计将控制权从用户手中夺走。
  • 当第二个显示器不存在时,此设计也会失败。因此,正如 David 所说,常见的模式是记住表单关闭时的 X、Y 位置,如果这仍然是可见监视器上的可见区域,则可以在恢复时将其用作初始位置。如果您想小心并且在显示器布局发生变化时不要让表单出现在用户不可见的地方,那么允许保存表单位置涉及到相当多的代码。
  • 我是你的用户。我有 6 台显示器,我希望它默认显示在右上角。但是你强迫它总是显示在左下角。

标签: delphi


【解决方案1】:

TForm 有一个DefaultMonitor 属性,默认设置为dmActiveForm。当没有表单处于活动状态时,将使用主监视器。但是,没有办法专门将DefaultMonitor 设置为第二台显示器。

TForm 也有一个Monitor 属性,但无论出于何种原因,它都是只读的。

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

  1. 手动将表单的Left/Top 属性设置为监视器的BoundsRectWorkareaRect 属性范围内的X/Y 坐标。

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

【讨论】:

  • TForm 也有一个 Monitor 属性,但无论出于何种原因它都是只读的 - 我对这个属性是只读的并不感到惊讶。如果设置此属性,表单应该做什么?我无法想象是什么
  • @SirRufo 它可以做与MakeFullyVisible() alrwady 相同的事情——将表单移动到指定的监视器
  • 也许吧,但 MakeFullyVisible 不仅仅只是更改监视器,而且方法的名称会告诉您这一点。只是更改属性可能会导致一些不需要的行为。我也会以只读方式实现它
【解决方案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;

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多