文章目录
- 一、窗体的弹出
- 二、窗体的嵌入
一、窗体的弹出
这里面我们以Windows窗体应用程序为例,这里面达到的效果如下:
 
 点击指定按钮,弹出目标窗口。接下来我们看具体操作:
 这是我们的主窗体:
 
 接下来我们需要在这个主窗体所属的项目中右击添加一个窗体:
 
 这里面设置窗体为我们想要的样子,设置窗体名字为FrmWafers.cs:
 
 双击主窗体上想要触发弹出窗体的按钮,进行命令设置,只需要输入两行命令就完成了,只需要知道弹出窗体的名字就行:
 FrmWafers objFrm = new FrmWafers();//弹出窗口objFrm.Show();
二、窗体的嵌入

 我们这次需要在按钮之后把之前提到的窗体嵌入到五角星区域,那么按完按钮之后就是这种效果:
 
 仍然是双击按钮去到程序设置的地方,输入以下程序:
 foreach (Control item in this.spContainer.Panel2.Controls){if (item is Form){Form objControl = (Form)item;objControl.Close();}}objFrm.TopLevel = false;//将子窗体设置成非顶级控件objFrm.WindowState = FormWindowState.Maximized;//让子窗体最大化显示objFrm.FormBorderStyle = FormBorderStyle.None;//去掉窗体的边框objFrm.Parent = this.spContainer.Panel2;//指定子窗体显示的容器objFrm.Show();这样就完成了,接下来详细解释一下,这段程序:
foreach (Control item in this.spContainer.Panel2.Controls)
{if (item is Form){Form objControl = (Form)item;objControl.Close();}
}
这一部分代码遍历spContainer.Panel2.Controls集合中的所有控件。spContainer是一个分隔容器控件(SplitContainer),它有两个面板(Panel1 和 Panel2),此代码段关注的是Panel2中的控件,如果需要嵌入到其他地方,只需要把程序中的名称换一下。
- foreach循环遍历- Panel2中的每一个控件。
- if (item is Form)这行代码检查当前控件是否是一个- Form对象。在WinForms中,通常不会将一个- Form实例作为另一个- Form的控件,但在特殊情况下,例如当我们想在父窗体中嵌入一个子窗体时,是可以的。
- 如果控件确实是一个Form实例,代码就将它转换为Form类型并调用Close()方法。这将关闭并销毁这个窗体实例。这样做是为了防止连续按下按钮重复打开窗口
接下来的部分:
objFrm.TopLevel = false; //将子窗体设置成非顶级控件
objFrm.WindowState = FormWindowState.Maximized; //让子窗体最大化显示
objFrm.FormBorderStyle = FormBorderStyle.None; //去掉窗体的边框
objFrm.Parent = this.spContainer.Panel2; //指定子窗体显示的容器
objFrm.Show();
这一部分代码负责配置和显示一个名为objFrm的Form对象。
- objFrm.TopLevel = false;这行代码将- objFrm设置为非顶级窗体。在WinForms中,顶级窗体通常是指没有父窗体的独立窗体。如果我们想将一个窗体显示在另一个窗体内部,那么需要将其- TopLevel属性设为- false。
- objFrm.WindowState = FormWindowState.Maximized;设置窗体的状态为最大化,使其填满指定的父容器。
- objFrm.FormBorderStyle = FormBorderStyle.None;移除窗体的边框,这样窗体就不会显示标题栏、控制按钮或边框。
- objFrm.Parent = this.spContainer.Panel2;将- objFrm的父控件设置为- spContainer的- Panel2,这意味着- objFrm将作为嵌入的子窗体在- Panel2中显示。
- objFrm.Show();最后,调用- Show方法来显示- objFrm窗体。
综合来讲,这段代码就是关闭Panel2中的所有嵌入窗体(如果有的话),然后配置并显示一个新的嵌入式子窗体。这在制作多文档界面(MDI)或复杂布局的应用程序时常见的手段。