五.繪制個性化菜單
先執行以下操作步驟下列步驟是通過菜單編輯器設計一個簡單的菜單為後面重新繪制做基礎
啟動Visual Studio Net
選擇菜單【文件】|【新建】|【項目】後彈出【新建項目】對話框
將【項目類型】設置為【Visual Basic項目】
將【模板】設置為【Windows應用程序】
在【名稱】文本框中輸入【自己畫菜單】
在【位置】的文本框中輸入【E:\VSNET項目】然後單擊【確定】按鈕這樣在E:\VSNET項目目錄中就產生了名稱為自己畫菜單的文件夾並在裡面創建了名稱為自己畫菜單的項目文件
把Visual Studio Net的當前窗口切換到【Formvb(設計)】窗口並從【工具箱】中的【Windows窗體組件】選項卡中往Form窗體中拖入下列組件
一個MainMenu組件名稱為MainMenu
選中MainMenu組件單擊鼠標右鍵在彈出的菜單中選擇編輯菜單並按照圖所示界面設計菜單
圖【自己畫菜單】項目設計界面之一
此時保存上述步驟並單擊快捷鍵F則得到圖所示界面
圖【自己畫菜單】運行界面之一
這樣通過菜單編輯器就完成了一個非常普通的菜單下面就對此菜單進行改造在改造之前要先設定項目中的三個MenuItem類實例的OwnerDraw屬性值為True因為只有此屬性值為True才會觸發繪制菜單時所需要的DrawItem事件和MeasureItem事件之後再在上面項目的基礎上執行下一步操作
把Visual Stuido Net的當前窗口切換到Formvb的代碼編輯窗口並在InitializeComponent過程之後添加下列代碼下列代碼是繪制文件菜單項其作用是改變文件菜單項的字體大小和菜單項的其具體的繪制方法請參考下列代碼中的注釋
Private Sub MenuItem_DrawItem ( ByVal sender As Object ByVal e As SystemWindowsFormsDrawItemEventArgs ) Handles MenuItemDrawItem
Dim rfBound As RectangleF = New RectangleF ( eBoundsX eBoundsY eBoundsWidth eBoundsHeight )
根據DrawItemEventArgs參數獲得菜單項矩形區域並存儲到RectangleF類型實例中
Dim rfBound As Rectangle = New Rectangle ( eBoundsX eBoundsY eBoundsWidth eBoundsHeight )
根據DrawItemEventArgs參數獲得菜單項矩形區域並存儲到Rectangle類型實例中
Rectangle類型實例和RectangleF類型實例差不多但在後面代碼中繪制菜單的函數是有區別的
eGraphicsFillRectangle(New SolidBrush(ColorLightGreen) rfBound)
以LightGreen色彩填充MenuItem菜單項對應的矩形區域
Dim s As MenuItem = CType ( sender MenuItem )
Dim s As String = sText
獲得MenuItem菜單項的名稱
Dim sfTemp As StringFormat = New StringFormat ( )
sfTempAlignment = StringAlignmentCenter
設定要畫的菜單名稱的對齊方式中間對齊
eGraphicsDrawString ( s New Font ( 宋體 FontStyleBold ) New SolidBrush ( ColorBlack ) rfBound sfTemp )
以中間對齊方式指定字體大小在指定的矩形區域重畫菜單
If eState = ( DrawItemStateNoAccelerator Or DrawItemStateSelected ) Then
根據菜單項的當前繪制狀態來繪制菜單項
eGraphicsFillRectangle ( New SolidBrush ( ColorLightYellow ) rfBound )
對菜單項所在的矩形區域進行色彩填充
eGraphicsDrawString ( s New Font ( 宋體 FontStyleBold ) New SolidBrush ( ColorBlack ) rfBound sfTemp )
對菜單項名稱繪制
End If
eDrawFocusRectangle ( )
在 DrawItemEventArgs參數得到矩形范圍內繪制聚焦框
eGraphicsDrawRectangle ( New Pen ( New SolidBrush ( ColorBlack ) ) rfBound )
對菜單項的矩形區域繪制矩形框
End Sub
操作完成後保存修改此時再單擊快捷鍵F運行程序可得到如圖所示的界面
圖【自己畫菜單】運行界面之二
可見繪制的文件菜單項並沒有完全顯示出來並且後面的菜單項也沒有顯示這是因為菜單項的顯示區域並沒有設定而缺省的空間又不能完全顯示造成的設定菜單項的顯示區域大小是通過MeasureItem事件來完成的具體操作是在MenuItem的DrawItem事件後添加下列代碼下列代碼是是定義MenuItem的MeasureItem事件在此事件中設定菜單項的寬度(當然也可以設定高度等)
Private Sub MenuItem_MeasureItem ( ByVal sender As Object ByVal e As SystemWindowsFormsMeasureItemEventArgs ) Handles MenuItemMeasureItem
eItemWidth =
設定菜單項的寬度
End Sub
保存上述修改後單擊快捷鍵F運行程序可得到圖所示界面
圖【自己畫菜單】運行界面之三
可見文件菜單項就算繪制出來了由於其他菜單項沒有繪制處理所以也未顯示其他菜單項的繪制方法和文件菜單項的繪制方法基本相似以下是在上述完成的基礎上對其他菜單項進行繪制從而得到圖所示菜單的具體實現步驟
圖【自己畫菜單】運行界面之四
在Formvb中的MenuItem的MeasureItem事件處理程序之後添加下列代碼下列代碼是定義MenuItem的DrawItem事件其功能是對新建菜單項重新繪制
Private Sub MenuItem
_DrawItem ( ByVal sender As Object
ByVal e As System
Windows
Forms
DrawItemEventArgs ) Handles MenuItem
DrawItem
Dim rfBound As RectangleF = New RectangleF ( e
Bounds
X
e
Bounds
Y
e
Bounds
Width
e
Bounds
Height )
根據DrawItemEventArgs參數獲得菜單項矩形區域並存儲到RectangleF類型實例中
Dim rfBound
As Rectangle = New Rectangle ( e
Bounds
X
e
Bounds
Y
e
Bounds
Width
e
Bounds
Height )
根據DrawItemEventArgs參數獲得菜單項矩形區域並存儲到Rectangle類型實例中
Rectangle類型實例和RectangleF類型實例差不多
但在後面代碼中繪制菜單的函數是有區別的
e
Graphics
FillRectangle ( New SolidBrush ( Color
LightGray )
rfBound )
Dim s As MenuItem = CType ( sender
MenuItem )
Dim s
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
=
e
Graphics
DrawString ( s
New Font (
宋體
)
New SolidBrush ( Color
Blue )
rcText
sfTemp )
e
Graphics
DrawRectangle ( New Pen ( New SolidBrush ( Color
LightGray ) )
rfBound
)
If e
State = ( DrawItemState
NoAccelerator Or DrawItemState
Selected ) Then
e
Graphics
FillRectangle ( New SolidBrush ( Color
LightYellow )
rfBound )
e
Graphics
DrawString ( s
New Font (
宋體
FontStyle
Bold Or FontStyle
Underline )
New SolidBrush ( Color
Red )
rcText
sfTemp )
e
Graphics
DrawRectangle ( New Pen ( New SolidBrush ( Color
Black ) )
rfBound
)
e
DrawFocusRectangle ( )
End If
End Sub
MenuItem的DrawItem事件處理代碼之後添加下列代碼下列代碼是定義MenuItem的MeasureItem事件在此事件中實現設定新建菜單項的長度和高度
Private Sub MenuItem
_MeasureItem ( ByVal sender As Object
ByVal e As System
Windows
Forms
MeasureItemEventArgs ) Handles MenuItem
MeasureItem
e
ItemWidth =
設定菜單項的寬度
e
ItemHeight =
設定菜單項的高度
End Sub
在完成上述操作步驟後再在MenuItem的MeasureItem事件處理程序之後添加下列代碼下列代碼是定義MenuItem的DrawItem事件其功能是對打開菜單項重新繪制
Private Sub MenuItem
_DrawItem ( ByVal sender As Object
ByVal e As System
Windows
Forms
DrawItemEventArgs ) Handles MenuItem
DrawItem
Dim rfBound As RectangleF = New RectangleF ( e
Bounds
X
e
Bounds
Y
e
Bounds
Width
e
Bounds
Height )
根據DrawItemEventArgs參數獲得菜單項矩形區域並存儲到RectangleF類型實例中
Dim rfBound
As Rectangle = New Rectangle ( e
Bounds
X
e
Bounds
Y
e
Bounds
Width
e
Bounds
Height )
根據DrawItemEventArgs參數獲得菜單項矩形區域並存儲到Rectangle類型實例中
Rectangle類型實例和RectangleF類型實例差不多
但在後面代碼中繪制菜單的函數是有區別的
Dim s As MenuItem = CType ( sender
MenuItem )
Dim s
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
=
e
Graphics
DrawString ( s
New Font (
Veranda
)
New SolidBrush ( Color
Blue )
rcText
sfTemp )
e
Graphics
DrawRectangle ( New Pen ( New SolidBrush ( Color
LightGray ) )
rfBound
)
If e
State = ( DrawItemState
NoAccelerator Or DrawItemState
Selected ) Then
e
Graphics
FillRectangle ( New SolidBrush ( Color
LightYellow )
rfBound )
e
Graphics
DrawString ( s
New Font (
Veranda
FontStyle
Bold Or FontStyle
Underline )
New SolidBrush ( Color
Red )
rcText
sfTemp )
e
Graphics
DrawRectangle ( New Pen ( New SolidBrush ( Color
Black ) )
rfBound
)
e
DrawFocusRectangle ( )
End If
End Sub
MenuItem的DrawItem事件處理代碼之後添加下列代碼下列代碼是定義MenuItem的MeasureItem事件在此事件中實現設定新建菜單項的長度和高度
Private Sub MenuItem
_MeasureItem ( ByVal sender As Object
ByVal e As System
Windows
Forms
MeasureItemEventArgs ) Handles MenuItem
MeasureItem
e
ItemWidth =
設定菜單項的寬度
e
ItemHeight =
設定菜單項的高度
End Sub
在上述步驟都正確完成後本文介紹的手工繪制菜單就完成此時單擊快捷鍵F運行程序就可以得到圖所示的運行界面
六.總結
本文主要內容是介紹VBNET設計和創建菜單其中不僅介紹了使用菜單設計器來靜態設計菜單還介紹了使用MainMenu類MenuItem類和ContextMenu類動態創建菜單的實現方法在動態創建時首先要了解要創建的菜單類型是下拉菜單首先要創建一個MainMenu實例是彈出菜單首先要創建一個ContextMenu實例然後根據菜單中的組成結構即菜單項中的父子關系創建出相應菜單最後就是顯示出菜單如果是下拉菜單指派給Form的Menu屬性如果是彈出菜單指派給可視組件或Form的ContextMenu屬性這樣動態創建菜單才能夠顯示出來動態創建菜單的工作才算完成
此外還介紹了在Visual Basic Net中繪制個性化菜單的實現方法和注意事項在繪制個性化菜單時最重要的是掌握DrawItem事件和MeasureItem事件用法及繪制菜單時所要使用到的方法雖然本文繪制的菜單並不美觀但你可以通過本文介紹的方法來修改從而實現更美觀更有個性的菜單最後請記住在繪制菜單時首先把菜單項的OwnerDraw屬性設定為True
[] [] []
From:http://tw.wingwit.com/Article/program/net/201311/15454.html