文章目录
- 一、窗体的弹出
- 二、窗体的嵌入
一、窗体的弹出
这里面我们以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)或复杂布局的应用程序时常见的手段。