最大化的 MFC 对话框大于监视器

Posted

技术标签:

【中文标题】最大化的 MFC 对话框大于监视器【英文标题】:MFC dialog maximized is larger than monitor 【发布时间】:2015-03-18 19:38:23 【问题描述】:

在 WIndows 7 中,当我使用系统菜单的小方形按钮最大化 MFC 对话框时,生成的对话框窗口比屏幕的物理尺寸略大。这是为什么呢?

GetSystemMetrics 调用产生正确的显示器尺寸,屏幕分辨率(右键单击桌面)也显示正确的尺寸。

在窗口最大化后发送的 WM_SIZE 消息显示的大小比监视器稍大,与被切断的对话框的边缘部分一致。例如,在 1920 x 1080 显示器上,来自 OnSize() 的最大尺寸为 1936 x 1096。Spy++ 显示

矩形:(-1928, -8) - (8, 1088), 1936 x 1096(最大化)

恢复的矩形:(-1188, 79) - (173, 849) 1015 x 770

客户端矩形:(8, 50) - (1928, 1088) 1920 x 1038

(对话框位于 2 显示器系统的左侧显示器上)。

我需要了解“最大化窗口”的确切定义,因为我正在重新排列单显示器和多显示器系统上的一些对话框窗口,以响应用户更改窗口大小和/或位置。

谁能解释我为什么看到我描述的结果,以及我如何设置一个对话框,以便系统菜单的“最大化”按钮不会导致对话框超出显示器的物理边界?

MFC、64 位 Windows 7 专业版、Visual Studio 2013、C++

【问题讨论】:

您是否有任何第三方多显示器软件正在运行? 【参考方案1】:

当您最大化窗口时,非客户端边框区域会移到监视器之外。可以看到客户区等于显示器大小减去标题栏大小。

附:无法修改此行为,Windows 本身负责最大化时的窗口尺寸。您也许可以修改窗口以关闭 WM_SIZE 或其他东西的边框,但您会丢失标题栏。

【讨论】:

这是正确的,但不是全部。在 2 显示器系统上,您希望在相邻显示器上看到 8 像素边框,但它不可见。 @Woody20 显然这些边框根本没有画。只是猜测,当窗口最大化时,会设置一个覆盖监视器的剪辑区域。 @Woody20 我几乎不知道 2 周前的最终权威已经涵盖了这个主题:blogs.msdn.com/b/oldnewthing/archive/2015/03/04/10597470.aspx

以上是关于最大化的 MFC 对话框大于监视器的主要内容,如果未能解决你的问题,请参考以下文章

MFC实现对话框最大化时控件的集体跟踪

MFC 对话框编辑器中的最小化/最大化框灰显

建立一个MFC对话框程序,运行时使对话框最大化显示(即全屏显示)该如何设置?

MFC 对话框最小化与还原

MFC设置对话框定时显示60秒,然后自动弹出另外一个对话框。怎么给对话框添加最大化最小化按钮。

MFC小知识一:将对话框设置为无边框无标题栏初始最大化样式