啟動Visual Studio Net
選擇菜單文件|新建|項目,將彈出新建項目對話框。
將項目類型設置為Visual Basic項目。
將模板設置為Windows應用程序。
在名稱文本框中輸入您自己的菜單。
在該位置的文本框中輸入E:\ VS . NET項目,然後單擊OK按鈕,這樣在E:\ VS . NET項目目錄中就會創建壹個名為Draw Menu for Yourself的文件夾,並在其中創建壹個名為Draw Menu for Yourself的項目文件。
將Visual Studio Net的當前窗口切換到窗體vb(設計)窗口,並將以下組件從工具箱的“Windows窗體組件”選項卡拖動到窗體中。
主菜單組件名為MainMenu。
選擇MainMenu組件,單擊鼠標右鍵,從彈出菜單中選擇編輯菜單,按照圖中所示界面設計菜單。
自己畫菜單項的設計界面之壹。
此時保存以上步驟,點擊快捷鍵F,得到如圖界面。
自己畫壹個菜單運行界面。
這樣就通過菜單編輯器完成了壹個很普通的菜單,下面的菜單就被改造了。在改革之前,項目中MenuItem類的三個實例的OwnerDraw的屬性值要設置為True,因為只有當這個屬性值為True時,才會觸發繪制菜單所需的DrawItem事件和MeasureItem事件,然後在上述項目的基礎上進行下壹步操作。
將Visual Stuido Net的當前窗口切換到Form vb的代碼編輯窗口,並在InitializeComponent過程後添加以下代碼。下面的代碼用於繪制文件菜單項,其作用是改變文件菜單項的字體大小及其具體的繪制方法。請參考下面代碼中的註釋。
private Sub MenuItem _ draw item(ByVal sender As Object ByVal e As System Windows Forms DrawItemEventArgs)Handles MenuItem draw item Dim RF bound As RectangleF = New RectangleF(e Bounds X e Bounds Y e Bounds Width e e Bounds Height)根據draw item eventargs參數,獲取菜單項的矩形區域並存儲在RectangleF類型實例中:Dim RF Bounds As rectangle = New rectangle(e Bounds X e Bounds Y Y e Bounds Height)。根據DrawItemEventArgs參數,獲取菜單項的矩形區域,並存儲在Rectangle類型實例中。Rectangle類型實例類似於RectangleF類型實例,只是後面代碼中繪制菜單的功能不同。淺綠色)RF bound)用淺綠色填充與MenuItem菜單項對應的矩形區域,dim s as MenuItem = ctype(sender MenuItem)。Dim s As String = s Text菜單項的名稱dim SF temp As String format = new String format()。SF temp alignment = string alignment center設置要繪制的菜單名稱的對齊方式,並在中間對齊e Graphics DrawString (s新字體)。如果在指定的矩形區域中e state =(draw item state no accelerator or draw item state selected ),則指定中間對齊的字體大小並重新繪制菜單。然後根據菜單項的當前繪制狀態繪制菜單項e圖形填充矩形(新的實心畫筆(顏色為淺黃色)RF bound)。用e Graphics DrawString (s New Font(字體樣式加粗)new solid brush(顏色黑色)RF bound SF temp)填充菜單項所在的矩形區域。繪制壹個End If e DrawFocusRectangle()作為菜單項名稱。繪制聚焦框eGraphics draw rectangle(New Pen(New Solid Brush(Color Black))RF綁定在DrawItemEventArgs參數獲取的矩形範圍內。為菜單項的矩形區域繪制壹個矩形框端點。
操作完成後,保存修改,然後點擊快捷鍵F運行程序得到如圖界面。
繪制自己的菜單操作界面(2)
可以看到,繪制文件的MenuItem沒有完全顯示,後面的MenuItem也沒有顯示。這是因為沒有設置菜單項的顯示區域,無法完全顯示默認空間。設置菜單項的顯示區域大小是通過MeasureItem事件完成的。具體操作是在Menuitem的DrawItem事件後添加以下代碼。下面的代碼用於定義Menuitem的MeasureItem事件。在這個事件中,可以設置菜單項的寬度(當然,也可以設置高度等。).
private Sub menuitem _ measure item(byval sender as object byval e as system windows forms measurement args)處理menuitem measure item e item width =設置菜單項End Sub的寬度。
保存以上修改後,點擊快捷鍵F運行程序,得到如圖界面。
繪制自己的菜單操作界面(3)
可以看出,即使繪制了文件菜單項,也因為沒有繪制其他菜單項而沒有顯示。其他菜單項的繪制方法與文件菜單項基本相似。下面是在上述完成的基礎上繪制其他菜單項得到如圖所示菜單的具體實現步驟。
繪制自己的菜單操作界面(四)
在窗體vb中的MenuItem的MeasureItem事件處理程序後添加以下代碼。下面的代碼是定義MenuItem的DrawItem事件,它的作用是重繪新的菜單項。
private Sub MenuItem _ draw item(ByVal sender As Object ByVal e As System Windows Forms DrawItemEventArgs)Handles MenuItem draw item Dim RF bound As RectangleF = New RectangleF(e Bounds X e Bounds Y e Bounds Width e e Bounds Height)根據draw item eventargs參數,獲取菜單項的矩形區域並存儲在RectangleF類型實例中:Dim RF Bounds As rectangle = New rectangle(e Bounds X e Bounds Y Y e Bounds Height)。根據DrawItemEventArgs參數,獲取菜單項的矩形區域,並存儲在Rectangle類型實例中。Rectangle類型實例類似於RectangleF類型實例,只是後面代碼中繪制菜單的功能不同。r light gray)RF bound)Dim s As MenuItem = CType(sender MenuItem)Dim s As String = s Text獲取與菜單項對應的文本名稱Dim SF temp As String format = new String format()。SF temp alignment = string alignment center設置矩形區域中文本的對齊方式SF temp line alignment = string alignment center dim RC text as rectangle f = RF bound RC text width。= E Graphics DrawString(s New Font(μ)new solid brush(Color blue)RC text SF temp)E Graphics draw rectangle(New Pen(New solid brush(Color light gray))RF bound)如果E State =(draw item State no accelerator或DrawItemState Selected)則E Graphics fill rectangle(New solid brush(Color light yellow)RF bound)E Graphics DrawString(s New Font(字體樣式粗體或字體樣式下劃線)New solid brush(顏色紅色)RC text SF temp) e Graphics draw rectangle(New Pen(New solid brush(Color Black))RF bound)e DrawFocusRectangle()在ENDIFEND SUMenuItem的DrawItem事件處理代碼後添加以下代碼。 下面的代碼定義MENUITEM的MeasureItem事件。在這個事件中,新創建的菜單項的長度和高度被設置。
private Sub MenuItem _ measure item(ByVal sender As Object ByVal e As System Windows Forms measure item eventargs)處理MenuItem MeasureItem e item width =設置MenuItem的寬度e ItemHeight =設置菜單項的高度。完成上述操作步驟後,End Sub添加以下代碼。下面的代碼是定義menuitem的DrawItem事件,它的作用是重畫打開的菜單項。
private Sub MenuItem _ draw item(ByVal sender As Object ByVal e As System Windows Forms DrawItemEventArgs)Handles MenuItem draw item Dim RF bound As RectangleF = New RectangleF(e Bounds X e Bounds Y e Bounds Width e e Bounds Height)根據draw item eventargs參數,獲取菜單項的矩形區域並存儲在RectangleF類型實例中:Dim RF Bounds As rectangle = New rectangle(e Bounds X e Bounds Y Y e Bounds Height)。根據DrawItemEventArgs參數,獲取菜單項的矩形區域,並存儲在Rectangle類型實例中。Rectangle類型實例類似於RectangleF類型實例,但是下面代碼中的drawing菜單的功能不同:dim s as menuitem = ctype(sender menuitem)。Dim s As String = s Text Dim SF temp As String format = New String format()SF temp Alignment = String Alignment Center SF temp line Alignment = String Alignment Center Dim rcText As rectangle ef = RF bound rcText Width = e Graphics s DrawString(s New Font(Veranda)New solid brush(Color Blue)rcText SF temp)e Graphics draw rectangle(New Pen(New solid brush(Color light gray))RF bound) 如果e State =(DrawItem State no accelerator或DrawItemState Selected)那麽e Graphics fill rectangle(New solid brush(Color light yellow)RF bound)e Graphics DrawString(s New Font(Veranda Font style Bold或Font style Underline)New solid brush(Color Red)RC text SF temp)e Graphics draw rectangle(New Pen(New solid brush(Color Black))RF bound)e drawfocrectangle()在ENDIFEND SUMenuItem的draw item事件處理代碼之後添加以下代碼, 下面的代碼定義MENUITEM的MeasureItem事件。在這個事件中,新創建的菜單項的長度和高度被設置。
private Sub MenuItem _ measure item(ByVal sender As Object ByVal e As System Windows Forms measure item eventargs)Handles MenuItem measure item e item width =設置菜單項的寬度e ItemHeight =設置菜單項的高度End Sub以上步驟全部正確完成後,本文介紹的手繪菜單就完成了。此時點擊快捷鍵F運行程序,即可得到如圖所示的運行界面。
不及物動詞摘要
本文的主要內容是介紹用VB NET設計和創建菜單,不僅介紹了用菜單設計器靜態設計菜單,還介紹了用MainMenu類MenuItem類和ContextMenu類動態創建菜單的實現方法。動態創建時,首先要明白要創建的菜單類型是下拉菜單,先創建MainMenu的實例,再創建彈出菜單。構建壹個ContextMenu實例,然後根據菜單的構成結構,也就是菜單項中的父子關系,創建相應的菜單,最後顯示菜單。如果是下拉菜單,賦給表單的菜單屬性,如果是彈出菜單,賦給表單的可視化組件或者ContextMenu屬性,這樣就可以顯示動態菜單創建,完成動態創建菜單的工作。
此外,還介紹了在Visual Basic Net中繪制個性化菜單的實現方法和註意事項。在繪制個性化菜單時,最重要的是掌握DrawItem事件和MeasureItem事件的用法以及繪制菜單時要使用的方法。雖然本文繪制的菜單並不美觀,但是可以通過本文介紹的方法進行修改,實現更加美觀和個性化的菜單。最後,請記住在繪制菜單時先將菜單項的OwnerDraw屬性設置為True。
?
Lishi Xinzhi/Article/program/net/201311/15454