繁体   English   中英

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

[英]Keep track of screen change and screen resolution change in Windows Form Application to change form size

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

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

换一种说法,

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

  2. 还可以在同一屏幕上跟踪屏幕分辨率更改,并相应地更改大小。

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

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

挑战

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

首先,跟踪表单位置。 我们需要挂钩表单上下文的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

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

在此输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM