比桌面更大的窗口最大化
Posted
技术标签:
【中文标题】比桌面更大的窗口最大化【英文标题】:Maximized window larger than desktop 【发布时间】:2014-07-14 08:26:57 【问题描述】:在一台 XP 机器上,我的表单在最大化时比桌面大。这和Delphi有关还是XP中有些设置需要调整?
编辑; 如您所见,当边框图标就位时,大约 15% 的表单被截断,并且正是它们在表单最大化时应该在的位置。没有第二个监视器。
【问题讨论】:
请提供一些细节。请参阅this question 以获取有关问题如何提供信息的示例,以便其所问的内容一目了然。您可以在访问时决定这是否与那个重复。 我已经看到了这个问题,但它对我没有帮助。通常,windows 会根据屏幕自动调整最大化的窗口,这意味着 ClientWidth 和 ClientHeight 是自动的。Window 的客户区由分辨率决定。那么为什么窗体会跳出窗口的客户区呢? 我不知道。如果有人知道可用信息,我会感到惊讶。但这是你的选择...... @SertacAkyuz 我想知道为什么会发生这种情况,有没有办法纠正它。但是,您还需要什么其他信息? 我什至不知道您是否仅使用特定形式观察到这种行为。或者你正在观察的究竟是什么。系统是否有多个显示器并且您在其他显示器上看到客户区?或者只有一台显示器但缺少内容?窗户的尺寸是多少?应该是什么?总之,我们不是你,不能和你做同样的观察。我们只知道你说了什么。 【参考方案1】:这是因为在旧版本的 Windows(包括 XP)中,最大化的窗口已经足够大,以至于窗口边框不可见。窗口边框没有被移除,只是窗口比屏幕稍微大了一点,然后在屏幕上居中,所以边框是不可见的。
如果您有多个显示器,您可以看到这一点:根据您的 Windows 版本,如果您在一个屏幕上最大化一个窗口,您可能会看到窗口的边缘出现在另一个显示器的一侧。
这不是错误,也不是通过 Windows 设置或 Delphi 解决的问题。
这在 Vista 中已在视觉上得到解决:边框仍然存在(并且窗口大小可能会报告与屏幕大小不同的大小)但未绘制悬垂边框。
您可以在Raymond Chen's blog post about the topic 上阅读更多内容。
【讨论】:
@DavidHeffernan 我希望他/她昨天发布了所有这些信息。我为错误的问题写了一个漂亮的正确答案;) @DavidM - “所有信息” ?我猜你在开玩笑。无论如何,如果你碰巧读到了问题的前两个 cmets,那么你就会知道提问者不认为这是解决方案。 @SertacAkyuz 好吧,没有太多额外的信息;)但足以使问题不是什么更清楚,即使没有足够的信息来知道问题是什么。当我发布这篇文章时,我想我没有读过那些 cmets - 它们甚至可能还不存在。 @DavidM - 他们做到了,但没关系,您不必阅读 cmets。我想很多人不读它们。【参考方案2】:很可能您的最终用户正在使用其中一种用于扩展桌面空间的软件。如果某些监视器和任何应用程序窗口总是根据工作区边界调整大小,这些程序的作用是扩展工作区大小。
我建议您尝试在最终用户计算机上运行此代码,以获取有关其屏幕大小、工作区大小、他使用多少个屏幕等的更多信息。
procedure CheckScreenInfo;
var I: Integer;
begin
Memo1.Lines.Clear;
Memo1.Lines.Add('Monitor count:'+IntToStr(Screen.MonitorCount));
Memo1.Lines.Add('Form is on monitor:'+IntToStr(Form4.Monitor.MonitorNum));
Memo1.Lines.Add('Desktop left:'+IntToStr(Screen.DesktopLeft));
Memo1.Lines.Add('Desktop top:'+IntToStr(Screen.DesktopTop));
Memo1.Lines.Add('Desktop width:'+IntToStr(Screen.DesktopWidth));
Memo1.Lines.Add('Desktop height:'+IntToStr(Screen.DesktopHeight));
Memo1.Lines.Add('Screen width:'+IntToStr(Screen.Width));
Memo1.Lines.Add('Screen height:'+IntToStr(Screen.Height));
Memo1.Lines.Add('Work area left:'+IntToStr(Screen.WorkAreaLeft));
Memo1.Lines.Add('Work area top:'+IntToStr(Screen.WorkAreaTop));
Memo1.Lines.Add('Work area width:'+IntToStr(Screen.WorkAreaWidth));
Memo1.Lines.Add('Work area height:'+IntToStr(Screen.WorkAreaHeight));
for I := 0 to Screen.MonitorCount -1 do
begin
Memo1.Lines.Add('#####-Monitor '+IntToStr(Screen.Monitors[I].MonitorNum)+'-#####');
Memo1.Lines.Add('Monitor left:'+IntToStr(Screen.Monitors[I].Left));
Memo1.Lines.Add('Monitor top:'+IntToStr(Screen.Monitors[I].Top));
Memo1.Lines.Add('Monitor width:'+IntToStr(Screen.Monitors[I].Width));
Memo1.Lines.Add('Monitor height:'+IntToStr(Screen.Monitors[I].Height));
Memo1.Lines.Add('Monitor workarea top:'+IntToStr(Screen.Monitors[I].WorkareaRect.Top));
Memo1.Lines.Add('Monitor workarea left:'+IntToStr(Screen.Monitors[I].WorkareaRect.Left));
Memo1.Lines.Add('Monitor workarea width:'+IntToStr(Screen.Monitors[I].WorkareaRect.Width));
Memo1.Lines.Add('Monitor workarea height:'+IntToStr(Screen.Monitors[I].WorkareaRect.Height));
Memo1.Lines.Add('Monitor bounds top:'+IntToStr(Screen.Monitors[I].BoundsRect.Top));
Memo1.Lines.Add('Monitor bounds left:'+IntToStr(Screen.Monitors[I].BoundsRect.Left));
Memo1.Lines.Add('Monitor bounds width:'+IntToStr(Screen.Monitors[I].BoundsRect.Width));
Memo1.Lines.Add('Monitor bounds height:'+IntToStr(Screen.Monitors[I].BoundsRect.Height));
end;
end;
【讨论】:
【参考方案3】:您确定屏幕偏移/尺寸正确吗?边缘可能在桌面区域之外,但并不明显。尝试进入显示器校准菜单并验证左上角/右下角偏移。
也可以将屏幕尺寸设置为大于屏幕可以处理的尺寸。
在桌面上移动时屏幕会滚动吗?
如果是这样,我认为这就是问题所在,在这种情况下,您需要调整屏幕分辨率或桌面设置。
不过,我的赌注是第一个解决方案。
【讨论】:
这是我目前无法访问的网络上的一台 PC。他们刚刚给我发送了打印屏幕。底部工具栏似乎就位,因此桌面区域设置正确。 我真的不知道你怎么能写出这个问题的答案以上是关于比桌面更大的窗口最大化的主要内容,如果未能解决你的问题,请参考以下文章