可視化編程工具中一般都附帶菜單設計器,使用它就可以方便、快捷的編輯、設計菜單。本文的主要內容就是介紹使用此菜單設計器設計菜單的具體方法,以及個性化菜單的實現方法。
下面就首先來詳細介紹在VB.NET中設計菜單和處理菜單時的相關問題。
一.使用Visual Basic .Net中的菜單設計器來設計菜單:
VB.NET中提供了菜單設計器,通過菜單設計器就不僅能夠設計下拉菜單,也能夠設計彈出菜單。在VB.NET中菜單是應用程序的一個部分,所以在使用VB.NET中的菜單設計器時,首先要新建一個VB.NET的項目。下面是具體的步驟:
1. 啟動Visual Studio .Net。
2. 選擇菜單【文件】|【新建】|【項目】后,彈出【新建項目】對話框。
3. 將【項目類型】設置為【Visual Basic項目】。
4. 將【模板】設置為【Windows應用程序】。
5. 在【名稱】文本框中輸入【菜單編程】。
6. 在【位置】的文本框中輸入【E:VS.NET項目】,然后單擊【確定】按鈕,這樣在“E:VS.NET項目”目錄中就產生了名稱為“菜單編程”的文件夾,并在里面創建了名稱為“菜單編程”的項目文件。
7. 把Visual Studio .Net的當前窗口切換到【Form1.vb(設計)】窗口,并從【工具箱】中的【Windows窗體組件】選項卡中往Form1窗體中拖入下列組件:
一個MainMenu組件,名稱為“MainMenu1”。
8. 選中“MainMenu1”組件,單擊鼠標右鍵,在彈出的菜單中選擇“編輯菜單”。可得圖01所示界面
 圖01:利用菜單設計器設計下拉菜單
9. 在圖01所示的“請在此處輸入”中,按由上至下順序輸入“文件(&F)”、“新建(&N)”、“-”、“打開(&O)”后,此時設計后的菜單如圖02所示: 
圖02:利用菜單設計器設計后的下拉菜單 在VB.NET中“&”符號和VB中的“&”符號所起的作用完全一致,作用是為菜單設定快捷鍵。“-”符號作用是在菜單項之間設立分割。
10. 這樣一個簡單的下拉菜單就完成了。如果您的應用程序中還需要加入其他菜單,可以仿效上述方法,在圖02中的“請在此處輸入”區域中輸入相應的菜單的名稱就可以了。
下面是就利用Visual Basic .Net的菜單設計器來設計彈出菜單的一般步驟。
1. 在上述項目中,從【工具箱】中的【Windows窗體組件】選項卡中往Form1窗體中拖入一個ContextMenu組件,名稱為ContextMenu1。
2. 選中“ContextMenu1”組件,單擊鼠標右鍵,在彈出的菜單中選擇“編輯菜單”。可得圖03所示界面: 
圖03:利用菜單設計器設計彈出菜單
3. 在圖03所示的“上下文菜單”下的“請在此輸入”中,按由上至下順序輸入“拷貝(&C)”、“剪切(&X)”、“粘貼(&V)”后,此時設計后的菜單如圖04所示:

圖04:利用菜單設計器設計后的彈出菜單 4. 選定Form1的屬性選項卡,并設定Form1的“ContextMenu”的屬性值為“ContextMenu1”。
5. 此時單擊快捷鍵“F5”運行程序,在程序窗體中單擊鼠標右鍵,則彈出上面設計的彈出菜單,具體如圖05所示:  圖05:在應用程序中使用上述設計好的菜單 6. 對于其他組件一般也都有“ContextMenu”屬性,只需把組件的“ContextMenu”屬性值設置為設計好的彈出菜單名稱,這樣當在此組件中單擊鼠標右鍵,就會彈出對應的彈出菜單。 二.MainMenu類、MenuItem類和ContextMenu類:
雖然使用菜單設計器能夠設計出各種菜單,但要真正掌握VB.NET中的菜單編程,還必須了解并靈活使用MainMenu類、MenuItem類和ContextMenu類。其中MainMenu類和ContextMenu類所起的作用是相似的,它們的作用是提供一個菜單項容器,里面可以存放各種菜單項。
MainMenu類表示的是下拉菜單的結構,里面存放的菜單項其實就是MenuItem實例。在創建完MainMenu實例后,必須要把此實例綁定到要顯示此菜單的Form中,下拉菜單才能夠顯示,而要實現這種綁定其實非常簡單,只需把MainMenu實例分配給Form的Menu屬性就可以了。
ContextMenu類表示當用戶在控件或窗體的特定區域上單擊鼠標右鍵時彈出的菜單結構。可視控件和Form窗體一般都有ContextMenu屬性。要顯示ContextMenu實例,只需把ContextMenu實例分配給要顯示此彈出菜單的可視組件或Form窗體的ContextMenu 屬性就可以了。多個組件可共同使用一個ContextMenu實例。 MenuItem類表示的是MainMenu和ContextMenu中的每一個菜單項。顯示創建的MenuItem實例,必須使用MainMenu或ContextMenu中的“Add”方法把MenuItem實例加入。若要創建子菜單,可以使用父MenuItem實例的“Add”方法把MenuItem實例添加到其MenuItems屬性中。
MenuItem類還提供一些屬性用以設定菜單項的外觀和功能。若要顯示菜單項旁邊的選中標記,可以使用Checked 屬性。Shortcut屬性可用于設定此菜單項對應的鍵盤組合鍵。
下面就通過下面一個示例來具體了解上面三個類的使用方法。
三.使用MainMenu類、MenuItem類和ContextMenu類動態創建菜單:
下面就利用mainMenu類、MenuItem類和ContextMenu類動態創建圖05所示的由菜單設計器設計出的菜單,其中包括下拉菜單和彈出菜單。下面是具體步驟:
1. 啟動Visual Studio .Net。
2. 選擇菜單【文件】|【新建】|【項目】后,彈出【新建項目】對話框。
3. 將【項目類型】設置為【Visual Basic項目】。
4. 將【模板】設置為【Windows應用程序】。
5. 在【名稱】文本框中輸入【動態創建菜單】。
6. 在【位置】的文本框中輸入【E:VS.NET項目】,然后單擊【確定】按鈕,這樣在“E:VS.NET項目”目錄中就產生了名稱為“動態創建菜單”的文件夾,并在里面創建了名稱為“動態創建菜單”的項目文件。
7. 把Visual Studio .Net的當前窗口切換到【Form1.vb(設計)】窗口,并從【工具箱】中的【Windows窗體組件】選項卡中往Form1窗體中拖入下列組件,并執行相應操作:
二個Button組件,名稱分別為Button1和Button2,并在這二個組件拖入窗體后,分別設定這二個組件的“Text”屬性值為“創建下拉菜單”和“創建彈出菜單”。之后再分別雙擊,這樣Visual Basic .Net會在Form1.vb中分別產生這二個組件的Click事件對應的處理代碼。
8. 把Visual Basic .Net的當前窗口切換到Form1.vb的代碼編輯窗口,并用下拉代碼替換Form1.vb中的Button1的Click事件對應的處理代碼,下拉代碼的作用是動態創建圖05中的下拉菜單:
Private Sub Button1_Click ( ByVal sender As System.Object , ByVal e As System.EventArgs ) Handles Button1.Click Dim MainMenu1 As MainMenu = New MainMenu ( ) '創建一個MainMenu實例 Dim myMenuItem1 As MenuItem = New MenuItem ( ) Dim myMenuItem2 As MenuItem = New MenuItem ( ) Dim myMenuItem3 As MenuItem = New MenuItem ( ) Dim myMenuItem4 As MenuItem = New MenuItem ( ) myMenuItem1.Text = "文件(&F)" myMenuItem2.Text = "新建(&N)" myMenuItem3.Text = "-" myMenuItem4.Text = "打開(&O)" '創建四個MenuItem實例,并進行相應設置 myMenuItem1.MenuItems.Add ( myMenuItem2 ) myMenuItem1.MenuItems.Add ( myMenuItem3 ) myMenuItem1.MenuItems.Add ( myMenuItem4 ) '以myMenuItem1是myMenuItem2、myMenuItem3和myMenuItem4的父菜單項 MainMenu1.MenuItems.Add ( myMenuItem1 ) '在MainMenu實例中加入MainItem實例 Me.Menu = MainMenu1 '把MainMenu1指派給Form的的Menu屬性,這樣下拉菜單才能夠顯示 Button1.Enabled = False End Sub
9. 用下列代碼替換Form1.vb中的Button2的Click事件對應的處理代碼,下拉代碼的作用是動態創建圖05中的彈出菜單:
Private Sub Button2_Click ( ByVal sender As System.Object , ByVal e As System.EventArgs ) Handles Button2.Click Dim ContextMenu1 As ContextMenu = New ContextMenu ( ) '創建一個ContextMenu實例 Dim myMenuItem1 As MenuItem = New MenuItem ( ) Dim myMenuItem2 As MenuItem = New MenuItem ( ) Dim myMenuItem3 As MenuItem = New MenuItem ( ) myMenuItem1.Text = "拷貝(&C)" myMenuItem2.Text = "剪切(&X)" myMenuItem3.Text = "粘貼(&V)" '創建三個MenuItem實例,并進行相應設置 ContextMenu1.MenuItems.Add ( myMenuItem1 ) ContextMenu1.MenuItems.Add ( myMenuItem2 ) ContextMenu1.MenuItems.Add ( myMenuItem3 ) '在ContextMenu1中加入MenuItem Me.ContextMenu = ContextMenu1 '把ContextMenu1指派給Form的ContextMenu屬性,顯示彈出菜單 Button2.Enabled = False End Sub
10. 至此【動態創建菜單】項目的全部工作就完成了,單擊快捷鍵“F5”運行程序,單擊程序中的【創建下拉菜單】按鈕,則創建出圖04所示的下拉菜單;單擊程序中的【創建彈出菜單】,則動態創建出圖05所示的彈出菜單。
如果您要創建的菜單中的菜單項還有子菜單,可以根據菜單項中的父子關系,把子菜單項加入到父菜單項,然后再把父菜單項加入上一級的菜單項或MainMenu和ContextMenu實例中,下面代碼作用是創建圖06所示的下拉菜單,如果是彈出菜單,其做法類似:
Dim MainMenu1 As MainMenu = New MainMenu ( ) '創建一個MainMenu實例 Dim myMenuItem1 As MenuItem = New MenuItem ( ) Dim myMenuItem2 As MenuItem = New MenuItem ( ) Dim myMenuItem3 As MenuItem = New MenuItem ( ) Dim myMenuItem4 As MenuItem = New MenuItem ( ) Dim myMenuItem5 As MenuItem = New MenuItem ( ) Dim myMenuItem6 As MenuItem = New MenuItem ( ) myMenuItem1.Text = "文件(&F)" myMenuItem2.Text = "新建(&N)" myMenuItem3.Text = "-" myMenuItem4.Text = "打開(&O)" myMenuItem5.Text = "新建項目" myMenuItem6.Text = "新建文件" '創建四個MenuItem實例,并進行相應設置 myMenuItem2.MenuItems.Add ( myMenuItem5 ) myMenuItem2.MenuItems.Add ( myMenuItem6 ) 'myMenuItem2是myMenuItem5和myMenuItem6的父菜單項 myMenuItem1.MenuItems.Add(myMenuItem2) myMenuItem1.MenuItems.Add ( myMenuItem3 ) myMenuItem1.MenuItems.Add ( myMenuItem4 ) '以myMenuItem1是myMenuItem2、myMenuItem3和myMenuItem4的父菜單項 MainMenu1.MenuItems.Add ( myMenuItem1 ) '在MainMenu實例中加入MainItem實例 Me.Menu = MainMenu1
'把MainMenu1指派給Form的的Menu屬性,這樣下拉菜單才能夠顯示  圖06:動態創建存在子菜單的下拉菜單 四..Net Frame Work SDK 為在VB.Net繪制菜單提供的工具:
.Net Frame Work SDK為Visual Basic .Net實現個性化菜單提供了許多工具。其中最重要是二個事件及其參數:DrawItem事件和其中的DrawItemEventArgs參數,MeasureItem事件和其中的MeasureItemEventArgs參數。
1. DrawItem事件和其中的DrawItemEventArgs參數:
DrawItem事件是當菜單項的OwnerDraw屬性設置為True并且發出繪制菜單項的請求時才發生。個性化菜單制作的處理方法就是在此事件中完成的。在DrawItem事件處理程序中將接收一個 DrawItemEventArgs類型的參數,它包含與此事件相關的數據,這些數據對繪制菜單是很重要的。表01是DrawItemEventArgs類型參數提供特定于此事件的信息。
屬性說明 BackColor獲取所繪制的項的背景色。 Bounds 獲取表示所繪制項的邊界的矩形。 Font獲取分配給所繪制項的字體。 ForeColor獲取所繪制項的前景色。 Graphics獲取要在其上繪制項的圖形表面。 Index獲取所繪制項的索引值。 State獲取所繪制項的狀態。 2. MeasureItem事件和其中的MeasureItemEventArgs參數:
觸發MeasureItem事件必須將菜單項的OwnerDraw屬性設置為True,個性化菜單制作可通過此事件來獲取、設定菜單項的大小等。MeasureItem事件處理程序中接收一個MeasureItemEventArgs類型的參數,此參數對獲取、設定菜單項的大小是非常重要的。表02是MeasureItemEventArgs類型參數提供MeasureItem事件的特定信息。
屬性說明 Graphics獲取要測量的Graphics對象。 Index獲取、設置需要有高度和寬度的項索引。 ItemHeight 獲取、設置由Index指定的項高度。 ItemWidth獲取、設置由Index指定的項 表02是MeasureItemEventArgs類型參數提供MeasureItem事件的特定信息
五.繪制個性化菜單:
先執行以下操作步驟,下列步驟是通過菜單編輯器設計一個簡單的菜單,為后面重新繪制做基礎:
1. 啟動Visual Studio .Net。
2. 選擇菜單【文件】|【新建】|【項目】后,彈出【新建項目】對話框。
3. 將【項目類型】設置為【Visual Basic項目】。
4. 將【模板】設置為【Windows應用程序】。
5. 在【名稱】文本框中輸入【自己畫菜單】。
6. 在【位置】的文本框中輸入【E:VS.NET項目】,然后單擊【確定】按鈕,這樣在“E:VS.NET項目”目錄中就產生了名稱為“自己畫菜單”的文件夾,并在里面創建了名稱為“自己畫菜單”的項目文件。
7. 把Visual Studio .Net的當前窗口切換到【Form1.vb(設計)】窗口,并從【工具箱】中的【Windows窗體組件】選項卡中往Form1窗體中拖入下列組件:
一個MainMenu組件,名稱為“MainMenu1”。
8. 選中“MainMenu1”組件,單擊鼠標右鍵,在彈出的菜單中選擇“編輯菜單”。并按照圖01所示界面設計菜單: 
圖07:【自己畫菜單】項目設計界面之一 9. 此時保存上述步驟,并單擊快捷鍵F5,則得到圖08所示界面: 圖08:【自己畫菜單】運行界面之一 這樣通過菜單編輯器就完成了一個非常普通的菜單,下面就對此菜單進行改造,在改造之前,要先設定項目中的三個MenuItem類實例的OwnerDraw屬性值為“True”。因為只有此屬性值為“True”才會觸發繪制菜單時所需要的DrawItem事件和MeasureItem事件。之后再在上面項目的基礎上執行下一步操作:
把Visual Stuido .Net的當前窗口切換到Form1.vb的代碼編輯窗口,并在InitializeComponent過程之后添加下列代碼,下列代碼是繪制“文件”菜單項,其作用是改變“文件”菜單項的字體、大小和菜單項的,其具體的繪制方法請參考下列代碼中的注釋:
Private Sub MenuItem1_DrawItem ( ByVal sender As Object , ByVal e As System.Windows.Forms.DrawItemEventArgs ) Handles MenuItem1.DrawItem Dim rfBound As RectangleF = New RectangleF ( e.Bounds.X , e.Bounds.Y , e.Bounds.Width - 1 , e.Bounds.Height ) '根據DrawItemEventArgs參數獲得菜單項矩形區域并存儲到RectangleF類型實例中 Dim rfBound1 As Rectangle = New Rectangle ( e.Bounds.X , e.Bounds.Y , e.Bounds.Width - 1 , e.Bounds.Height ) '根據DrawItemEventArgs參數獲得菜單項矩形區域并存儲到Rectangle類型實例中 'Rectangle類型實例和RectangleF類型實例差不多,但在后面代碼中繪制菜單的函數是有區別的 e.Graphics.FillRectangle(New SolidBrush(Color.LightGreen), rfBound) '以LightGreen色彩填充MenuItem1菜單項對應的矩形區域 Dim s As MenuItem = CType ( sender , MenuItem ) Dim s1 As String = s.Text '獲得MenuItem1菜單項的名稱 Dim sfTemp As StringFormat = New StringFormat ( ) sfTemp.Alignment = StringAlignment.Center '設定要畫的菜單名稱的對齊方式,中間對齊 e.Graphics.DrawString ( s1 , New Font ( "宋體" , 10 , FontStyle.Bold ) , New SolidBrush ( Color.Black ) , rfBound , sfTemp ) '以中間對齊方式、指定字體、大小,在指定的矩形區域重畫菜單 If e.State = ( DrawItemState.NoAccelerator Or DrawItemState.Selected ) Then '根據菜單項的當前繪制狀態來繪制菜單項 e.Graphics.FillRectangle ( New SolidBrush ( Color.LightYellow ) , rfBound ) '對菜單項所在的矩形區域進行色彩填充 e.Graphics.DrawString ( s1 , New Font ( "宋體" , 10 , FontStyle.Bold ) , New SolidBrush ( Color.Black ) , rfBound , sfTemp ) '對菜單項名稱繪制 End If e.DrawFocusRectangle ( ) '在 DrawItemEventArgs參數得到矩形范圍內繪制聚焦框。 e.Graphics.DrawRectangle ( New Pen ( New SolidBrush ( Color.Black ) , 1 ) , rfBound1 ) '對菜單項的矩形區域繪制矩形框 End Sub
操作完成后,保存修改。此時再單擊快捷鍵F5運行程序,可得到如圖09所示的界面:  圖09:【自己畫菜單】運行界面之二 可見繪制的“文件”菜單項并沒有完全顯示出來,并且后面的菜單項也沒有顯示。這是因為菜單項的顯示區域并沒有設定,而缺省的空間又不能完全顯示造成的。設定菜單項的顯示區域大小是通過MeasureItem事件來完成的。具體操作是在MenuItem1的DrawItem事件后添加下列代碼,下列代碼是是定義MenuItem1的MeasureItem事件,在此事件中設定菜單項的寬度(當然也可以設定高度等):
Private Sub MenuItem1_MeasureItem ( ByVal sender As Object , ByVal e As System.Windows.Forms.MeasureItemEventArgs ) Handles MenuItem1.MeasureItem e.ItemWidth = 60 '設定菜單項的寬度 End Sub
保存上述修改后,單擊快捷鍵F5運行程序可得到圖10所示界面: 
圖10:【自己畫菜單】運行界面之三 可見“文件”菜單項就算繪制出來了,由于其他菜單項沒有繪制處理,所以也未顯示。其他菜單項的繪制方法和“文件”菜單項的繪制方法基本相似,以下是在上述完成的基礎上,對其他菜單項進行繪制,從而得到圖11所示菜單的具體實現步驟: 圖11:【自己畫菜單】運行界面之四 1. 在Form1.vb中的MenuItem1的MeasureItem事件處理程序之后添加下列代碼,下列代碼是定義MenuItem2的DrawItem事件,其功能是對“新建”菜單項重新繪制:
Private Sub MenuItem2_DrawItem ( ByVal sender As Object , ByVal e As System.Windows.Forms.DrawItemEventArgs ) Handles MenuItem2.DrawItem Dim rfBound As RectangleF = New RectangleF ( e.Bounds.X , e.Bounds.Y , e.Bounds.Width - 1 , e.Bounds.Height ) '根據DrawItemEventArgs參數獲得菜單項矩形區域并存儲到RectangleF類型實例中 Dim rfBound1 As Rectangle = New Rectangle ( e.Bounds.X , e.Bounds.Y , e.Bounds.Width - 1 , e.Bounds.Height ) '根據DrawItemEventArgs參數獲得菜單項矩形區域并存儲到Rectangle類型實例中 'Rectangle類型實例和RectangleF類型實例差不多,但在后面代碼中繪制菜單的函數是有區別的 e.Graphics.FillRectangle ( New SolidBrush ( Color.LightGray ) , rfBound ) Dim s As MenuItem = CType ( sender , MenuItem ) Dim s1 As String = s.Text '獲得菜單項對應的文本名稱 Dim sfTemp As StringFormat = New StringFormat ( ) sfTemp.Alignment = StringAlignment.Center '設定文本在矩形區域的對齊方式 sfTemp.LineAlignment = StringAlignment.Center Dim rcText As RectangleF = rfBound rcText.Width -= 5 e.Graphics.DrawString ( s1 , New Font ( "宋體" , 10 ) , New SolidBrush ( Color.Blue ) , rcText , sfTemp ) e.Graphics.DrawRectangle ( New Pen ( New SolidBrush ( Color.LightGray ) ) , rfBound1 ) If e.State = ( DrawItemState.NoAccelerator Or DrawItemState.Selected ) Then e.Graphics.FillRectangle ( New SolidBrush ( Color.LightYellow ) , rfBound ) e.Graphics.DrawString ( s1 , New Font ( "宋體" , 10 , FontStyle.Bold Or FontStyle.Underline ) , New SolidBrush ( Color.Red ) , rcText , sfTemp ) e.Graphics.DrawRectangle ( New Pen ( New SolidBrush ( Color.Black ) ) , rfBound1 ) e.DrawFocusRectangle ( ) End If End Sub
2. MenuItem2的DrawItem事件處理代碼之后添加下列代碼,下列代碼是定義MenuItem2的MeasureItem事件,在此事件中實現設定“新建”菜單項的長度和高度:
Private Sub MenuItem2_MeasureItem ( ByVal sender As Object , ByVal e As System.Windows.Forms.MeasureItemEventArgs ) Handles MenuItem2.MeasureItem e.ItemWidth = 60 '設定菜單項的寬度 e.ItemHeight = 30 '設定菜單項的高度 End Sub
3. 在完成上述操作步驟后,再在MenuItem2的MeasureItem事件處理程序之后添加下列代碼,下列代碼是定義MenuItem3的DrawItem事件,其功能是對“打開”菜單項重新繪制:
Private Sub MenuItem3_DrawItem ( ByVal sender As Object , ByVal e As System.Windows.Forms.DrawItemEventArgs ) Handles MenuItem3.DrawItem Dim rfBound As RectangleF = New RectangleF ( e.Bounds.X , e.Bounds.Y , e.Bounds.Width - 1 , e.Bounds.Height ) '根據DrawItemEventArgs參數獲得菜單項矩形區域并存儲到RectangleF類型實例中 Dim rfBound1 As Rectangle = New Rectangle ( e.Bounds.X , e.Bounds.Y , e.Bounds.Width - 1 , e.Bounds.Height ) '根據DrawItemEventArgs參數獲得菜單項矩形區域并存儲到Rectangle類型實例中 'Rectangle類型實例和RectangleF類型實例差不多,但在后面代碼中繪制菜單的函數是有區別的 Dim s As MenuItem = CType ( sender , MenuItem ) Dim s1 As String = s.Text Dim sfTemp As StringFormat = New StringFormat ( ) sfTemp.Alignment = StringAlignment.Center sfTemp.LineAlignment = StringAlignment.Center Dim rcText As RectangleF = rfBound rcText.Width -= 5 e.Graphics.DrawString ( s1 , New Font ( "Veranda" , 10 ) , New SolidBrush ( Color.Blue ) , rcText , sfTemp ) e.Graphics.DrawRectangle ( New Pen ( New SolidBrush ( Color.LightGray ) ) , rfBound1 ) If e.State = ( DrawItemState.NoAccelerator Or DrawItemState.Selected ) Then e.Graphics.FillRectangle ( New SolidBrush ( Color.LightYellow ) , rfBound ) e.Graphics.DrawString ( s1 , New Font ( "Veranda" , 10 , FontStyle.Bold Or FontStyle.Underline ) , New SolidBrush ( Color.Red ) , rcText , sfTemp ) e.Graphics.DrawRectangle ( New Pen ( New SolidBrush ( Color.Black ) ) , rfBound1 ) e.DrawFocusRectangle ( ) End If End Sub
4. MenuItem3的DrawItem事件處理代碼之后添加下列代碼,下列代碼是定義MenuItem3的MeasureItem事件,在此事件中實現設定“新建”菜單項的長度和高度:
Private Sub MenuItem3_MeasureItem ( ByVal sender As Object , ByVal e As System.Windows.Forms.MeasureItemEventArgs ) Handles MenuItem3.MeasureItem e.ItemWidth = 60 '設定菜單項的寬度 e.ItemHeight = 30 '設定菜單項的高度 End Sub
在上述步驟都正確完成后,本文介紹的手工繪制菜單就完成,此時單擊快捷鍵F5運行。程序就可以得到圖11所示的運行界面。
六.總結:
本文主要內容是介紹VB.NET設計和創建菜單,其中不僅介紹了使用菜單設計器來靜態設計菜單,還介紹了使用MainMenu類、MenuItem類和ContextMenu類動態創建菜單的實現方法。在動態創建時,首先要了解要創建的菜單類型,是下拉菜單,首先要創建一個MainMenu實例;是彈出菜單,首先要創建一個ContextMenu實例。然后根據菜單中的組成結構,即菜單項中的父子關系,創建出相應菜單,最后就是顯示出菜單,如果是下拉菜單,指派給Form的Menu屬性,如果是彈出菜單,指派給可視組件或Form的ContextMenu屬性,這樣動態創建菜單才能夠顯示出來,動態創建菜單的工作才算完成。
此外還介紹了在Visual Basic .Net中繪制個性化菜單的實現方法和注意事項,在繪制個性化菜單時最重要的是掌握DrawItem事件和MeasureItem事件用法,及繪制菜單時所要使用到的方法,雖然本文繪制的菜單并不美觀,但你可以通過本文介紹的方法來修改,從而實現更美觀、更有個性的菜單。最后請記住,在繪制菜單時,首先把菜單項的“OwnerDraw”屬性設定為“True”。
|