FormBorderStyle为NONE时的表单高度问题

时间:2010-11-12 10:25:06

标签: winforms

我有一个无边框形式(FormBorderStyle = None),高度为 23 像素(在设计器中设置)

当.NET在运行时绘制我的表单时 - 它将 38 像素拉高(由于某种原因它会增加标题栏的高度)。

MessageBox.Show(this.Height.ToString()); //this shows 38!! why?

为了解决这个问题,我必须设置“Height = 23;”在Form_Load事件中。

private void MyForm_Load(object sender, EventArgs e)
{
    this.Height = 23; //workaround. wtf??
}

您可以在Visual Studio 2010(Winforms App,目标框架 - 2.0)中自行尝试。

跆拳道?

1 个答案:

答案 0 :(得分:5)

是的,这是一个错误,各种各样。请注意在设计器中如何使用“宽度”和“高度”属性设置窗体的大小。这些属性包括边框的大小和标题栏。然而,这是一个问题,您的表单可能会在用户增加的机器上运行,比如标题栏字体大小。那将减少窗口客户区的大小。或者换句话说,表单的ClientSize属性将在该计算机上更改。保留较少的控件空间并使表单设计变得非常糟糕。

Form类中的代码在创建句柄之后运行,就在Load事件运行之前。它使用您在计算机上使用的相同ClientSize重新计算表单的大小。现在一切都很好,表单的高度与您在设计器中设置的高度不匹配,但表单看起来相同,控件的布局相同。

相同的代码也确保窗口不会太小。这就是它落空的地方,它没有足够重视FormBorderStyle属性。正如您所发现的那样,将高度剪切到标题栏大小加上客户区高度。它还可以防止表单变得太窄,以确保图标和最小/最大/关闭按钮始终可见。即使你没有。

解决方法是在此代码运行后更改ClientSize,OnLoad覆盖或Load事件处理程序是正确的位置。请注意,如果您像这样硬编码表单大小,那么您还应该将AutoScaleMode属性设置为None。确保这不会对具有不同DPI设置的计算机造成麻烦。