9

如果我最大化 Delphi 表单的宽度和高度值是否比相应的 GetSystemMetrics SM_CXSCREEN 和 SM_CYSCREEN 大 8 个像素?

例如:

当我右键单击我的屏幕并获取属性时,我的屏幕分辨率为 1680 X 1050。这些与 GetSystemMetrics(SM_CXSCREEN) 和 GetSystemMetrics(SM_CYSCREEN) 返回的值相同。

当我在我的 Delphi 应用程序中最大化表单时,我得到 1688 的宽度和 1058 的高度。有 8 个像素的差异。是什么导致了这种差异?

4

2 回答 2

21

最初实现最大化窗口时,设计人员希望删除调整大小的边框。他们没有删除它们,而是决定将这些边框绘制到屏幕边缘之外,在那里它们不会被看到。因此,最大化窗口的相当令人惊讶的窗口矩形。

随着多显示器系统的出现,这种实施决策成为一个问题。到那时,有一些应用程序依赖于这种行为,因此 Windows 团队决定为了兼容性而保留这种行为。这意味着最大化的窗口会泄漏到相邻的屏幕上。随着时间的推移,窗口管理器获得了能够抑制这种泄漏的能力。

Raymond Chen和往常一样,有一篇文章涵盖了细节:为什么最大化的窗口有错误的窗口矩形?

于 2013-02-02T23:19:32.000 回答
2

我写了一个简单的程序,它可以捕获WM_GETMINMAXINFO。此消息允许在实际最大化发生之前修改最大化窗口的位置和大小。系统提供的默认值为:

Position.x: -8
Position.y: -8
Size.x: 1456 (= 8 + width of screen + 8)
Size.y: 916 (= 8 + height of screen + 8)

我的屏幕分辨率是 1440x900。

看起来,Windows 在最大化之后以这样的方式定位窗口,即客户区覆盖了最多的可用空间,并且窗口的镶边隐藏在屏幕区域之外。

于 2013-02-02T23:23:19.057 回答