Visual C#中的MDI編程
多文檔界面就是所謂的MDI,他是從Windows 2.0下的Microsoft Excel電子表格程序開始引入的,這是因為Excel電子表格用戶有時需要同時操作多份表格,MDI正好為這種操作多表格提供了很大的方便,於是就產生了MDI程序。在視窗系統3.1版本中,MDI得到了更大范圍的應用。其中系統中的程序管理器和文件管理器都是MDI程序。
Visual C#是微軟公司推出的下一代主流程序開發語言,他也是一種功能十分強大的程序設計語言,正在受到越來越多的編程人員的喜歡。在Visual C#中,提供了為實現MDI程序設計的很多功能。本文就是通過一個具體的例子來詳細的介紹在Visual C#中的MDI編程。
一 程序設計及運行的環境:
(1)視窗2000服務器版
(2).Net FrameWork SDK Beta 2版
二 程序設計的思路、主要步驟和實現方法:
MDI編程主要就是要在主窗體中能夠新建一個MDI窗體,並且能夠對主窗體中的所有MDI窗體實現層疊、水平平鋪和垂直平鋪。雖然這些操作比較基本,但卻是程序設計中的要點和重點。本文就按照上述功能的順序來一一介紹。
(1)首先要設定主窗體是一個MDI窗體的容器,因為只有如此才能夠在此主窗體上面添加MDI窗體,從而實現對MDI編程,具體實現語句如下:
this.IsMdiContainer = true ;
(2)在主窗體上面新建一個MDI窗體。在程序中,新建一個MDI窗體的命令是通過一個菜單的事件來實現的。在處理新建一個MDI窗體事件中,關鍵是要設定此MDI窗體的父窗體。其實MDI窗體和別的窗體沒有什麼不同,不同點就在MDI窗體有上一級窗體,即父窗體,而其他窗體是沒有的,具體實現語句如下:
private void New_Click ( object sender , EventArgs e )//這是一個菜單的事件
{
Form frmTemp = new Form ( ) ;
file://新建一個窗體
frmTemp.MdiParent = this ;
file://定義此窗體的父窗體,從而此窗體成為一個MDI窗體
frmTemp.Text = "窗體0" + FormCount.ToString ( ) ;
file://設定MDI窗體的標題
FormCount++ ;
frmTemp.Show ( ) ;
file://把此MDI窗體顯示出來
}
(3)實現對MDI窗體的層疊:
對於在主窗體中實現對MDI窗體的層疊操作,在主程序中,是通過一個方法來實現的,這個方法就是LayoutMdi,他所帶的參數是MdiLayout.Cascade,具體實現語句如下:
private void Cascade_Click ( object sender , EventArgs e )
// 實現對主窗體中的MDI窗體的層疊操作
{
this.LayoutMdi ( MdiLayout.Cascade ) ;
}
(4)實現對MDI窗體的水平平鋪:
要在主窗體實現MDI窗體水平平鋪,也是通過LayoutMdi方法,此時所帶的參數是MdiLayout.TileHorizontal,具體實現語句如下:
private void TileH_Click ( object sender , EventArgs e )
// 實現對主窗體中的MDI窗體的水平平鋪操作
{
this.LayoutMdi ( MdiLayout.TileHorizontal ) ;
}
(5)實現對MDI窗體的垂直平鋪:
要在主窗體實現MDI窗體垂直平鋪,也是通過LayoutMdi方法,此時所帶的參數是MdiLayout.TileVertical,具體實現語句如下:
private void TileV_Click ( object sender , EventArgs e )
// 實現對主窗體中的MDI窗體的垂直平鋪操作
{
this.LayoutMdi ( MdiLayout.TileVertical ) ;
}
(6)在有些MDI程序,當新建一個MDI窗體以後,往往會在某些菜單項的下面生產一個以此MDI窗體的名稱為名稱的子菜單項。在其他語言中要實現這種功能,可能就要在某些主菜單項下動態的加入子菜單了。但是在Visual C#中實現此種功能,就顯得比較簡單的,只有在要加入的主菜單項下加入下面一句程序就可以了:
WindowMenu.MdiList = true ; 本程序中,是在"窗口"主菜單項下面加入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 = 1 ;
file://定義此常量是為了統計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 ;
file://這一句比較重要,有了這一句就可以實現在新建一個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 ( ) ;
file://新建一個窗體
frmTemp.MdiParent = this ;
file://定義此窗體的父窗體,從而此窗體成為一個MDI窗體
frmTemp.Text = "窗體0" + FormCount.ToString ( ) ;
file://設定MDI窗體的標題
FormCount++ ;
frmTemp.Show ( ) ;
file://把此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還是相當比較簡單的