我想根据屏幕及其分辨率更改表单大小。
我想要的是一个正确的事件来跟踪这些屏幕变化以及运行时的屏幕分辨率变化。
换句话说,
如果用户正在使用两个屏幕并将应用程序移动到另一个屏幕,则应对其进行跟踪并相应地更改尺寸,即如果新屏幕的分辨率较低则减小尺寸,或者如果分辨率较大则增大尺寸。
还可以跟踪同一屏幕上的屏幕分辨率变化,并相应地更改尺寸。
我知道如何更改表单大小、获取当前屏幕及其分辨率,只需要这些事件来跟踪这些更改。
回顾这个答案,我决定改进它并添加更多信息以形成更完整的解决方案。
挑战
跟踪当前正在呈现表单的屏幕。如果用户将表单拖到另一个监视器或拔下监视器,这可能会改变。如果用户手动将窗口拖动到不同的显示器或直接更改分辨率,则分辨率可能会更改。
首先,跟踪表单位置。我们需要为表单上下文挂钩一个 Move 事件,幸运的是 .Net 框架提供了这样一个事件,它被命名为Control.Move Event。
其次,我们需要挂钩屏幕分辨率更改事件,我们可以使用SystemEvents.DisplaySettingsChanged事件来实现。
把它放在一起,我得到了这个:
struct Resolution
{
public int Width;
public int Height;
}
int previous = -1;
int current = -1;
private bool CheckScreenChanged()
{
bool changed = false;
current = GetScreenIndex();
if (current != -1 && previous != -1 && current != previous) // form changed screen.
{
changed = true;
}
previous = current;
return changed;
}
private int GetScreenIndex()
{
return Array.IndexOf(Screen.AllScreens, Screen.FromControl(this));
}
private Resolution GetCurrentResolution()
{
Screen screen = Screen.FromControl(this);
Resolution res = new Resolution();
res.Width = screen.Bounds.Width;
res.Height = screen.Bounds.Height;
return res;
}
private void SetResolutionLabel()
{
Resolution res = GetCurrentResolution();
label2.Text = String.Format("Width: {0}, Height: {1}", res.Width, res.Height);
}
private void ScreenChanged()
{
label1.Text = "Screen " + current.ToString();
}
private void Form_Moved(object sender, System.EventArgs e)
{
bool changed = CheckScreenChanged();
if (changed == true)
{
ScreenChanged();
SetResolutionLabel();
}
}
public void SystemEvents_DisplaySettingsChanged(object sender, EventArgs e)
{
SetResolutionLabel();
}
public void Initialize()
{
this.Move += Form_Moved;
SystemEvents.DisplaySettingsChanged += new
EventHandler(SystemEvents_DisplaySettingsChanged);
previous = GetScreenIndex();
current = GetScreenIndex();
ScreenChanged();
SetResolutionLabel();
}
上面的代码是在一个简单的表单上测试的,它有两个标签 label1 和 label2,当表单所在的屏幕发生变化或分辨率发生变化时,它们会更新。
在我的主屏幕/显示器上运行此图像
当表单被拖到它时,在我的辅助屏幕/显示器上: