-
MDI父窗体创建:
将父窗体属性IsMDIContainer设置为true。值得注意的是并不是所有窗体都可以将该属性设置为true,只有*窗体容器才可作为MDI父窗体。
还有一点需要注意的是MDi父窗体边缘采用系统颜色,而不是用户设置的BackColor。
另外还要注意的是一定要将主窗体的行为属性MainMenuStrip设置为你想要的值,系统默认第一个toolstripmenu当做该值,如果你准备采用第二个memubar作为该值,一定要明示,否则后果就是MDI子窗体最大化的时候,
-
MDI子窗体的创建:
自己创建一个窗体,自己指定他的MDI父窗体既可以。这样就成为多文档界面了。
这个没有什么技术难度。
难的是如何将窗体设置成透明的,这一点在界面美观上面很重要。
在vs08里面,只需要选中菜单项,然后在MDiWindoeListItem选择对应的窗体,在这里可以将那些窗体设置成透明的。
还有就是通过代码操作可以将MDI子窗体固定到一些container当中,如panel。这个只需要设定他的ParentID既可以。
-
确定活动MDI子窗体:
ActiveMDIChild 属性可以获得具有焦点的子窗体或者最近活动的子窗体。
-
将数据发送到活动的MDI子窗口。
镜像
-
排列MDI子窗口:
MdiLayout枚举类型中几种属性设置。
this.LayoutMdi(System.Windows.Forms.MdiLayout.Cascade);表示层叠
-
MDI子窗体的行为控制,如打开的时候在主窗体的状态栏生成图标,图标绑定click事件。窗体关闭的时候图标会自动消失这种最基本的需求。其实也就是如何在子窗体中操作父窗体的问题,尤其当操作内容繁多的时候。这个时候.net的事件响应方法模型对于我们很有启发意义,在事件委托中_Click(object sender, System.EventArgs e)直接引用了事件发出者以及触发的事件,这样在事件的处理实现体中可以轻易操作或者访问所需要的属性以及方法。我们这里也一样,在MDI子窗体创建的时候,可以在其中保留主窗体的一个镜像,这样可以通过访问主窗体的一些属性方法来实现我们所需要的结果,而避免了窗体之间复杂的通信机制。本人最讨厌的就是不同类之间的通信,尤其讨厌的是不同程序集之间的访问操作,封装性以及性能在这里遇到交锋,让人很多时候不得不考虑很久。
MDI子窗体应用技巧:
MDI子窗体+pictruebox可以实现一些listview的功能,而且效果更好控制,界面也更好美化。此处需要注意的是此处的MDI子窗体必须指定parent容器,并且要将formstyle设定成none。不过效果还是蛮满意的。这样做的优点就是开发难度降低,缺点就是类增多。