gpt4 book ai didi

delphi - 对于在相邻显示器上显示边框的最大化、样式化的窗口,我该怎么办?

转载 作者:行者123 更新时间:2023-12-03 14:34:14 26 4
gpt4 key购买 nike

在多显示器系统上,“空白”VCL 应用程序可以正常最大化,但启用样式(并选择一个默认样式)的同一应用程序不能正确最大化。我看到的是窗口的右侧边缘延伸到第二个显示器(我的主显示器在左侧)。当我开始与其他 Windows 应用程序进行比较时,我注意到在 Windows 7 下(至少),最大化的窗口在左侧、右侧或底部甚至没有非客户端边框。事实上,标准 VCL(无样式)应用程序的行为方式相同,没有非客户端边界。

我该如何解决这个问题?我注意到 TFormStyleHook 有一个 WMNCCalcSize 处理程序,我还没有剖析它,但让我想知道 VCL 是否可能错误地处理最大化窗口的此消息。

最佳答案

经过一段时间的研究,我的看法是,这根本不是 vcl 样式的错误。这确实与article中的行为有关。 comment中提到回答mghie的问题.

具体行为是,最大化窗口的大小大于窗口最大化所在的监视器的工作区域。据推测,窗口管理器隐藏了悬垂边框。显然,对于定制框架来说,它并不能完全做到这一点。注意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 - 对于在相邻显示器上显示边框的最大化、样式化的窗口,我该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10936906/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com