程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> Windows Forms菜單設計全攻略

Windows Forms菜單設計全攻略

編輯:關於C#

[前言:] C#不但繼承了C++、Java等面向對象的強大功能特性,同時還是繼承了VB、Delphi等編程語言的可視化快速開發功能,也稱其為當前第一個完全面向組件的語言。雖然微軟將把C#語言作為在WEB上開發一種主流工具來推廣,但其在傳統客戶/服務器模式的程序設計中,特別是在微軟.Net平台系統下,C#其強大,易用的特性將會成為Windows應用軟件開發人員首選工具。

而在Windows程序設計中,菜單作為用戶與程序交互的首選工具,那麼在.Net中C#又是如何快速的構造Windows Forms中的菜單呢?怎樣才能掌握Windows Forms菜單的實質,在程序設計中做到得心應手,為所欲為的進行窗體菜單程序的開發呢?這篇文章將給您最全面的回答。

一、Windows Forms菜單程序簡介

我們知道,在Windows程序中,菜單是一個必不可少的程序元素。通過使用菜單,可以把對程序的各種操作命令非常規范有效的表示給用戶。一個Windows程序菜單一般包括一個主菜單(主菜單下面包含許多子菜單)及很多彈出式菜單。單擊菜單項程序將執行相應的功能;另外在程序窗體的許多地方單擊鼠標右鍵將會彈出一個針對性的快捷菜單(也可以稱為彈出式菜單),單擊將執行相應的功能,使得軟件的應用變得更加簡單,更加人性化。Microsoft視窗系統及其應用軟件站穩桌面系統及軟件的霸主地位,友好的菜單應用立下不小的功勞。

與傳統的Windows程序一樣,Windows Forms程序中的菜單也包括一般的菜單及彈出菜單兩種。一般的菜單主要是指窗體的主菜單及子菜單。菜單從屬特性外觀及主要功能又可分類:命令式菜單、選擇菜單、鏈接菜單及分隔菜單等等。

大家一定使用過快速開發(RAD)語言工具(如VB、Delphi等)設計過菜單程序。使用這些開發工具,你只需要把用鼠標把菜單控件拖放到窗體上,並通過簡單的菜單外觀及屬性等設置即可完成非常友好的菜單程序開發。在.Net中,C#是支持快速開發的,因此,通過使用相應的開發工具(如Visual Studio .Net)也可以通過簡單的鼠標拖放操作完成大部份的菜單程序設計。當然,由於C#的強大的功能,使用.Net提供的菜單類,你也可以通過記事本等純文本編輯工具就能寫出具有良好用戶界面的菜單程序。

但是只有在充分掌握Windows Forms菜單的實質以後,我們才能在程序設計中做到得心應手,為所欲為的進行窗體菜單程序的開發。

二、菜單程序使用類及體系結構

在.NET類庫中,定義了一個非常龐大的基礎類,以供用戶在各種編程使用。在這些類中,有幾個專為用戶編寫菜單程序所用的類,通過使用這幾個類,你可以設計出自己想要的任何菜單。下面分別進行簡單的介紹:

2.1 Windows Forms菜單類體系結構

.Net類庫中,菜單類的定義體系結構如下:

Object

MarshalByRefObject

Component

Menu

ContextMenu

MainMenu

MenuItem

從上面結構中,我們可以看出,菜單程序設計主要用到三個從Menu類繼承的類:ContextMenu、MainMenu與MenuItem,它們分別封裝了對彈出式菜單、主菜單及菜單項的定義。

另外,.Net類庫還提供了一個Menu.MenuItemCollection集合類來方便對各菜單項的管理。其定義如下:

public class Menu.MenuItemCollection:IList,ICollection,Ienumerable;

2.2 System.Windows.Forms.Menu類

該類是一個抽象類,其是各種類型菜單的基類,封裝了一個Windows Forms菜單的大部份公共屬性。

在菜單應用程序設計中,我們不直接(也不能)使用該類,而是使用其派生類MainMenu、MenuItem、ContextMenu等進行菜單開發;但可以從該類派生出自己更具個性化的菜單。

在該類中有定義了一個非常重要的屬性:MenuItems,其表示該對象所包含的菜單項集合。

2.3 System.Windows.Forms.MenuItem類

該類封裝了一個菜單項中的各種成員,所有的菜單項都是由MenuItem對象構成的。該類包含了對一個菜單項的詳細定義,如菜單項目的各種屬性、響應事件及方法等。MenuItem對象是各種菜單的基本元素,在後面我們將詳細講解菜單項的使用。

2.4 System.Windows.Forms.MainMenu類

作為一個窗體主菜單的容器,其實例產生一個窗體的主菜單對象。你可以直接通過該類的構造函數生成MainMenu對象。其構造函數有兩種形式:

MainMenu():不帶任何參數,將生成一個不帶菜單項的主菜單對象。

MainMenu(MenuItem[] menus):帶一個菜單項數據參數,將生成一個主菜單對象,並包括參數中擁有的菜單,作為菜單項。

MainMenu的Menu類的基礎上,添加了一個屬性:RightToLeft,把屬性設為RightToLeft.Yes可以使你的主菜單從窗體的右邊排到左邊(這種表示是一些國家的語言習慣)。

MainMenu對象提供一個方法CloneMenu(),使得用戶可以方便的復制主菜單對象。除此之外,還可以通過GetForm()方法查看當前主菜單所在的窗體。

2.5 System.Windows.Forms.ContextMenu類

該類封裝了對彈出式菜單各種特性及功能的定義。使用該類,當你在一個控件上點擊右鍵,或者是在窗體的任何一個區域點擊右鍵,將可以彈出一個快捷菜單。

生成一個彈出式菜單對象,可以使用該類有兩個構造函數。其中ContextMenu()生成一個不含任何菜單項的彈出式菜單;ContextMenu(MenuItem[] menus)生成一個包括參數中所指定的菜單項的彈出式菜單。

ContextMenu類在Menu的基礎上增加了兩個屬性,其中一個是RightToLeft可以使菜單項從右到左對齊,另一個SourceControl屬性返回一個Control值表示當前所顯示彈出菜單對應的控件。

在ContextMenu類中,通過Show()方法可以使程序主動顯示彈出菜單。當彈出菜單彈出時將引發一個Popup事件,你可以在定義該事件的響應方法使彈出菜單顯示前做一些操作;你也可以通過虛擬的OnPopup()方法引發彈出菜單的Popup事件。

2.6 System.Windows.Forms.Menu.MenuItemCollection類

表示系列菜單項(MenuItem)對象的集合,並提供管理集合中元素的各種方法。該類從Object中繼承,並通過Ilist、Icollection等接口繼承了.Net中關於集合的各種操作,其在.Net類庫中說明如下:

public class Menu.MenuItemCollection : IList,ICollection,IEnumerable

通過使用菜單項集合類,你可以使用集合的各種操作方法,從而非常方便的管理一系列的菜單項,如一個主菜單上的所有菜單項及一個主菜單下的所有子菜單等。

同.Net中的所有集合對象一樣,該類Count屬性返回集合中的菜單項;還可以通過索引(Index)訪問集合中的菜單項;你可以通過集合的Add()、AddRange()向集合中加入菜單項對象,也可以通過Remove()及RemoveAt()等方法刪除集合中的元素等等。

三、菜單項對象(MenuItem)

3.1 簡介

前面介紹過,System.Windows.Forms.MenuItem類封裝了對菜單項目的各種屬性、響應事件及方法的定義,MenuItem對象是形成各種Windows Forms菜單的基本元素。因此,不管是那一種類型的菜單,其中都必須含有菜單項,這樣對我們實際應用才有意義。

在.Net類庫中,所有類型的菜單項都是通過MenuItem類定義的,該類及其父類Menu定義了菜單項的各種成員。有了一個MenuItem對象後,就可以把它加入到任何類型的菜單中使用(如把其加入到MainMenu對象中形成主菜單、加入到ContextMenu對象中形成彈出式菜單而加入到一個MenuItem對象的MenuItems屬性中形成一個下級菜單等)。

3.2 生成MenuItem對象

生成MenuItem (菜單項)對象,可以使用MenuItem類的構造函數。下面分別介紹的MenuItem支持五個常用構造函數:

(1)、MenuItem():該構造函數不含任何參數,其創建一個空菜單項對象,你可以通過其屬性設置菜單的外觀及事件。如下面的代碼:

MenuItem menuItem1 = new MenuItem();

menuItem1.Text = "&File";

(2)、MenuItem(string text):該構造函數含有一個字符串作為參數,這樣你將生成一個文本屬性值為text的菜單項對象。如:

MenuItem menuItem1=new MenuItem(“File”);

(3)、MenuItem(string text,EventHandler onClick):該構造函數將生成一個以字符串text作為文本屬性的菜單項,並且為其Click事件添加一個響應方法。如:

MenuItem menuItem1 = new MenuItem("&New",new System.EventHandler(MenuItem1_Click));

其中MenuItem1_Click()函數定義如下:

private void MenuItem1_Click(object sender, System.EventArgs e)
{
}

(4)、MenuItem(string text,MenuItem[] items):構造函數將生成一個以字符串text文本的菜單項,同時將把第二個參數菜單項數組中的各項作為該菜單項的子菜單。如下面的代碼將添加一個文本顯示為Color且包含三個子菜單的菜單項:

MenuItem menu1=new MenuItem(“Red”);

MenuItem menu2=new MenuItem(“Blue”);

MenuItem menu3=new MenuItem(“Black”);

MenuItem menuItem1 = new MenuItem("&Colors",new MenuItem[]{menu1,menu2,menu3});

(5)、MenuItem(string text,EventHandler onClick,Shortcut shortcut):該構造函數包含三個參數,其中一個文本框,一個EventHandler代表及一個快捷訪問鍵。該構造函數將生成一個文本為Text,快捷鍵為shortcut的菜單項,並且為該菜單項的Click事件添加一個響應方法。如下面代碼將生成一個菜單項文本顯示為New,Click事件響應方法為MenuItem1_Click(),訪問快捷鍵為Alt+N及Ctrl+L的菜單項:

MenuItem MenuItem1 = new MenuItem("&New",new System.EventHandler(MenuItem1_Click),Shortcut.CtrlL);

3.3 使用MenuItem對象屬性

在.Net Windows Forms中,所有類型的菜單項目都是MenuItem對象。那麼如何表現豐富多彩的菜單外觀呢?在這裡,MenuItem類為我們提供了所有這方面的屬性,以供你有實際項目中應用。通過這些屬性,你可以定義選擇菜單、命令菜單、菜單分隔符及菜單了下級菜單等。這些屬性設置一般都是非常簡單的,你只要選擇你的菜單項是否是屬於某一類型的菜單(true or false)即可。如下面的代碼使菜單項menuItem1的前面有一個“√”:

menuItem1.Checked=true;

下面簡單介紹MenuItem中比較有用的屬性:

(1)、BarBreak屬性

如果其值為True,表示當前菜單項將換到下一欄顯示,並有一條分隔線。

(2)、Break屬性

如果其值為True,表示當前菜單項將換到下一欄顯示,沒有分隔線。

(3)、Checked屬性

其表示當前的菜單項是否被選中。如果一個菜單項被選取中,菜單的前面將有一個“√”。

(4)、DefaultItem屬性

該屬性如果為真表示當前菜單項是一個默認菜單,並用粗體顯示。一個菜單如果是默認菜單,則當你雙擊該菜單項屬的主菜單時,該菜單將被選中。

(5)、Enabled屬性

用於設置當前菜單項是否可用,當Enalbed為true時,菜單項可用,否則將顯示成為恢色的形式且你不可以點擊。

(6)、Index屬性

該屬性其返回一個int型數據表示該菜單所在主菜單中的序號。

(7)、IsParent屬性

該屬性返回當前菜單是否包含有子菜單,如果有則返回true。

(8)、MenuID屬性

返回當前菜單項的ID值。

(9)、Parent屬性

該屬性返回一個Menu類數據表示當前菜單的父菜單。注意:Menu類是所有菜單位類的基類。

(10)、Shortcut屬性

該屬性用於訪問及設置菜單項的快捷鍵。

(11)、ShowShortcut屬性

布爾類型,用於訪問及設置是否要在當前菜單中顯示快捷鍵,果為true則顯示,系統默認值為true。

(12)、Text屬性

表示菜單項的顯示文本。如果在顯示文本中加一個”&”字符表示其後的鍵為菜單項的快捷訪問鍵,此時“&”後面的字符將顯示成下劃線的形式。如:“&File”表示使用Alt+F快捷訪問菜單。而文本為“-”時,表示此菜單項項為一條橫線,這一特性經常用於菜單顯示外觀設計中用到。

(13)、Visible屬性

布爾類型,表示菜單項是否可見,如該值設為false將隱藏菜單。系統默認值為true。

3.4 示例程序

下面我們用Visual Studio .Net專門寫了一個演示MenuItem (菜單項)對像豐富外觀特性的程序,其中關鍵的代碼及注釋如下:

private void button1_Click(object sender, System.EventArgs e)
{
MenuItem menu1=new MenuItem("彈出菜單一");//生成一個菜單項
MenuItem menu2=new MenuItem("彈出菜單二");
MenuItem menu3=new MenuItem("-");//菜單分隔線
MenuItem menu4=new MenuItem("彈出菜單三");
MenuItem menu5=new MenuItem("彈出菜單四");
menu1.Checked=true;//在菜單前面打一√
menu2.BarBreak=true;//斷開並分欄
menu2.Enabled=false;//此菜單項不可用,呈恢色顯示
menu4.Shortcut=Shortcut.Alt1;//給菜單定義一個快捷訪問鍵
menu4.ShowShortcut=true;//在菜單上顯示快捷鍵
file://把前面的菜單作為菜單項添加成為當前窗體的子菜單
this.ContextMenu=new ContextMenu(new MenuItem[]{menu1,menu2,menu3,menu4,menu5});//為當前窗體添加彈出式菜單
}

程序運行將有一個主菜單,主菜單的各項屬性有所不同。通過點擊“添加彈出菜單”按鈕可以為窗體添加彈出菜單,此時在窗體上點右鍵可以查看我們所添加的彈出菜單各項效果。如下圖所示:

四、為窗體添加菜單

4.1 添加主菜單

在.NET的System.Windows.Forms.Form(窗體)類中,有一個類型為MainMenu的屬Menu,你只需要把一個MainMenu對象賦值給窗體的Menu屬性即可以為窗體添加主菜單。

當使有MainMenu()構造生成主菜單對象時,主菜單對象中沒有任何菜單,你可以直接通過主菜單對象(MainMenu)的MenuItems集合來管理(添加或者刪除)菜單項,然後該對象直接賦給窗體的Menu屬性即可在窗體上看到主菜單。如下面的語句為當前窗體添加有一個菜單項“File”的主菜單:

MainMenu Menu1=new MainMenu();

Menu1.MenuItems.Add(new MenuItem(“File”));

this.Menu=Menu1;

當使用MainMenu(MenuItem[])構造函數生成主菜單對象時,主菜單對象將包含由參數菜單項對象中指定的一系列子菜單。如下面的代碼為當前窗體添加有兩個菜單項(“File”及“Edit”)的主菜單:

MainMenu Menu1=new MainMenu(new MenuItem[]{new MenuItem(“File”),new MenuItem(“Edit”)});

this.Menu=Menu1;

訪問一個窗體的主菜單有兩種方法:

首先,可以通過一個主菜單(MainMenu)對象的MenuItems集合進行。通過MenuItems集合的索引,可以定位到一個具體的菜單項。然後你可以給菜單項添加事件響應方法或是改變菜單項的一些屬性等操作。例如,下面我們把主菜單對象mainMenu1賦以窗體後,你可以通過下面語句訪問主菜單第一項的文本屬性值:

mainMenu1.MenuItems[0].Text=“Files”;

其次,你也可以通過窗體(Form)的Menu屬性對主菜單的項進行操作。Form類的Menu屬性返回的是一個MainMenu對象,由於對象是引類型數據,因此兩種操作的實質上都是指向同一個對象的。如上面表示第一項主菜單項文本的語句也可以如下表示:

this.Menu.MenuItems[0].Text=“Files”;

一般情況下,如果你用Visual Studio .Net開發你的程序,在工具欄中有一個MainMenu的控件,用於添加主菜單,你可以直接把該控件添加到設計窗體中,然後非常簡單的菜單項上輸入菜單文本就可以啦。如下所示:

4.2 添加子菜單

在.Net中,菜單項對象模型其實是一個樹狀的。一個菜單可以通過在其MenuItems集合中添加菜單項,使其擁有下級子菜單;子菜單同樣還可以通過相同的方法添加更下一級子菜單。

一個菜單項對象的MenItems將返回一個Menu.MenuItemCollection集合,通過這個集合可以非常方便的管理其中的元素,例如:要添加一個子菜單只需要使用集合的Add()或者AddRange()方法,刪除一個項只需要使用Remove()或者是RemoveAt()即可。

下面的代碼將為窗體添加一個主菜單,並在主菜單的第一項添加子菜單:

MainMenu Menu1=new MainMenu(new MenuItem[]{new MenuItem(“File”),new MenuItem(“Edit”),new MenuItem(“Tools”)});

this.Menu=Menu1;

MenuItem subMenu1=new MenuItem(“New”);

MenuItem subMenu2=new MenuItem(“Open”);

MenuItem subMenu3=new MenuItem(“Save”);

this.Menu.MenuItems[0].MenuItems.Add(subMenu1);

this.Menu.MenuItems[0].MenuItems.AddRange(new MenuItems[]{subMenu2,subMenu3});//使用AddRange()方法添加集合元素

其中this.Menu.MenuItem[0]表示主菜單項1,而this.Menu.MenuItem[0].MenuItems表示主菜單項1下面的子菜單。

4.3 添加彈出式菜單

在.Net中,System.Windows.Forms.Control類是除菜單外的所有窗體控件及可視化元素的基類,在該類中有一個ContextMenu類型的屬性ContextMenu,通過設置該屬性可以為控件或窗體添加彈出式菜單。方法非常簡單,你只需要創建一個ContextMenu對象,並把該對象賦給窗體或控件的ContextMenu屬性即可。

前面我們介紹了ContextMenu類有兩個構造函數,使用兩個構造函數,與MainMenu類似,我們可以通過下面兩種方法為控件或窗體添加彈出式菜單。

第一種方法,使用ContextMenu()產生一個不含任何菜單項的ContextMenu(彈出菜單)對象,然後通過該對象的MenuItems屬性管理菜單項,如下面的語句為窗體及按鈕添加同樣的彈出菜單:

ContextMenu Menu1=new ContextMenu();

Menu1.MenuItems.Add(new MenuItem(“彈出菜單一"));

Menu1.MenuItems.Add(new MenuItem(“彈出菜單二"));

this.ContextMenu=Menu1;

button1.ContextMenu=Menu1;

第二種方法是使用ContextMenu(MenuItem[] menus)構造函數直接生成具有一系列菜單項的彈出式菜單。如下面的例子:

MenuItem menu1=new MenuItem("彈出菜單一");//生成一個菜單項

MenuItem menu2=new MenuItem("彈出菜單二");

MenuItem menu3=new MenuItem("-");//菜單分隔線

MenuItem menu4=new MenuItem("彈出菜單三");

this.ContextMenu=new ContextMenu(new MenuItem[]{menu1,menu2,menu3,menu4,menu5});//為當前窗體添加彈出式菜單

在使用過程中,你還可以通過ContextMenu對象的RightToLeft設置菜單的排列方式,通過SourceControl查看所顯示彈出菜單所對應的控件等,還可以通過直接使用對象的Show()方法強制顯示彈出菜單等。

以主菜單(MainMenu)對象相似,要訪問一個彈出菜單的具體菜項,你可以直接通過Menu.MenuItemCollection集合進行。如下面的語句:

Menu1.MenuItems[0].Text="Test";

this.ContextMenu.MenuItems[0].Text="Test";

五、響應菜單事件

在菜單編程中,我們需要點擊菜單項使程序執行一個命令或者是改變菜單的狀態等。這樣才能使菜單與用戶達到有好的交互。這就需要編寫菜單事件的響應函數,使其執行相應的功能。

在Windows Forms中,MenuItem為我們提供了很多的事件,比如當你在菜單項上點擊時引發的Click事件,在拖動菜單項時引發的DrawItem事件及當選擇菜單項時引發的Select事件等。通過為這些事件編寫響應方法,我們就可以使用菜單來控制程序了。

那麼如何為一個事件添加響應方法呢?在C#中,增加了一個新的數據類型delegate(代表)來解決事件處理問題。代表數據類型非常類似於C語言中的指針,其與指針不同的是,其是代碼是安全的,可管理的。通過使用delegate(代表),你可以通過“+=”(加等於)操作符非常容易地為.Net對象中的一個事件添加一個甚至多個響應方法;還可以通過非常簡單的“-=”(減等於)操作符取消這些響應方法。如下面為一個按鈕(button1)Click事件添加響應方法的代碼:

button1.Click+= new System.EventHandler(Test);

其中Test函數說明如下:

private void Test(object sender, System.EventArgs e)
{
file://想要執行的具體代碼。
}

在上面對事件響應方法Test()的定義中,有兩個參數,一個分別表示引發事件的對象(object)sender,由於引發事件的對象不可預知的,因此我們把其聲明成為object類型,所有的對象都適用;另一個代表引發事件的具體信息(如引發事件時鼠標的x,y值等),由於各種類型的事件中可能不同,這要根據類中事件成員的說明決定。那麼在編程中怎麼知道使用哪種類型呢,這可以通過查看類中事件的聲明,如上面對於Button類Click事件的定義(該定義直接從Control中繼承):

public event EventHandler Click;

在上面聲明事件的語句中,Eventhandler是一個delegate(代表)類型,其是如下定義的:

public delegate void EventHandler(object sender,EventArgs e);

與所有的.Net對象一樣,要為一個菜單項添加Click事件的響應方法也可以通過類似的方法進行,如下所示:

this.Menu=new MainMenu(new MenuItem[]{new MenuItem(“File”),new MenuItem(“Edit”)});
this.Menu.MenuItems[0].Click+= new System.EventHandler(Test);
this.Menu.MenuItems[0].Click+= new System.EventHandler(menuItem2_Click);
private void Test(object sender, System.EventArgs e)
{
file://想要執行的具體代碼。
}
private void MenuItem2_Click(object sender, System.EventArgs e)
{
MessageBox.Show("你點擊了第二個菜單項","提示信息");//彈出一個對話框,顯示提示信息。
}

這樣,當你點擊菜單項時,程序可以執行相應的功能。而要為一個菜單項(如menuItem1)添加DrawItem(拖動)事件響應方法,則可以通過下面的語句實現:

menuItem1.DrawItem+=new System.Windows.Forms.DrawItemEventHandler(MyMethod);//menuItem1為MenuItem對象
private void MyMethod(object sender,DrawItemEventArgs e)//注意函數的弟二個參數
{
MessageBox.Show("DrawItem事件引發了","提示信息");//彈出一個對話框,顯示提示信息。
}

前面我們講了菜單項是構成各種菜單的基本元素,由於我們添加事件響應方法是直接通過訪問菜單項進行的,因此為菜單添加事件響應方法與主菜單或彈出式菜單無關。

六、綜合實例

最後,我們使用Visual Studio .Net開發了一個涉及到菜單操作各方面的實例程序,該程序演示了如何通過C#代碼在Windows Forms窗體中添加主菜單、如何為窗體添加彈出式菜單、為菜單項添加事件響應方法及管理各菜單項並存取其屬性值等。

下面列出其中部份關鍵的代碼及注釋:

private void InitializeComponent()//自定義窗體類初始化函數,Visual Studio ..Net自動產生
{
//這裡只列出了部份代碼
this.button4.Text = "刪除彈出菜單";
this.button4.Click += new System.EventHandler(this.button4_Click);
this.button1.Text = "添加主菜單";
this.button1.Click += new System.EventHandler(this.button1_Click);
this.button2.Text = "添加彈出菜單";
this.button2.Click += new System.EventHandler(this.button2_Click);
this.button3.Click += new System.EventHandler(this.button3_Click);
}
private void button1_Click(object sender, System.EventArgs e)////當用戶點擊按鈕button1(添加主菜單)時執行該方法
{
MenuItem menuItem1=new MenuItem();
MenuItem menuItem2=new MenuItem();
MenuItem menuItem3=new MenuItem();
MenuItem menuItem4=new MenuItem();
MainMenu mainMenu1=new MainMenu();
// 設置菜單項的顯示文本.
menuItem1.Text = "Edit";
menuItem2.Text = "Font Size";
menuItem3.Text = "Small";
// 設置菜單項的Checked屬性為true
menuItem3.Checked = true;
// 為菜單定義一個快捷訪問鍵.
menuItem3.Shortcut = Shortcut.CtrlS;
// 設置菜單項文本
menuItem4.Text = "Large";
// 為菜單定義一個快捷訪問鍵.
menuItem4.Shortcut = Shortcut.CtrlL;
// Set the index of the menu item so it is placed below the first submenu item.
menuItem4.Index = 1;
// 把菜單menuItem3及menuItem3加到menuItme2的子菜單中.
menuItem2.MenuItems.Add(menuItem3);
menuItem2.MenuItems.Add(menuItem4);
// 把菜單menuItem2加為菜單一的子菜單
menuItem1.MenuItems.Add(menuItem2);
// 為窗體添加主菜單
mainMenu1.MenuItems.Add(new MenuItem("File"));
mainMenu1.MenuItems.Add(menuItem1);
mainMenu1.MenuItems.Add(new MenuItem("View"));
mainMenu1.MenuItems.Add(new MenuItem("Tools"));
mainMenu1.MenuItems.Add(new MenuItem("Windows"));
this.Menu=mainMenu1;
file://為部份菜單項添加Click事件響應方法
this.Menu.MenuItems[0].Click+=new System.EventHandler(this.Test);
menuItem3.Click+=new System.EventHandler(this.Test);
this.Menu.MenuItems[2].Click+=new System.EventHandler(this.Test);
}
private void button2_Click(object sender, System.EventArgs e)//當用戶點擊按鈕button2(添加彈出菜單)時執行該方法
{
file://為當前窗體添加彈出式菜單
this.ContextMenu=new ContextMenu(new MenuItem[]{new MenuItem("PopMenu1"),new MenuItem("PopMenu2"),new MenuItem("PopMenu3"),new MenuItem("PopMenu4")});
file://設置彈出菜單第一項的Click事件響應方法為Test()
this.ContextMenu.MenuItems[0].Click+=new System.EventHandler(this.Test);
}
private void button3_Click(object sender, System.EventArgs e)//當用戶點擊按鈕button3(刪除主菜單)時執行該方法
{
try
{
MenuItem temp=new MenuItem();
file://把窗體主菜單的最後一項賦給temp對象,注意對象是引用類型
temp=this.Menu.MenuItems[this.Menu.MenuItems.Count-1];
file://顯示刪除的提示信息
MessageBox.Show("將要刪除了菜單:"+temp.Text,"提示信息!");
file://刪除主菜單
this.Menu.MenuItems.Remove(temp);
}
catch
{
MessageBox.Show("操作無效,可能是已經沒有菜單供您刪除!","提示信息");
}
}
private void button4_Click(object sender, System.EventArgs e)//當用戶點擊按鈕button4(刪除彈出菜單)時執行該方法
{
try
{
MenuItem temp=new MenuItem();
file://取得當前窗體彈出菜單的最後一項的引用
temp=this.ContextMenu.MenuItems[this.ContextMenu.MenuItems.Count-1];
file://顯示提示信息
MessageBox.Show("將要刪除了菜單:"+temp.Text,"提示信息!");
// 刪除最彈出菜單的最後一項
this.ContextMenu.MenuItems.Remove(temp);
}
catch
{
MessageBox.Show("操作無效,可能是已經沒有菜單供您刪除!","提示信息");
}
}
private void Test(object sender,System.EventArgs e)
{
file://當執行時彈出提示信息顯示框,注意此句中對sender對象的強制類型轉換
MessageBox.Show("你通過菜單:"+((MenuItem)sender).Text+"執行本程序!","提示信息");
}

執行該程序將為顯示一個沒有任何菜單的窗體,你可以通過按鈕為窗體添加主菜單及彈出式菜單,還可以通過按鈕逐個刪除菜單項,點擊部份菜單項還會看到其Click事件響應方法的運行的提示信息等。如下圖所示:

總結:

通過學習我們知道,.Net為我們提供了一系列關於菜單程序設計的類,通過這些類你可以構建基本上所有的菜單應用程序。

在.Net中,主菜單及彈出式菜單分別是由MainMenu及ContextMenu類定義;所有的菜單都是由菜單項(MenuItem類)構成,也就是說不管是哪一種類型的菜單,其基本的元素都是MenuItem對象。

除了部分類(如集合類)以外,在Windows Forms中,大部分菜單相關的類都是由Menu類繼承而來,在Menu中提供了一個MenuItems的菜單項目集合,通過其可以達到非常方便的管理一個菜單系列中的菜單項(如添加、刪除等),還可以構建一個菜單項的下級子菜單等。

與.Net中的其它所有對象一樣,要控制菜單執行相應的程序,需要為菜單對象添加事件的響應方法。

最後,大家可以看到,在C# Windows Forms程序中,菜單的使用是非常靈活的,而且結構也是很清晰的。靈活掌握菜單各種類的關系及使用方法,將會使你在Windows Forms中編寫菜單程序中得心應手。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved