跟踪Windows窗体应用程序中的屏幕更改和屏幕分辨率更改以更改表单大小

时间:2013-07-22 13:55:18

标签: c# winforms screen

我想根据屏幕及其分辨率更改表单大小。

我想要的是跟踪这些屏幕更改以及运行时屏幕分辨率更改的正确事件。

换句话说,

  1. 如果用户使用两个屏幕并将应用程序移动到另一个屏幕,则应该跟踪并相应地更改大小,即如果新屏幕的分辨率较低则减小尺寸,或者如果分辨率较大则增大尺寸。

    < / LI>
  2. 同时在同一屏幕上跟踪屏幕分辨率变化,并相应地更改尺寸。

  3. 我知道如何更改表单大小,获取当前屏幕及其分辨率,只需要这些事件来跟踪这些更改。

1 个答案:

答案 0 :(得分:7)

回答这个问题,我决定对其进行改进并添加更多信息,以形成更完整的解决方案。

挑战

跟踪当前正在呈现表单的屏幕。如果用户将表单拖动到另一台显示器或拔下显示器,则可能会发生这种情况。如果用户手动将窗口拖动到其他显示器或直接更改分辨率,则分辨率可能会发生变化。

首先,跟踪表单位置。我们需要挂钩表单上下文的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的标签,当表单处于更改状态或分辨率发生变化时,这些标签会更新。

我的主屏幕/显示屏上的此图片

Screen0

当表单被拖动到我的辅助屏幕/显示器上时:

enter image description here