Winform ClientSize exceeds screen dimensions after Maximize w/ no border
我正在使用此代码在正常的 WindowState(具有相当大的边框样式)和最大化(具有无边框样式)之间切换。
1
2 3 4 5 6 7 8 9 10 |
if (WindowState != FormWindowState.Maximized)
{ WindowState = FormWindowState.Maximized; FormBorderStyle = FormBorderStyle.None; } else { WindowState = FormWindowState.Normal; FormBorderStyle = FormBorderStyle.Sizable; } |
更改后我也在动态调整表单上一些控件的布局。我发现 ClientSize.Width 和 ClientSize.Height 值超过了最大化/无边框状态下的实际监视器分辨率(客户端大小:1936×1216,实际监视器分辨率:1920×1200)。这会导致某些控件超出范围。
是否有一种简单的方法可以确保表单不超过屏幕限制(除了手动检查屏幕大小并强制表单达到该大小)?
- 这完全正常,允许的最大窗口大小是显示器大小加上边框。这确保了当您最大化窗口时,您只能看到客户区而不是边框??。因此,当您删除边框时,您现在不可避免地会得到一个太大的客户区。只需删除此代码,没有必要。如果你想重叠用户任务栏,一个属于问题的细节,那么你必须处理 WM_GETMINMAXINFO 消息。
- 感谢您的反馈。我对任务栏没有任何问题。我发现首先关闭边框会导致所需的行为。
- 那么这段代码就没有意义了。请务必将其删除,更改 FormBorderStyle 可能会产生很多不良副作用。正如你所发现的。
- 我不明白这段代码没有意义的评论。这部分代码是在特定条件下调用的方法中,并且正在执行我需要的操作(在正常、相当大的视图和全屏之间切换应用程序)。也许有更好的方法来做到这一点,但只是删除此代码会阻止应用程序正确响应。
事实证明,通过颠倒最大化和边框样式更改操作的顺序可以解决。如果在最大化屏幕之前关闭边框,则表单 ClientSize 值将与监视器大小完全匹配。
工作代码:
1
2 3 4 5 |
if (WindowState != FormWindowState.Maximized)
{ FormBorderStyle = FormBorderStyle.None; WindowState = FormWindowState.Maximized; } |
来源:https://www.codenong.com/42276258/