如何最大化表格到桌面大小?
How to maximize form to desktop size?
在 Delphi 10.4.2 Win32 VCL 应用程序 运行 上 Windows 10,在双显示器设置中,当我设置我的 MainForm(或任何其他辅助窗体)时通过设置 WindowState := wsMaximized
开始最大化,然后表单仅在主监视器上最大化。
如何将表单最大化到整个桌面,以将表单大小设置为包括两个显示器?是否有 TForm
class 的内置方法来实现此目的?
这不是 Windows 应用程序的标准行为。另请注意,由于桌面可以有多个不需要对齐的显示器,因此桌面可能不是矩形 - 这意味着桌面的边界矩形可能包含不可见的部分。
如果你想这样做你可以使用Windows函数GetDesktopWindow获取桌面window,然后获取它的大小,然后将窗体的大小设置为那个。
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;
这不允许任务栏或任何其他使用某些桌面的东西 space。
总的来说,这个问题并没有你想象的那么简单。我想您正在想象这样的桌面:
在这种情况下,我假设您希望 window 像这样放置:
但是,如果用户有这种布局怎么办:
你要吗
(整个 window 可见,但部分屏幕 space 未使用)或
(没有未使用的space,但window的某些部分不可见)?
如果您想使用完整的虚拟桌面space——最后一种情况——虽然很简单:
BoundsRect := Screen.DesktopRect;
这将在一个简单的设置中完成预期的事情,并且“没有未使用的 space,但 window 的某些部分可能不可见”一般来说。
另请注意,Windows 不喜欢 windows 这样的行为,因此用户可能无法获得良好的应用体验。
一般情况下,不要这样做。
请注意,即使是双显示器设置(其中两台显示器都是横向的)也可能很重要:
即使两个显示器的尺寸相同,几何形状也可能很重要:
根据 MSDN:
Positioning Objects on Multiple Display Monitors
A window or menu that is on more than one monitor causes visual disruption for a viewer. To minimize this problem, the system displays menus and new and maximized windows on one monitor.
因此,如果您希望 TForm
window 延伸到整个桌面,使用 WindowState=wsMaximize
不是正确的方法,因为它只适用于 single monitor 表单主要显示在其中。
要按照你的要求去做,你必须得到Virtual Screen from GetSystemMetrics()
(or Vcl.Forms.TScreen
)的矩形,然后设置Form的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;
在 Delphi 10.4.2 Win32 VCL 应用程序 运行 上 Windows 10,在双显示器设置中,当我设置我的 MainForm(或任何其他辅助窗体)时通过设置 WindowState := wsMaximized
开始最大化,然后表单仅在主监视器上最大化。
如何将表单最大化到整个桌面,以将表单大小设置为包括两个显示器?是否有 TForm
class 的内置方法来实现此目的?
这不是 Windows 应用程序的标准行为。另请注意,由于桌面可以有多个不需要对齐的显示器,因此桌面可能不是矩形 - 这意味着桌面的边界矩形可能包含不可见的部分。
如果你想这样做你可以使用Windows函数GetDesktopWindow获取桌面window,然后获取它的大小,然后将窗体的大小设置为那个。
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;
这不允许任务栏或任何其他使用某些桌面的东西 space。
总的来说,这个问题并没有你想象的那么简单。我想您正在想象这样的桌面:
在这种情况下,我假设您希望 window 像这样放置:
但是,如果用户有这种布局怎么办:
你要吗
(整个 window 可见,但部分屏幕 space 未使用)或
(没有未使用的space,但window的某些部分不可见)?
如果您想使用完整的虚拟桌面space——最后一种情况——虽然很简单:
BoundsRect := Screen.DesktopRect;
这将在一个简单的设置中完成预期的事情,并且“没有未使用的 space,但 window 的某些部分可能不可见”一般来说。
另请注意,Windows 不喜欢 windows 这样的行为,因此用户可能无法获得良好的应用体验。
一般情况下,不要这样做。
请注意,即使是双显示器设置(其中两台显示器都是横向的)也可能很重要:
即使两个显示器的尺寸相同,几何形状也可能很重要:
根据 MSDN:
Positioning Objects on Multiple Display Monitors
A window or menu that is on more than one monitor causes visual disruption for a viewer. To minimize this problem, the system displays menus and new and maximized windows on one monitor.
因此,如果您希望 TForm
window 延伸到整个桌面,使用 WindowState=wsMaximize
不是正确的方法,因为它只适用于 single monitor 表单主要显示在其中。
要按照你的要求去做,你必须得到Virtual Screen from GetSystemMetrics()
(or Vcl.Forms.TScreen
)的矩形,然后设置Form的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;