mdi可能是大点的WINFORM系统都要用的。废话不多说(我也不知道要说什么)直接进入正题。我用四个窗体来实现这个小功能,一个登陆窗体,一个主窗体,两个子窗体。
首先从最开始的Main()开始,将你的主窗体设置为最先运行的窗体

接下来创建登陆系统,登陆成功进入主界面,退出则腿掉整个系统。如何验证用户名和密码是否正确,以及窗体的布局我就不说了。要想使每次启动时,登陆窗体都在中间位置只要在属性中设置startPosition为CenterScreen就可以了。好了,通常都要在这个窗体中设置个全局变量来标志窗体的状态。

当确定用户输入正确的时候把blCanLogin = 2,然后关闭登陆窗体。退出的时候设置为blCanLogin = 1,然后关闭登陆窗体。为什么这样做,等会介绍。
现在来说主窗体。首先在属性中ISMdiContainer为true。主窗体的FORM_LOAD中这样设置。意思是除了登陆正确否则全部窗体关闭。
{
Login login = new Login();
login.ShowDialog();
if (Login.blCanLogin != 2 ) { this .Close(); }
}
通常主窗体启动子窗体都是用menuStrip来设置的,在里面加上你需要的菜单,我需要的就是“窗体1”和“窗体2”就可以了。在窗体1和窗体2中设置如下代码,即设置Mian为他们的主窗体。
{
InitializeComponent();
this .MdiParent = parent;
}
到这里其实大部分的工作已经做完了,但其实在运行时回出现很多问题。如:同一个窗体会打开很多个,点击菜单窗体不能放到最上面等等。所以要判断子窗体是否已经打开的操作。我仅已窗体2为例:
我写了个方法来判断窗体是否已经打开:如果窗体存在了就 F1.Activate();把窗体放到最上面
{
foreach (Form F1 in this .MdiChildren)
{
if (F1.Name == form1)
{
F1.Activate();
return true ;
}
}
return false ;
}
对窗体2来说:当窗体没打开就把该窗体家到子窗体数组中,并打开。
{
bool bo = check( " Form2 " );
if (bo == false )
{
Form2 form = new Form2( this );
form.MdiParent = this ;
form.Show();
}
}
这样就可以了,上面的问题在这些代码中也都解决了。满意吧!