我希望根据屏幕和分辨率的大小来改变表单的大小。
我需要正确的事件来跟踪这些屏幕更改以及运行时的屏幕分辨率更改。
换句话说,
如果用户正在使用两个屏幕并将应用程序移动到另一个屏幕,则应跟踪该操作并相应地更改大小,即如果新屏幕的分辨率较低,则减小大小,如果分辨率较大,则增加大小。
还要跟踪同一屏幕上的屏幕分辨率更改,并相应地更改大小。
我知道如何更改表单大小,获取当前屏幕及其分辨率,只需要这些事件来跟踪这些更改。
我希望根据屏幕和分辨率的大小来改变表单的大小。
我需要正确的事件来跟踪这些屏幕更改以及运行时的屏幕分辨率更改。
换句话说,
如果用户正在使用两个屏幕并将应用程序移动到另一个屏幕,则应跟踪该操作并相应地更改大小,即如果新屏幕的分辨率较低,则减小大小,如果分辨率较大,则增加大小。
还要跟踪同一屏幕上的屏幕分辨率更改,并相应地更改大小。
我知道如何更改表单大小,获取当前屏幕及其分辨率,只需要这些事件来跟踪这些更改。
在审阅此答案后,我决定完善并添加更多信息以形成更完整的解决方案。
挑战
追踪一个表单当前所呈现的屏幕。如果用户将表单拖到另一台监视器上或拔出监视器,则会发生变化。如果用户手动将窗口拖到不同的显示器上或直接更改分辨率,则分辨率可能会更改。
首先,需要跟踪表单的位置。我们需要钩入表单上下文中的移动事件,幸运的是,.Net框架提供了这样的事件,它被命名为Control.Move事件。
其次,我们需要钩入屏幕分辨率更改事件,可以使用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,在屏幕大小或分辨率发生变化时更新这些标签。
以下是代码在我的主屏幕/显示器上运行的截图:
当表单被拖到我的次要屏幕/显示器上时,如下所示: