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

时间:2013-02-02 23:12:31

标签: windows delphi winapi

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

例如:

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

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

2 个答案:

答案 0 :(得分:21)

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

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

像往常一样,

Raymond Chen有一篇文章涵盖了详细信息:Why does a maximized window have the wrong window rectangle?

答案 1 :(得分: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在最大化之后以这种方式定位窗口,客户区覆盖了最多的可用空间,窗口的chrome隐藏在屏幕区域之外。