2

デスクトップ アプリケーションとして使用している Windows フォームがあります。フォームをドラッグしたときに、フォームがデスクトップの境界線からはみ出さないようにしたいと考えています。ウィンドウ全体が消えないことはわかっていますが、四隅すべてを表示したいです。「境界線スタイル=固定ツールウィンドウ」に設定し、プログラムでフォームを移動するようにコーディングしました。

したがって、これの代わりに:

----------------------
! !
! ---------------
! ! !
! ! !
! ---------------
! !
----------------------

これ欲しい:

------------------------
! !
! -------------!
! ! !!
! ! !!
! -------------!
! !
------------------------
4

3 に答える 3

3

イベントを使用してLocationChanged、これをプライマリ モニターと比較Screen.AllScreens[0].Boundsできます。複数のモニターがある場合は、インデックスを変更して、フォームを制限する画面を選択できます。

private void Form1_LocationChanged(object sender, EventArgs e)
{
    if ((this.Left + this.Width) > Screen.AllScreens[0].Bounds.Width)
        this.Left = Screen.AllScreens[0].Bounds.Width - this.Width;

    if (this.Left  < Screen.AllScreens[0].Bounds.Left)
        this.Left = Screen.AllScreens[0].Bounds.Left;

    if ((this.Top + this.Height) > Screen.AllScreens[0].Bounds.Height)
        this.Top = Screen.AllScreens[0].Bounds.Height - this.Height;

    if (this.Top < Screen.AllScreens[0].Bounds.Top)
        this.Top = Screen.AllScreens[0].Bounds.Top;
}
于 2012-08-22T13:59:03.150 に答える
2

フォームの境界をSytemInformation.VirtualScreenと比較します。

例:

    private void Form1_Move(object sender, EventArgs e)
    {
        KeepBounds();
    }

    private void KeepBounds()
    {
        if (this.Left < SystemInformation.VirtualScreen.Left)
            this.Left = SystemInformation.VirtualScreen.Left;

        if (this.Right > SystemInformation.VirtualScreen.Right)
            this.Left = SystemInformation.VirtualScreen.Right - this.Width;

        if (this.Top < SystemInformation.VirtualScreen.Top)
            this.Top = SystemInformation.VirtualScreen.Top;

        if (this.Bottom > SystemInformation.VirtualScreen.Bottom)
            this.Top = SystemInformation.VirtualScreen.Bottom - this.Height;
    }

これにより、フォームの「四隅」が画面に表示されます

于 2012-08-22T13:55:15.950 に答える
0

私が質問をよく理解していれば。

ウィンドウ(winforms MainForm)が画面から離れないようにしたいですか?この場合、フォームの移動イベント内でこれを処理できません。移動中に、Top en Leftプロパティをチェックして、それらが負になった場合はメソッドを返します。また、フォームの大きさと解像度がわかっている場合は、右下を計算できます。

private void Move(object sender, EventArgs e)
    {
        var f = sender as Form;

        var l = f.Left;
        var t = f.Top;

        var h = f.Height;
        var w = f.Width;
        var sh = Screen.GetWorkingArea(this).Height;
        var sw = Screen.GetWorkingArea(this).Width;
        if(t<0 || t+h > sh) return;
        if (l < 0 || l+w > sw) return;
    }

このようなもの。未検証。

于 2012-08-22T13:39:24.877 に答える