1

我正在存储每个窗口的最后一个位置。

下次用户打开窗口时,将恢复上次的位置。

如果用户改变他的屏幕(从双屏到一个屏幕)或只是到一个更小的分辨率,窗体无处可见......

我怎样才能检测到这个?我不喜欢存储用户设置,这取决于他的环境。

提前致谢

4

2 回答 2

1

使用System.Windows.Forms.Screen.PrimaryScreenBounds中的属性查看屏幕的边界,将其与表单的位置/大小进行比较,并在需要的地方进行补偿。

要获取其他屏幕的边界,请使用该Screen.AllScreens属性上的PrimaryScreen属性来访问Screen表示多个屏幕的其他对象。

例如,这可能就像检查Location您要更改为的 是否在可用屏幕上一样简单:

foreach (var screen in Screen.AllScreens)
{
    if (screen.Bounds.Contains(this.Location))
    {
        return; // on a screen, so don't update location
    }
}
// not found on a screen, so assume screen was removed and move to the primary screen
this.Location = Screen.PrimaryScreen.Bounds.Location;

当然,您可以通过决定哪个屏幕比其他任何屏幕包含更多的表单(基于Bounds)来使这变得更复杂,并以这种方式做出决定;但是,如果没有更多关于您想要什么的详细信息,我无法提出具体建议。

于 2012-09-22T20:45:16.070 回答
1

让我们从头开始,你想要两个设置来存储窗口的状态。我们称它们为 Location(类型 Point,默认 = 0,0)和 Size(类型 Size,默认 = 0, 0)。您希望在调整窗口大小时保存它们,避免在窗口最小化时存储状态:

    protected override void OnResizeEnd(EventArgs e) {
        if (this.WindowState != FormWindowState.Minimized) {
            Properties.Settings.Default.Location = this.Location;
            Properties.Settings.Default.Size = this.Size;
            Properties.Settings.Default.Save();
        }
        base.OnResizeEnd(e);
    }

恢复表单的 OnLoad 方法中的状态。您需要使用 Screen.FromPoint() 来查找屏幕边界。添加额外的代码以确保窗口不会变得太大并在屏幕消失时正确定位:

    protected override void OnLoad(EventArgs e) {
        if (Properties.Settings.Default.Size != Size.Empty) {
            Screen scr = Screen.FromPoint(Properties.Settings.Default.Location);
            int width = Math.Min(Properties.Settings.Default.Size.Width, scr.WorkingArea.Width);
            int height = Math.Min(Properties.Settings.Default.Size.Height, scr.WorkingArea.Height);
            this.Size = new Size(width, height);
            if (scr.WorkingArea.Contains(Properties.Settings.Default.Location))
                this.Location = Properties.Settings.Default.Location;
            else this.Location = new Point(scr.Bounds.Left + (scr.Bounds.Width - width) / 2, 
                                           scr.Bounds.Top + (scr.Bounds.Height - height) / 2);
        }
        base.OnLoad(e);
    }
于 2012-09-23T13:49:59.443 回答