为什么最大化的 Delphi 表单比GetSystemMetrics值宽8个像素,高8个像素?

oyjwcjzk  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(134)

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

例如:

当我右击屏幕并获取属性时,我的屏幕分辨率为1680 X 1050。这些值与GetSystemMetrics(SM_CXSCREEN)和GetSystemMetrics(SM_CYSCREEN)返回的值相同。
当我在 Delphi 应用程序中最大化窗体时,得到的宽度为1688,高度为1058。存在8个像素的差异。是什么导致了这种差异?

bqucvtff

bqucvtff1#

当最大化窗口最初被实现时,设计者希望移除调整大小的边框。他们没有移除它们,而是决定将这些边框绘制在屏幕边缘之外,在那里它们不会被看到。因此,最大化窗口的窗口矩形相当令人惊讶。
随着多显示器系统的出现,这个实施决策成为了一个问题。当时,有一些应用程序依赖于这种行为,因此Windows团队决定保留这种行为以保持兼容性。这意味着最大化的窗口会泄漏到相邻的屏幕上。随着时间的推移,窗口管理器获得了一些功能,这意味着它可以抑制泄漏。
和往常一样,Raymond Chen有一篇文章介绍了详细信息:Why does a maximized window have the wrong window rectangle?

vxqlmq5t

vxqlmq5t2#

我写了一个简单的程序,它捕捉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在最大化后以这样的方式定位窗口,即客户端区域覆盖了最多的可用空间,而窗口的镶边隐藏在屏幕区域之外。

相关问题