如何让主要形式出现在第二个显示器
我用Delphi 10,我有两个显示器,当我创建默认的VCL应用程序并运行的主要形式总是出现在第一个显示器的应用是有办法让它出现在第二台显示器默认?如何让主要形式出现在第二个显示器
这在IDE或财产或代码可能会选择
感谢
TForm
具有被默认设置为dmActiveForm
一个DefaultMonitor
属性。当没有窗体处于活动状态时,将使用主监视器。但是,无法将DefaultMonitor
专门设置为第二台显示器。
TForm
也有Monitor
属性,但不管是什么原因,它是只读的。
因此,可以显示特定的监视器上TForm
,你可以找到在全球TScreen.Monitors[]
列表中选择所需的监听,然后或者:
手动设置窗体的
Left
/Top
属性的X/Y坐标位于显示器的BoundsRect
或WorkareaRect
属性的范围内。显示器传递到窗体的公共
MakeFullyVisible()
方法。
* TForm的也有监视器属性,但不管是什么原因,它是只读的* - 我并不感到惊讶有关此属性为只读。如果您设置此属性,该表单应该做什么?我无法想象 –
@SirRufo也能做到这一点'MakeFullyVisible()'alrwady做同样的事情 - 窗体移动到指定的显示器 –
也许吧,但MakeFullyVisible做多只改变显示器和名称的方法告诉你那。只是改变属性可能会导致一些不需要的行为。我会将它作为只读实现 –
我有两个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;
我希望帮助的你。
*默认*?不是。在代码中?是。 –
通常我会建议你不要这样做。让用户放置表单,但记住他们留下的位置,并在下次显示时将其放回原处。您的设计远离了用户的控制。 –
当第二个监视器不存在时,此设计也会失败。因此,正如David所说,常见模式是在关闭时记住表单的X,Y位置,如果这仍然是可见监视器上的可见区域,则可以在恢复时将其用作初始位置。如果您想要小心,并且在显示器布局更改时不让表单显示在用户看不到的地方,那么允许保存表单位置的代码有相当多的代码。 –