熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

VB.NET菜單設計初級入門[3]

2013-11-13 12:13:58  來源: .NET編程 

  五.繪制個性化菜單

  先執行以下操作步驟下列步驟是通過菜單編輯器設計一個簡單的菜單為後面重新繪制做基礎

   啟動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 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 ( ColorLightGray ) rfBound )
 Dim s As MenuItem = CType ( sender MenuItem )
 Dim s As String = sText
 獲得菜單項對應的文本名稱
 Dim sfTemp As StringFormat = New StringFormat ( )
 sfTempAlignment = StringAlignmentCenter
 設定文本在矩形區域的對齊方式
 sfTempLineAlignment = StringAlignmentCenter
 Dim rcText As RectangleF = rfBound
 rcTextWidth =
 eGraphicsDrawString ( s New Font ( 宋體 ) New SolidBrush ( ColorBlue ) rcText sfTemp )
 eGraphicsDrawRectangle ( New Pen ( New SolidBrush ( ColorLightGray ) ) rfBound )
 If eState = ( DrawItemStateNoAccelerator Or DrawItemStateSelected ) Then
  eGraphicsFillRectangle ( New SolidBrush ( ColorLightYellow ) rfBound )
  eGraphicsDrawString ( s New Font ( 宋體 FontStyleBold Or FontStyleUnderline ) New SolidBrush ( ColorRed ) rcText sfTemp )
  eGraphicsDrawRectangle ( New Pen ( New SolidBrush ( ColorBlack ) ) rfBound )
  eDrawFocusRectangle ( )
 End If
End Sub

   MenuItem的DrawItem事件處理代碼之後添加下列代碼下列代碼是定義MenuItem的MeasureItem事件在此事件中實現設定新建菜單項的長度和高度

Private Sub MenuItem_MeasureItem ( ByVal sender As Object ByVal e As SystemWindowsFormsMeasureItemEventArgs ) Handles MenuItemMeasureItem
 eItemWidth =
 設定菜單項的寬度
 eItemHeight =
 設定菜單項的高度
End Sub

   在完成上述操作步驟後再在MenuItem的MeasureItem事件處理程序之後添加下列代碼下列代碼是定義MenuItem的DrawItem事件其功能是對打開菜單項重新繪制

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類型實例差不多但在後面代碼中繪制菜單的函數是有區別的
  Dim s As MenuItem = CType ( sender MenuItem )
  Dim s As String = sText
  Dim sfTemp As StringFormat = New StringFormat ( )
  sfTempAlignment = StringAlignmentCenter
  sfTempLineAlignment = StringAlignmentCenter
  Dim rcText As RectangleF = rfBound
  rcTextWidth =
  eGraphicsDrawString ( s New Font ( Veranda ) New SolidBrush ( ColorBlue ) rcText sfTemp )
  eGraphicsDrawRectangle ( New Pen ( New SolidBrush ( ColorLightGray ) ) rfBound )
  If eState = ( DrawItemStateNoAccelerator Or DrawItemStateSelected ) Then
   eGraphicsFillRectangle ( New SolidBrush ( ColorLightYellow ) rfBound )
   eGraphicsDrawString ( s New Font ( Veranda FontStyleBold Or FontStyleUnderline ) New SolidBrush ( ColorRed ) rcText sfTemp )
   eGraphicsDrawRectangle ( New Pen ( New SolidBrush ( ColorBlack ) ) rfBound )
   eDrawFocusRectangle ( )
  End If
End Sub

   MenuItem的DrawItem事件處理代碼之後添加下列代碼下列代碼是定義MenuItem的MeasureItem事件在此事件中實現設定新建菜單項的長度和高度

Private Sub MenuItem_MeasureItem ( ByVal sender As Object ByVal e As SystemWindowsFormsMeasureItemEventArgs ) Handles MenuItemMeasureItem
 eItemWidth =
 設定菜單項的寬度
 eItemHeight =
 設定菜單項的高度
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
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.