4

我正在处理其他人编写的旧代码。在这种情况下,Windows.Forms.Form在另一个主类中创建了一个子类Windows.Forms.Form

class MainForm : Windows.Forms.Form 
{
    m_subForm = null;

    /* Much more stuff */

    private void createSubForm 
    {
         m_subForm= new SubForm();
         m_subForm.Text = "";
         m_subForm.MdiParent = this;
         m_subForm.WindowState = FormWindowState.Maximized;
         m_subForm.ControlBox = false;
         m_subForm.Show();
         // There is no comment in the code on why this is done:
         this.Height -= 1;
         this.Height += 1;
    }
}

最后两行让我感到困惑。它们实际上是必要的,因为如果省略它们,主窗体中的窗体会在边缘周围被切掉。只有在您手动缩放屏幕后,子表单才会再次适合主表单。如果尝试将+= -=hack 替换为:

this.Refresh();

但这并不能解决问题。显然,这只会刷新主表单,但不会刷新子表单。如果没有这个丑陋的黑客,我该如何纠正这个问题?

4

1 回答 1

1
     m_subForm.ControlBox = false;

这对于 MDI 子窗体是非法的,它必须具有所有窗口装饰才能正常工作。并且实际上可以用作 MDI 子窗口,它是一个基于允许用户最小化/恢复/最大化子窗口的窗口模型。可以追溯到 1990 年代初期,当时显示器的分辨率仍然很低,因此没有太多的屏幕空间来显示窗口。

然而,Winforms 并不强制执行此 MDI 要求。修补高度是让窗口正确绘制的技巧。从产生的闪烁中应该可以看出。

当您总是最大化显示子窗口时,MDI 毫无意义。通过简单地将 UserControl 换入和换出表单,您可以获得完全相同的效果,而不必与 MDI 控制栏作斗争。如果您将其TopLevel 属性设置为 false,则此类 UserControl 也可以是 Form 。

于 2013-09-20T12:45:21.873 回答