delphi – 我能做什么关于最大化,风格的窗口,显示在邻近显示器上的边界?

在多监视器系统上,“空白”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;

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...