为什么最大化的Delphiforms比GetSystemMetrics值宽8个像素?

如果我最大化一个delphi窗体的宽度和高度值是8个像素,相应的GetSystemMetrics SM_CXSCREEN和SM_CYSCREEN?

例如:

当我右键单击我的屏幕,并获得属性我有一个1680 X 1050屏幕分辨率。 这些是从GetSystemMetrics(SM_CXSCREEN)和GetSystemMetrics(SM_CYSCREEN)返回的相同值。

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

当最大化窗口最初实现时,设计师想要移除调整边界。 他们不是将它们移除,而是决定将这些边界画在屏幕边缘以外的地方,以防止它们被看到。 因此,一个最大化窗口的相当惊人的窗口矩形。

这个实施决策成为多监视器系统出现的问题。 到那个时候,有些应用程序依赖于这种行为,所以Windows团队为了兼容性决定保留行为。 这意味着最大化的窗户泄漏到相邻的屏幕上。 窗口管理者及时获得了能够抑制这种泄漏的能力。

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

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

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

我的屏幕分辨率是1440×900。

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