这次的机房收费系统,刚一着手就使我对MDI窗体有了新的认识。
MDI,Multiple Document Interface,多文档界面。MDI窗体用于同时显示多个文档,每个文档显示在各自的窗口中。对应于SDI(Single Document Interface),单文档界面。例如,office提供的Word就是MDI,我们可以同时打开多个Word文件,却不能同时打开两个记事本,记事本为SDI。
之前我对MDI的认识仅止于此。
而这次的机房收费系统,刚做主界面,就给我留了一个问题:随便点击了一个CommandButton,在MDI窗体上一画——恩?按钮呢?然后一试,发现大多数控件不能直接在MDI窗体上绘制。PictureBox可以,但是却不能改变其Width属性,Picture.Width总是=MDIForm.ScaleWidth。
经查,在MDI窗体上只能包含一个Menu、PictureBox、ToolBar、具有Align属性的ActiveX控件和自定义控件,以及具有不可见界面的控件(如:Timer)。
那么,如何在MDI窗体上添加其他控件,满足用户和编程的需要呢?
实现MDI窗体上添加其他控件,我已知的有两种解决方法:
(1)在MDI窗体上添加一个PictureBox,图片框本身为容器控件,可在其内添加其他控件。
使用PictureBox添加控件有一个问题,就是MDI子窗体显示问题——PictureBox控件会遮挡MDI子窗体,使我们看不全甚至看不见其子窗体。
---
解决办法:SetParent()函数,每显示一次子窗体,就要调用一次SetParent()函数。
另外,Picture.Visible=False,也可实现子窗体显示,但同时Picture上的其他控件也一同被隐藏了。
---
追根溯源(PictureBox遮挡MDI子窗体的原因):子窗体实际上是位于MDIClient中,就是说子窗体的父窗体是MDIClient,而放置在MDI中的picturebox和MDIClient是同一级的层次结构。
MDIForm--MDIForm1
---MDIClient
------ Form1 子窗体1
------ Form2 子窗体2
---PictureBox
(2)添加一个MDI子窗体,在子窗体上绘制其他控件,然后在MDI窗体中显示子窗体,也可达到貌似在MDI窗体中添加控件的假象。
MDI窗体上添加控件和显示子窗体的问题,体现了我们发现问题和一步步解决问题。