本文章已收录于:

 

C#MDI窗体实现多窗口效果  
Visual C#是微软公司推出的下一代主流程序开发语言,他也是一种功能十分强大的程
序设计语言,正在受到越来越多的编程人员的喜欢。在Visual C#中,提供了为实现MDI程序设计的很多功能。本文就是通过一个具体的例子来详细的介绍在Visual C#中的MDI编程。   
  一程序设计及运行的环境:
  (1)视窗2000服务器版
  (2).Net FrameWork SDK Beta 2版
  二程序设计的思路、主要步骤和实现方法:
  MDI编程主要就是要在主窗体中能够新建一个MDI窗体,并且能够对主窗体中的所有MDI窗体实现层叠、水平平铺和垂直平铺。虽然这些操作比较基本,但却是程序设计中的要点和重点。本文就按照上述功能的顺序来一一介绍。
  (1)首先要设定主窗体是一个MDI窗体的容器,因为只有如此才能够在此主窗体上面添加MDI窗体,从而实现对MDI编程,具体实现语句如下:
  

public Form1()
{
InitializeComponent();
this.IsMdiContainer = true;
}

我是直接把this.IsMdiContainer = true ;写在窗体的构造函数中,你也可以写的form_load函数中。

  (2)在主窗体上面新建一个MDI窗体。在程序中,新建一个MDI窗体的命令是通过一个菜单的事件来实现的。在处理新建一个MDI窗体事件中,关键是要设定此MDI窗体的父窗体。其实MDI窗体和别的窗体没有什么不同,不同点就在MDI窗体有上一级窗体,即父窗体,而其他窗体是没有的,具体实现语句如下:

private void New_Click (  object sender , EventArgs e )//这是一个菜单的事件
{
  Form frmTemp = new Form ( ) ;
  //新建一个窗体
  frmTemp.MdiParent = this ;
  //定义此窗体的父窗体,从而此窗体成为一个MDI窗体
  frmTemp.Text = "窗体0" + FormCount.ToString ( ) ;
  //设定MDI窗体的标题
  FormCount++ ;
  frmTemp.Show ( ) ;
  //把此MDI窗体显示出来
}

(3)实现对MDI窗体的层叠:
  对于在主窗体中实现对MDI窗体的层叠操作,在主程序中,是通过一个方法来实现的,这个方法就是LayoutMdi,他所带的参数是MdiLayout.Cascade,具体实现语句如下:

private void Cascade_Click ( object sender , EventArgs e )  //实现对主窗体中的MDI窗体的层叠操作
{
  this.LayoutMdi ( MdiLayout.Cascade ) ;
}

实现操作后具体如下图:


图01:在主窗体中实现对MDI窗体的层叠操作,点击小图放大
  (4)实现对MDI窗体的水平平铺:
  要在主窗体实现MDI窗体水平平铺,也是通过LayoutMdi方法,此时所带的参数是MdiLayout.TileHorizontal,具体实现语句如下:
this.LayoutMdi ( MdiLayout.TileHorizontal ) ;
 
实现操作后具体如下图:

图02:在主窗体中实现对MDI窗体的水平平铺操作,点击小图放大
  (5)实现对MDI窗体的垂直平铺:
  要在主窗体实现MDI窗体垂直平铺,也是通过LayoutMdi方法,此时所带的参数是MdiLayout.TileVertical,具体实现语句如下:
this.LayoutMdi ( MdiLayout.TileVertical ) ;//实现对主窗体中的MDI窗体的垂直平铺操作
 
实现操作后具体如下图:

图03:在主窗体中实现对MDI窗体的垂直平铺操作,点击小图放大

  (6)在有些MDI程序,当新建一个MDI窗体以后,往往会在某些菜单项的下面生产一个以此MDI窗体的名称为名称的子菜单项。在其他语言中要实现这种功能,可能就要在某些主菜单项下动态的加入子菜单了。但是在Visual C#中实现此种功能,就显得比较简单的,只有在要加入的主菜单项下加入下面一句程序就可以了:
  WindowMenu.MdiList = true ;本程序中,是在"窗口"主菜单项下面加入MDI窗体的子菜单项的。加入此语句后,程序运行界面具体如下图:

图04:在主窗体中实现在新建一个MDI窗体后会在此主菜单项下显示存在的MDI窗体菜单项,点击小图放大

  三.程序源代码(mdi.cs)及编译方法:
  通过对程序设计中的难点介绍以后,就可以比较容易得到实现对上述MDI窗体处理的源程序代码(mdi.cs),具体如下:
  mdi.cs源程序代码:

  using  System ;
  using System.Windows.Forms ;
  using System.ComponentModel ;
  using System.Drawing ;
  //导入在程序中用到的名称空间
  class MDIDemo : Form
  {
  private static int FormCount = ;
  //定义此常量是为了统计MDI窗体数目,
  MainMenu mnuMain = new MainMenu ( ) ;
  MenuItem FileMenu ;
  MenuItem NewMenu ;
  MenuItem ExitMenu ;
  MenuItem WindowMenu ;   public MDIDemo ( )
  {
  this.IsMdiContainer = true ;
  this.Text = "MDI演示程序" ;
  FileMenu = new MenuItem ( ) ;
  FileMenu.Text = "文件" ;
  WindowMenu = new MenuItem ( ) ;
  WindowMenu.Text = "窗口(&W)" ;
  WindowMenu.MenuItems.Add ( "窗体层叠(&C)" , new EventHandler ( Cascade_Click ) ) ;
  WindowMenu.MenuItems.Add ( "水平平铺(&H)" , new EventHandler ( TileH_Click ) ) ;
  WindowMenu.MenuItems.Add ( "垂直平铺(&V)" , new EventHandler ( TileV_Click ) ) ;
  WindowMenu.MdiList = true ;
  //这一句比较重要,有了这一句就可以实现在新建一个MDI窗体后会在此主菜单项下显示存在的MDI窗体菜单项
  NewMenu = new MenuItem ( ) ;
  NewMenu.Text = "新建窗体(&N)" ;
  NewMenu.Click += new EventHandler ( New_Click ) ;
  ExitMenu = new MenuItem ( ) ;
  ExitMenu.Text = "退出(&X)" ;
  ExitMenu.Click += new EventHandler ( Exit_Click ) ;
  FileMenu.MenuItems.Add ( NewMenu ) ;
  FileMenu.MenuItems.Add ( new MenuItem ( "-" ) ) ;
  FileMenu.MenuItems.Add ( ExitMenu ) ;
  mnuMain.MenuItems.Add ( FileMenu ) ;
  mnuMain.MenuItems.Add ( WindowMenu ) ;
  this.Menu = mnuMain ;
  }   private void Cascade_Click ( object sender , EventArgs e )
  //实现对主窗体中的MDI窗体的层叠操作
  {
  this.LayoutMdi ( MdiLayout.Cascade ) ;
  }   private void TileH_Click ( object sender , EventArgs e )
  //实现对主窗体中的MDI窗体的水平平铺操作
  {
  this.LayoutMdi ( MdiLayout.TileHorizontal ) ;
  }   private void TileV_Click ( object sender , EventArgs e )
  //实现对主窗体中的MDI窗体的垂直平铺操作
  {
  this.LayoutMdi ( MdiLayout.TileVertical ) ;
  }   private void New_Click ( object sender , EventArgs e )
  {
  Form frmTemp = new Form ( ) ;
  //新建一个窗体
  frmTemp.MdiParent = this ;
  //定义此窗体的父窗体,从而此窗体成为一个MDI窗体
  frmTemp.Text = "窗体0" + FormCount.ToString ( ) ;
  //设定MDI窗体的标题
  FormCount++ ;
  frmTemp.Show ( ) ;
  //把此MDI窗体显示出来
  }   private void Exit_Click ( object sender , EventArgs e )
  {
  this.Dispose ( );
  Application.Exit ( ) ;
  }   public static void Main ( )
  {
  Application.Run ( new MDIDemo ( ) ) ;
  }
  }

再经过以下编译命令编译过以后,就可以得到执行程序:
  csc /t:winexe /r:system.dll /r:system.windows.forms.dll /r:system.drawing.dll mdi.cs

四.总结:
  本文主要是介绍如何用Visual C#来实现对MDI窗体的编程。即:新建MDI窗体、MDI窗体层叠、MDI窗体水平平铺、MDI窗体的垂直平铺。通过上述介绍,可见,在Visual C#中处理MDI还是相当比较简单的。
不过说实现在我不建议大家这样实现了,而是喜欢使用Tabcontrol的方法,这样容易控件,而且可以达到多任务,多操作的效果,也是目前几乎所有浏览器都采用的方法

 

出处:http://www.sufeinet.com/thread-1364-1-1.html
http://www.xin3721.com/ArticlePrograme/C_biancheng/1966.html

使用MDI窗体实现多窗口效果的更多相关文章

  1. 2019-8-15C#MDI窗体实现多窗口效果

    C#MDI窗体实现多窗口效果  Visual C#是微软公司推出的下一代主流程序开发语言,他也是一种功能十分强大的程序设计语言,正在受到越来越多的编程人员的喜欢.在Visual C#中,提供了为实现M ...

  2. MDI窗体 的再度思考

    早在敲学生管理系统的时候,青山师哥就跟我说过  MDI 窗体 跟 子窗体的事情,当时只是简单的查询.小小的用了一下,没有太在意. 当再次面对着这个东西更深层的时候才想起师哥那句话.“好好研究一下这个东 ...

  3. 2015.12.14 MDI(多文档窗口结构)设置基本解决,折腾一天,部分解决存在已久的问题。但效果仍不如临时航线的MDI窗体结构。

    创建从一个窗口弹出多个子窗口的结构叫MDI窗体结构 如果不按MDI结构管理,最简单的做法是: 在窗体A上添加菜单或按钮,在菜单或按钮事件中添加弹出B窗体代码: B b = new B(); b.sho ...

  4. 小菜学习Winform(四)MDI窗体(附示例)

    前言 在做winfrom项目的时候我们可能会用到嵌套窗体,就是说一个容器中有多个窗体,可以分别管理和应用这些窗体,.net中提供了一种机制就是MDI,可能大家都会用,这边就简单的介绍下. 简单应用 w ...

  5. Winform MDI窗体切换不闪烁的解决办法(测试通过)

    https://stackoverflow.com/questions/5817632/beginupdate-endupdate-for-datagridview-request SuspendLa ...

  6. MDI窗体容器--2016年12月15日

    MDI窗体容器 多文档界面(Multiple-Document Interface)简称MDI窗体.MDI窗体用于同时显示多个文档,每个文档显示在各自的窗口中.MDI窗体中通常有包含子菜单的窗口菜单, ...

  7. MDI窗体容器、权限设置

    一.MDI窗体容器: 1.功能: 它可以让其它窗体在它的内部打开,无法超出它的范围 将某个窗体的属性:IsMdiContainer设置为true - 窗口样式 2.问题: (1)如何将其它窗体在它的内 ...

  8. MDI窗体容器 权限设置

    MDI窗体容器:它可以让其它窗体在它的内部打开,无法超出它的范围将某个窗体的属性:IsMdiContainer设置为true - 窗口样式如何将其它窗体在它的内部打开?窗体对象名.MdiParent ...

  9. MDI窗体

    1.设置父窗体 使用MDI窗体,需要先将父窗体的IsMdiContainer属性设置为True 2.生成用于MDI子窗体的窗体 1 frmTemp f1 = new frmTemp(); f1.Tex ...

随机推荐

  1. 【python】-- web开发之JavaScript

    JavaScript JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. ...

  2. 20179209《Linux内核原理与分析》第十二周作

    缓冲区溢出漏洞实验 缓冲区溢出简介 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器 ...

  3. SAP后台作业记录操作

    [转http://blog.163.com/liang_ce_521@126/blog/static/709202152013073376596/]后台作业信息存储在透明表TBTCP(批作业步骤概述) ...

  4. python 数据结构中被忽视的小技巧

    一.一个包含N个元素的字符串.元组.序列.以及任何可迭代对象均可以拆分成N个单独的“变量” 1.字符串的拆分 #字符串 In [10]: s="abdefg" In [11]: o ...

  5. Spark Mllib源码分析

    1. Param Spark ML使用一个自定义的Map(ParmaMap类型),其实该类内部使用了mutable.Map容器来存储数据. 如下所示其定义: Class ParamMap privat ...

  6. Spark Structured Streaming框架(2)之数据输入源详解

    Spark Structured Streaming目前的2.1.0版本只支持输入源:File.kafka和socket. 1. Socket Socket方式是最简单的数据输入源,如Quick ex ...

  7. Tornado--基于H5图片的上传

    日记 好久没有分享过东西,一直在学习状态,学的并不好很多东西都没有,也写了很多demo,后续整理出来在分享,就不分享了,不为什么因为今天周六,好不容易双休,大早上的一个人醒来,刷刷知乎,听音乐.分享一 ...

  8. QT下的QProcess调用外部程序

    头文件widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> namespace Ui { class Widget; ...

  9. NetBeans字体设置

    01.找到自己java字体目录.我的目录是[C:\Program Files\Java\jdk1.7.0_21\jre\lib] 02.复制fontconfig.properties.src, 重命名 ...

  10. HBase常用操作-HBaseUtil

    package com.zhen.hbase; import java.io.IOException; import java.util.ArrayList; import java.util.Col ...