我正在研究别人写的旧代码。在此,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;
}
}
最后两行困扰着我。它们实际上是必要的,因为如果省略它们,主要形式内的形状会在边缘周围切断。只有在手动缩放屏幕后,子窗体才会再次适合主窗体。如果尝试将+=
-=
黑客替换为:
this.Refresh();
但这并不能解决问题。显然,这只是刷新主要形式而不是子形式。如果没有这个丑陋的黑客,我怎么能纠正这个?
答案 0 :(得分:1)
m_subForm.ControlBox = false;
这对于MDI子表单是非法的,它必须使所有窗口装饰正常工作。并且实际上可以用作MDI子项,它是一种基于允许用户最小化/恢复/最大化子窗口的窗口模型。从20世纪90年代早期开始,监视器仍然具有非常低的分辨率,因此显示窗口的屏幕空间不大。
但是,Winforms不会强制执行此MDI要求。修补高度是一个黑客,让窗户正确绘画。应该从产生的闪烁中注意到。
当您始终显示最大化子窗口时,MDI毫无意义。通过简单地将UserControl交换进出表单,您可以得到完全相同的效果,减去必须与MDI控制栏作战。如果您将TopLevel property设置为false,则此类UserControl也可以是表单。