在多监视器系统上,“空白”VCL应用程序可以最大限度地提高精度,但是启用样式(默认情况下选择一个)的相同应用程序最大化不正确。我看到的是窗口的右边缘延伸到第二个监视器上(我的主要位于左侧)。当我开始与其他Windows应用程序进行比较时,我注意到在Windows 7(至少)下,最大化的窗口甚至在左边,右边和底部都没有非客户端边框。实际上,标准VCL(非风格)应用程序的行为方式相同,没有非客户端边界。
我该如何解决?我注意到TFormStyleHook有一个WMNCCalcSize的处理程序,我还没有解剖,但让我想知道VCL是否可能错误地处理这个消息最大化的窗口。
解决方法
经过一段时间的磨合之后,我的观点是,这不是一个vcl风格的bug。这其实与
mghie
mghie提到的
article年度的行为有关。
具体的行为是,最大化窗口的大小大于窗口最大化的监视器的工作区域。据说,窗口管理员隐藏了悬垂边界。显然,它并不完全用定制框架。请注意,MSDN自己的custom window frame example似乎也遇到同样的问题(参考社区内容中标题为“窗口最大化时的错误”)的帖子)。 VCL的应用程序与MSDN的示例不同,因为它不是基于DWM,但我仍然认为这是同一个问题。
突出边界具有系统大小边界的大小(SM_C [X | Y] SIzefRAME),但这与下面的解决方法无关,因为它忽略了操作系统建议的大小/位置并使用了工作区。
不幸的是,我不认为这种解决方法是可用的。一方面,上述行为没有记录,二是解决办法不完善;还有一个奇怪的像素出来。如果您将窗口完全按在工作区域上,则窗口管理器决定将窗口偏移到它认为应该放置窗口(隐藏框架)的位置。 (VCL可能被修改为做窗口管理器所做的工作,并考虑到悬而未决,并不绘制它们或类似的东西,但这将是更多的工作,而且仍然是解决方法的无证行为..)
无论如何;
type TForm1 = class(TForm) .. protected // overriding styles is not necessary since TFormStyleHook.WMGetMinMaxInfo // first calls the default window procedure procedure WMGetMinMaxInfo(var Message: TWMGetMinMaxInfo); message WM_GETMINMAXINFO; .. procedure TForm1.WMGetMinMaxInfo(var Message: TWMGetMinMaxInfo); var R: TRect; begin // always arrives with MinMaxInfo.ptMaxPosition = (-SM_CXFRAME,-SM_CYFRAME) // and MinMaxInfo.ptMaxSize = (PrimaryMonitor.Width (?) + 2 * SM_CXFRAME,... ) inherited; // should test for OS,styles etc. before running the below R := Monitor.WorkareaRect; InflateRect(R,-1,-1); // odd pixel OffsetRect(R,-Monitor.Left,-Monitor.Top); Message.MinMaxInfo.ptMaxPosition := R.TopLeft; Message.MinMaxInfo.ptMaxSize := Point(R.Width,R.Height); end;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。