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 回答