FormBorderStyle为NONE时的表单高度问题

Ale*_*lex 3 winforms

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

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

MessageBox.Show(this.Height.ToString()); //this shows 38!! why?
Run Code Online (Sandbox Code Playgroud)

要解决它,我必须设置"高度= 23;" 在Form_Load事件中.

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

您可以在Visual Studio 2010(Winforms App,target Framework - 2.0)中自行尝试.

跆拳道?

Han*_*ant 6

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

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

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

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