MDI的使用

来源:互联网 发布:sql中in的用法 编辑:程序博客网 时间:2024/06/05 09:39

 mdi可能是大点的WINFORM系统都要用的。废话不多说(我也不知道要说什么)直接进入正题。我用四个窗体来实现这个小功能,一个登陆窗体,一个主窗体,两个子窗体。

首先从最开始的Main()开始,将你的主窗体设置为最先运行的窗体

 Application.Run(new Main());

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

 public static int blCanLogin = 0;

当确定用户输入正确的时候把blCanLogin = 2,然后关闭登陆窗体。退出的时候设置为blCanLogin = 1,然后关闭登陆窗体。为什么这样做,等会介绍。

现在来说主窗体。首先在属性中ISMdiContainer为true。主窗体的FORM_LOAD中这样设置。意思是除了登陆正确否则全部窗体关闭。

   private void Main_Load(object sender, EventArgs e)
        {
            Login login 
= new Login();
            login.ShowDialog();
            
if (Login.blCanLogin != 2) { this.Close(); }
        }

通常主窗体启动子窗体都是用menuStrip来设置的,在里面加上你需要的菜单,我需要的就是“窗体1”和“窗体2”就可以了。在窗体1和窗体2中设置如下代码,即设置Mian为他们的主窗体。

  public Form1(Main parent)
        {
            InitializeComponent();
            
this.MdiParent = parent;
       }

到这里其实大部分的工作已经做完了,但其实在运行时回出现很多问题。如:同一个窗体会打开很多个,点击菜单窗体不能放到最上面等等。所以要判断子窗体是否已经打开的操作。我仅已窗体2为例:

我写了个方法来判断窗体是否已经打开:如果窗体存在了就  F1.Activate();把窗体放到最上面

 private bool check(string form1)
        {
            
foreach (Form F1 in this.MdiChildren)
            {
                
if (F1.Name == form1)
                {
                    F1.Activate();
                    
return true;
                }
            }
            
return false;
        }

对窗体2来说:当窗体没打开就把该窗体家到子窗体数组中,并打开。

  private void 窗体2ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            
bool bo = check("Form2");
            
if (bo == false)
            {
                Form2 form 
= new Form2(this);
                form.MdiParent 
= this;
                form.Show();
            }  
            
        }

这样就可以了,上面的问题在这些代码中也都解决了。满意吧!