1

各ウィンドウの最後の位置を保存しています。

次にユーザーがウィンドウを開くと、最後の位置が復元されます。

ユーザーが画面を (2 画面から 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

ゼロから始めましょう。ウィンドウの状態を保存するには、2 つの設定が必要です。それらを 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 に答える