代码改变世界

自定义MDI 子窗体的Layout方式

2009-02-21 12:15  dytes  阅读(2251)  评论(3编辑  收藏  举报

  MDI Form默认提供了4Layout的方式。但有些情况下,这几种Layout的方式并不能满足需求。这时我们就需要自定义MDI子窗体的Layout方式,主要也就是手动设置子窗体的SizeLocation属性。

  在设置子窗体的Layout之前,我们先要找出子窗体的父容器的ClientSize,然后根据ClientSize的大小以及自己需要的Layout方式,设置子窗体的SizeLocation属性。子窗体的父容器是谁呢?我第一次想当然的就认为是MDI的主窗体,于是就用childForm(一个子窗体)的ParentForm属性获得了主窗体的引用,然后获得它的ClientSize,但结果总是不让人满意,如下图。

    原因在于主窗体的ClientSize指的是除了标题栏和边框外窗体的大小。而我们实际需要的是上图中间灰色部分的大小。这部分区域的大小如何获得呢?其实childForm还有一个Parent性,它是一个MdiClient对象,该对象才是MDI子窗体的父容器,而MdiClient对象的Parent才是MDI主窗体。MDI主窗体,MdiClient和子窗体是层层包含的关系。

    只有获取MdiClient对象的大小,才能设置出我们需要的Layout方式。下面这个方法获取ClientSize大小:  

       private Size GetMdiClientAreaSize()
       {
            MdiClient client 
= childForm1.Parent as MdiClient;
            
return client.ClientSize;
       }

 

    得到ClientSize的大小后,我们就可以根据ClientSize的大小以及自己需要的Layout方式,设置子窗体的Location以及Size属性,如:  

 

 

   private void centerToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Size clientSize 
= this.GetMdiClientAreaSize();
            childForm1.Size 
= new Size(clientSize.Width / 4, clientSize.Height / 4);
            childForm1.Location 
= new Point(clientSize.Width/2-childForm1.Size.Width,clientSize.Height/2-childForm1.Size.Height);

            childForm2.Size 
= childForm1.Size;
            childForm2.Location 
= new Point(clientSize.Width / 2, clientSize.Height / 2 - childForm1.Size.Height);

            childForm3.Size 
= new Size(clientSize.Width / 2, clientSize.Height / 4);
            childForm3.Location 
= new Point(clientSize.Width/4,clientSize.Height/2);
        }

 

      效果如下图:                                         

    还可以自定义其他Layout方式,如:

       点击这里下载示例代码。