1

默认情况下,我使用 FormBorderStyle = FixedToolWindow 创建了一个简单的测试表单,并添加了一个按钮,该按钮将在按下鼠标时在 FixedToolWindow 和 SizableToolWindow 之间切换。

在这两者之间切换 FormBorderStyle 似乎会产生一种奇怪的效果,导致我的应用程序出现很多问题。问题是窗口似乎改变了大小,我不能。我只想更改边框,我需要表单大小保持不变。

例如,这是按钮代码:

private void button1_Click(object sender, System.EventArgs e) {
    if(FormBorderStyle == FormBorderStyle.FixedToolWindow) {
        System.Diagnostics.Debug.WriteLine("SWITCHING: FIXED -> SIZABLE");
        FormBorderStyle = FormBorderStyle.SizableToolWindow;
    } else {
        System.Diagnostics.Debug.WriteLine("SWITCHING: SIZABLE -> FIXED");
        FormBorderStyle = FormBorderStyle.FixedToolWindow;
    }
}

并调试我使用这个:

private void Settings_SizeChanged(object sender, System.EventArgs e) {
    System.Diagnostics.Debug.WriteLine(this.Size);
}

这是我按下开关按钮时的输出:

SWITCHING: FIXED -> SIZABLE
{Width=373, Height=169}
{Width=383, Height=179}
SWITCHING: SIZABLE -> FIXED
{Width=383, Height=179}
{Width=373, Height=169}

我该如何解决这种行为?我所说的“修复”是指尽可能防止这种情况发生。无论边框样式的类型如何,我都希望能够指定我的表单大小并保持不变。

此外,如果有人想用这种方法解决这个问题,那么通过子类化 Form 类的解决方案对我来说是完美的解决方案。

编辑:
我制作了一个小视频来演示这个问题。第一个测试表明表单大小实际上并没有改变(视觉上),只是表单的位置发生了一点变化;但是 Size 属性的值确实发生了变化,正如您在调试输出中看到的那样。您将在调试输出中看到的第二个测试是表单 Size 属性值发生变化,并且窗口大小本身也会发生变化。

请看这里:
http ://screencast.com/t/0vT1vCoyx2u

4

4 回答 4

2

您的问题是位置更改,而不是大小。此代码解决了视频中看到的问题。

        private void Form1_DoubleClick(object sender, EventArgs e)
        {
            Point _location = this.PointToScreen(this.ClientRectangle.Location);
            if (this.FormBorderStyle == FormBorderStyle.SizableToolWindow)
            {
                this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
            }
            else
            {
                this.FormBorderStyle = FormBorderStyle.SizableToolWindow;
            }
            Point _newloc = this.PointToScreen(this.ClientRectangle.Location);
            Size _diff = new Size(_newloc) - new Size(_location);
            this.Location -= _diff;
        }

在我看来,在这两种边框样式之间切换时渲染表单移动的问题是 DWM 中的一个错误。

于 2009-05-13T21:39:46.013 回答
1

我怀疑正在发生的事情是 Windows 窗体在边框大小发生变化时保持客户端大小(即内部区域)相同。这通常是一件好事,因为它确保窗口仍然可以正确地适合您放置的内容。

如果您想保持相同的外部尺寸,您可以通过在更改边框类型之前将大小保存到变量来解决它,然后将其恢复。不过,它们可能会轻微闪烁。

于 2009-05-13T01:41:15.080 回答
0

这对我来说很好:

    private Size _size;
    private void Form1_DoubleClick(object sender, EventArgs e)
    {
        _size = this.Size;
        if (this.FormBorderStyle == FormBorderStyle.SizableToolWindow)
        {
            this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
        }
        else
        {
            this.FormBorderStyle = FormBorderStyle.SizableToolWindow;
        }
        this.Size = _size;
    }
于 2009-05-13T02:12:52.730 回答
0

我有同样的问题。当您设置 FormBorderStyle 时,客户端大小会发生变化,但它似乎没有立即放入 clientrectangle 属性中。上面列出的代码几乎对我有用,但不仅仅是存储大小,请确保存储客户大小。当然,在上面的例子中,“this”可能是对客户大小的引用——我不确定。无论如何购买,这对我有用:

_frmFilter.Height = 300 Dim _size As Size = .ClientSize _frmFilter.FormBorderStyle = FormBorderStyle.FixedToolWindow _frmFilter.ClientSize = _size

于 2011-01-17T19:40:56.617 回答