今天无意中找到了停靠窗体的答案,感觉很好,所以以实例的形式记下来:
1.新建一个Win项目,SubForm .
2.主窗口的设置:
增加两个Panel控件,设置panel1的Dock属性为Top,panel2的Dock属性为Fill,并讲panel2的Name属性
设置为pnlMain,增加两个Button控件,btnSub1和btnSub2,Text属性分别设置为:SubFormOne,SubFormTwo
窗体结构如图示:
3.创建公共类Comm
代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace SubForm
{
static class Comm
{
/// <summary>
/// 定义窗体变量,用来记录当前打开窗体
/// </summary>
public static Form myForm;
/// <summary>
/// 打开一个新在窗体,并停靠在pnlMain控件内
/// </summary>
/// <param name="p_Form">将要打开的窗口变量</param>
/// <param name="pnlMain">父控件</param>
public static void InitForm(Form p_Form,Panel pnlMain)
{
CloseForm();
p_Form.TopLevel = false;//设置p_Form为非顶级窗口
p_Form.Parent = pnlMain;//设置p_Form的父控件
p_Form.Dock = DockStyle.Fill;
p_Form.Show();
//p_Form.Update();
myForm = p_Form;
}
/// <summary>
/// 关闭上次打开的窗口
/// </summary>
public static void CloseForm()
{
if (myForm != null)
{
myForm.Close();
myForm.Dispose();
}
}
}
}
上面的代码一幕了然,不用再多说.
4.新增窗体Subfrm1,和Subfrm2
Subfrm1中拖入一个Label控件,并设置它的Text属性为SunFormOne,
Subfrm2中拖入一个Label控件,并设置它的Text属性为SunFormTwo,
将两个窗口的FormBoderStyle属性设置为None.
如下图:
Subfrm2和这个一样的外观,只是Lable的内容不同
5.添加事件:
回到主窗口,在btnSub1的单击事件中添加如下代码:
Subfrm1 subfrm1 = new Subfrm1();
//this.DoubleBuffered = true;
Comm.InitForm(subfrm1, pnlMain);
在btnSub2的单击事件中添加如下代码:
Subfrm2 subfrm2 = new Subfrm2();
this.DoubleBuffered = true;
Comm.InitForm(subfrm2, pnlMain);
到此,所有全部完成,其实很简单的.
运行效果如下: