代码之家  ›  专栏  ›  技术社区  ›  Alex from Jitbit

当FormBorderStyle为NONE时的窗体高度问题

  •  3
  • Alex from Jitbit  · 技术社区  · 14 年前

    我有一个高度为 23个 像素(在设计器中设置)

    38个 像素高(由于某些原因,它会添加标题栏的高度)。

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

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

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

    您可以在Visual Studio 2010(Winforms应用程序,target Framework-2.0)中亲自尝试。

    世界跆拳道联盟?

    1 回复  |  直到 14 年前
        1
  •  6
  •   Hans Passant    12 年前

    是的,这是一种虫子。请注意在设计器中如何使用“宽度”和“高度”属性设置窗体的大小。这些属性包括边框和标题栏的大小。但是,这是一个问题,您的表单可能在用户增加了标题栏字体大小的计算机上运行。这样可以减少窗口的工作区大小。或者换句话说,表单的ClientSize属性将在该计算机上更改。给控件留下的空间更少,并且把窗体的设计搞得一团糟。

    表单类中有运行 句柄是在加载事件运行之前创建的。它重新计算窗体的大小,使用的客户端大小与计算机上的客户端大小相同。现在一切都好了,表单的高度将与您在设计器中设置的高度不匹配,但是表单看起来相同,控件的布局也相同。

    同样的代码也确保了窗口不会变得太小。这就是问题所在,它没有对FormBorderStyle属性给予足够的关注。将高度剪裁为标题栏大小加上工作区高度,如您所发现的。它还可以防止窗体变得太窄,试图确保图标和min/max/close按钮始终可见。即使你没有。

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