我该如何解决?我注意到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;总结
以上是内存溢出为你收集整理的delphi – 我能做什么关于最大化,风格的窗口,显示在邻近显示器上的边界?全部内容,希望文章能够帮你解决delphi – 我能做什么关于最大化,风格的窗口,显示在邻近显示器上的边界?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)