【发布时间】:2020-09-22 12:39:40
【问题描述】:
我正在开发一个简单的 Windows 应用程序(在 C# 中),我希望它显示一个在我的第二个监视器中最大化的表单。为此,我对表单的“加载”事件执行以下操作:
private void FormTest_Load(object sender, EventArgs e)
{
Screen[] screens = Screen.AllScreens;
this.WindowState = FormWindowState.Normal;
this.Location = screens[1].WorkingArea.Location;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
}
我遇到的问题是,当我执行此操作时,表单只占据屏幕的一部分。我的主屏幕的分辨率为 1024x768,我的辅助屏幕的分辨率为 1920x1080,并且似乎表单正在占用我的辅助屏幕中的主屏幕的大小。
另外,我有一个按钮,可以运行以下代码来最大化屏幕或使其恢复正常:
private void ChangeSize() {
if (this.WindowState == System.Windows.Forms.FormWindowState.Maximized)
{
this.WindowState = System.Windows.Forms.FormWindowState.Normal;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable;
}
else
{
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
}
}
当我单击按钮两次(首先取消最大化表单,然后再次最大化它)时,表单确实完美地覆盖了整个辅助屏幕,但是如果我尝试在代码中运行该函数两次(对于为了测试)在“FormTest_Load”中的代码之后,屏幕仍然无法正确覆盖整个屏幕。
我可能在这里犯了一个菜鸟错误,但我已经为此苦苦挣扎了一段时间,所以如果有人能阐明我的代码有什么问题,我将不胜感激。
【问题讨论】:
-
Load 事件为时已晚,此时 Winforms 已经处理了 WM_GETMINMAXINFO 消息。将代码移到构造函数中。
-
...或者,如果您在其他地方执行此操作,请先设置
Location,然后设置BorderStyle,然后设置WindowState,然后设置Refresh()(如果您正在绘制自定义你会注意到边框)。如果你制作你的应用程序 DpiAware 也会更好,因为否则你可能会得到错误(调整)的措施。 -
锚定在 ClientArea 中间的控件可能会调整到不成比例的边界。
-
谢谢你们的想法,但不幸的是我仍然遇到同样的问题。
标签: c# winforms multiple-monitors maximize