进一步了解MDI窗体

时间:2021-07-25 09:43:17

       这次的机房收费系统,刚一着手就使我对MDI窗体有了新的认识。

       MDIMultiple Document Interface,多文档界面。MDI窗体用于同时显示多个文档,每个文档显示在各自的窗口中。对应于SDISingle Document Interface),单文档界面。例如,office提供的Word就是MDI,我们可以同时打开多个Word文件,却不能同时打开两个记事本,记事本为SDI

       之前我对MDI的认识仅止于此。


 

       而这次的机房收费系统,刚做主界面,就给我留了一个问题:随便点击了一个CommandButton,在MDI窗体上一画——恩?按钮呢?然后一试,发现大多数控件不能直接在MDI窗体上绘制。PictureBox可以,但是却不能改变其Width属性,Picture.Width总是=MDIForm.ScaleWidth


 

       经查,在MDI窗体上只能包含一个MenuPictureBoxToolBar、具有Align属性的ActiveX控件和自定义控件,以及具有不可见界面的控件(如:Timer)。

       那么,如何在MDI窗体上添加其他控件,满足用户和编程的需要呢?

       实现MDI窗体上添加其他控件,我已知的有两种解决方法:

(1)MDI窗体上添加一个PictureBox,图片框本身为容器控件,可在其内添加其他控件。

使用PictureBox添加控件有一个问题,就是MDI子窗体显示问题——PictureBox控件会遮挡MDI子窗体,使我们看不全甚至看不见其子窗体。

---

解决办法:SetParent()函数,每显示一次子窗体,就要调用一次SetParent()函数。

另外,Picture.Visible=False,也可实现子窗体显示,但同时Picture上的其他控件也一同被隐藏了。

---

追根溯源(PictureBox遮挡MDI子窗体的原因):子窗体实际上是位于MDIClient中,就是说子窗体的父窗体是MDIClient,而放置在MDI中的pictureboxMDIClient是同一级的层次结构。

MDIForm--MDIForm1

---MDIClient

------ Form1 子窗体1

------ Form2 子窗体2

---PictureBox

(2)添加一个MDI子窗体,在子窗体上绘制其他控件,然后在MDI窗体中显示子窗体,也可达到貌似在MDI窗体中添加控件的假象。

  


 

MDI窗体上添加控件和显示子窗体的问题,体现了我们发现问题和一步步解决问题。