
[英]How to make a form float in a workarea as it is the screen (move, size, maximize, minimize)?
[英]How to maximize form to desktop size?
在 Windows 10 上运行的 Delphi 10.4.2 Win32 VCL 应用程序中,在双显示器设置中,当我通过设置WindowState := wsMaximized
将 MainForm(或任何其他辅助窗体)设置为开始最大化时,窗体仅在主监视器。
如何将表单最大化到整个桌面,以将表单大小设置为包括两个监视器? 是否有TForm
类的内置方法来实现这一点?
一般来说,这个问题并不像你想象的那么简单。 我想你正在想象这样的桌面:
在这种情况下,我假设您希望窗口像这样放置:
但是,如果用户有这个布局怎么办:
你想要
(整个窗口可见,但一些屏幕空间未使用)或
(没有未使用的空间,但窗口的某些部分不可见)?
如果你想使用完整的虚拟桌面空间——最后一种情况——虽然很容易:
BoundsRect := Screen.DesktopRect;
这将在一个简单的设置中完成预期的事情,并且一般来说“没有未使用的空间,但窗口的某些部分可能不可见”。
另请注意,Windows 不喜欢这样的窗口行为,因此用户在使用该应用程序时可能无法获得良好的体验。
一般来说,不要这样做。
请注意,即使是两台显示器都是横向的双显示器设置,也可能很重要:
即使两个显示器的尺寸相同,几何形状也可能不重要:
每 MSDN:
位于多个监视器上的窗口或菜单会导致观看者的视觉中断。 为尽量减少此问题,系统会在一台显示器上显示菜单以及新窗口和最大化窗口。
因此,如果您希望TForm
窗口横跨整个桌面,使用WindowState=wsMaximize
不是WindowState=wsMaximize
的方法,因为它只能在主要显示 Form 的单个监视器上工作。
要执行您的要求,您必须从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;
这不允许任务栏或其他任何使用某些桌面空间的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.