在 Windows 10 上运行的 Delphi 10.4.2 Win32 VCL 应用程序中,在双显示器设置中,当我将 MainForm(或任何其他辅助窗体)设置为通过设置开始最大化时WindowState := wsMaximized
,该窗体仅在主监视器上最大化。
如何将表单最大化到整个桌面,以将表单大小设置为包括两个显示器?是否有该类的内置方法TForm
来实现这一点?
在 Windows 10 上运行的 Delphi 10.4.2 Win32 VCL 应用程序中,在双显示器设置中,当我将 MainForm(或任何其他辅助窗体)设置为通过设置开始最大化时WindowState := wsMaximized
,该窗体仅在主监视器上最大化。
如何将表单最大化到整个桌面,以将表单大小设置为包括两个显示器?是否有该类的内置方法TForm
来实现这一点?
一般来说,这个问题并不像你想象的那么简单。我想您正在想象这样的桌面:
在这种情况下,我假设您希望窗口像这样放置:
但是,如果用户有这个布局怎么办:
你想要
(整个窗口可见,但一些屏幕空间未使用)或
(没有未使用的空间,但窗口的某些部分不可见)?
如果您想使用完整的虚拟桌面空间(最后一种情况),这很容易:
BoundsRect := Screen.DesktopRect;
这将在一个简单的设置中完成预期的事情,以及“没有未使用的空间,但窗口的某些部分可能不可见”的事情。
另请注意,Windows 不喜欢这样的窗口行为,因此用户可能无法获得使用该应用程序的良好体验。
一般来说,不要这样做。
请注意,即使是双显示器设置,其中两个显示器都是横向的,也可能不是微不足道的:
即使两个监视器的大小相同,几何图形也可能很重要:
根据 MSDN:
位于多个监视器上的窗口或菜单会导致观看者的视觉中断。为了最小化这个问题,系统在一个监视器上显示菜单和新的和最大化的窗口。
因此,如果您希望TForm
窗口在整个桌面上延伸,则使用WindowState=wsMaximize
不是可行的方法,因为它只能在表单主要显示在其中的单个监视器上工作。
要按照您的要求进行操作,您必须从(或)获取虚拟屏幕的矩形,然后相应地设置表单的/// ,例如:GetSystemMetrics()
Vcl.Forms.TScreen
Left
Top
Width
Height
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;
这不是 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;
这不允许任务栏或其他任何使用桌面空间的东西。