2

在 Windows 10 上运行的 Delphi 10.4.2 Win32 VCL 应用程序中,在双显示器设置中,当我将 MainForm(或任何其他辅助窗体)设置为通过设置开始最大化时WindowState := wsMaximized,该窗体仅在主监视器上最大化。

如何将表单最大化到整个桌面,以将表单大小设置为包括两个显示器?是否有该类的内置方法TForm来实现这一点?

4

3 回答 3

9

一般来说,这个问题并不像你想象的那么简单。我想您正在想象这样的桌面:

一个简单的桌面布局,由两个大小相同的显示器并排放置。

在这种情况下,我假设您希望窗口像这样放置:

跨越两个屏幕的窗口。

但是,如果用户有这个布局怎么办:

横向+纵向+横向屏幕设置

你想要

整个窗口可见,但一些屏幕空间未使用

(整个窗口可见,但一些屏幕空间未使用)或

没有未使用的空间,但窗口的某些部分不可见。

(没有未使用的空间,但窗口的某些部分不可见)?

如果您想使用完整的虚拟桌面空间(最后一种情况),这很容易:

BoundsRect := Screen.DesktopRect;

这将在一个简单的设置中完成预期的事情,以及“没有未使用的空间,但窗口的某些部分可能不可见”的事情。

另请注意,Windows 不喜欢这样的窗口行为,因此用户可能无法获得使用该应用程序的良好体验。

一般来说,不要这样做。


请注意,即使是双显示器设置,其中两个显示器都是横向的,也可能不是微不足道的:

一个大显示器旁边是一个小显示器。

即使两个监视器的大小相同,几何图形也可能很重要:

两个相同尺寸的显示器彼此相邻,都在横向,但在正交方向上移位。

于 2021-07-27T20:41:52.693 回答
3

根据 MSDN:

在多个显示器上定位对象

位于多个监视器上的窗口或菜单会导致观看者的视觉中断。为了最小化这个问题,系统在一个监视器上显示菜单和新的和最大化的窗口。

因此,如果您希望TForm窗口在整个桌面上延伸,则使用WindowState=wsMaximize不是可行的方法,因为它只能在表单主要显示在其中的单个监视器上工作。

要按照您的要求进行操作,您必须从(或)获取虚拟屏幕的矩形,然后相应地设置表单的/// ,例如:GetSystemMetrics()Vcl.Forms.TScreenLeftTopWidthHeight

if Screen.MonitorCount > 1 then
begin
  Form.WindowState := wsNormal;
  Form.Left := Screen.DesktopLeft;
  Form.Top := Screen.DesktopTop;
  Form.Width := Screen.DesktopWidth;
  Form.Height := Screen.DesktopHeight;
  // or:
  Form.SetBounds(Screen.DesktopLeft, Screen.DesktopTop, Screen.DesktopWidth, Screen.DesktopHeight);
  // or:
  Form.BoundsRect := Screen.DesktopRect;
end else
begin
  Form.WindowState := wsMaximized;
end;
于 2021-07-27T20:43:06.987 回答
0

这不是 Windows 应用程序的标准行为。另请注意,由于桌面可以有多个不需要对齐的显示器,因此桌面可能不是矩形 - 这意味着桌面的边界矩形可能包含不可见的部分。

如果你想这样做,你可以使用 Windows 函数 GetDesktopWindow 来获取桌面窗口,然后获取它的大小,然后将窗体的大小设置为那个。

procedure TMyForm.GoLarge();
var
  rctDesktop:   TRect;
  hDT:          HWND;
begin
  hDT:=GetDesktopWindow();
  if(hDT<>0) then
  begin
    GetWindowRect(hDT, rctDesktop);
    Self.SetBounds(rctDesktop.Left,  rctDesktop.Top, rctDesktop.Width, rctDesktop.Height);
  end;
end;

这不允许任务栏或其他任何使用桌面空间的东西。

于 2021-07-27T20:40:24.233 回答