วิธีการสร้างเมนูกำหนดเอง ใน Visual Basic .NET หรือ Visual Basic 2005

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 888168 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

สรุป

เรียนรู้วิธีการสร้างเมนูกำหนดเองใน Microsoft Visual Basic .NET หรือ Microsoft Visual Basic 2005 ผ่านการสนทนาและตัวอย่างของรหัส

บทนำ

บทความนี้อธิบายวิธีการสร้างเมนูกำหนดเอง ใน Microsoft Visual Basic .NET หรือ Microsoft Visual Basic 2005 คุณสามารถสร้างเมนูกำหนดเอง โดย inheritingMainMenuตัวควบคุมและ โดยการเพิ่มคุณสมบัติของรายการนี้MainMenuตัวควบคุม

ขยายคลา MenuItem

กระบวนการMenuItemคลาสที่ไม่มีวิธีการมีอยู่แล้วของการแสดงไอคอน ตัวอย่างเช่น ไม่มีไอคอนคุณสมบัติที่คุณสามารถตั้งค่าการแสดงไอคอน เมื่อ Microsoft .NET Framework คลาสที่ไม่มีคุณลักษณะที่คุณต้อง คุณสามารถขยายคลาสนั้น และคุณสามารถใส่ลักษณะการทำงานตัวคุณเอง

คุณสามารถขยายได้MenuItemคลาสเพื่อให้คุณสามารถสร้างรายการเมนูที่วาดเจ้าของ รายการเมนูที่วาดเจ้าหมายความ ว่า นักพัฒนาที่รับผิดชอบการวาดรูปแบบMenuItemคลาบนหน้าจอ

เมื่อต้องการขยายMenuItemคลาส ใช้ไวยากรณ์การสืบทอดคลาต่อไปนี้
Public Class MyIconMenu
    Inherits MenuItem
End Class

ประกาศเป็นวัตถุแบบอักษรและวัตถุไอคอนสำหรับคลาส MenuItem

เมื่อคุณสืบทอดจากนั้นMenuItemสืบทอดคลา คุณมาของคุณสมบัติ วิธี และเหตุการณ์ คุณสามารถสร้างไอคอนของตนเองสำหรับคลาสที่กำหนดเองของคุณ ด้วยการแทนที่ลักษณะการทำงานของสองวิธีที่คุณทำการสืบทอด คุณแทนลักษณะการทำงานของการOnMeasureItemวิธีการและOnDrawItemวิธีการ คุณยังต้องกำหนดเขตข้อมูลส่วนตัวภายในของคลาสที่กำหนดเองเพื่อจัดเก็บเป็นFontวัตถุ และข้อไอคอนวัตถุ คุณต้องการFontวัตถุเพื่อให้คลาสที่กำหนดเองของคุณประกอบด้วยข้อความนอกเหนือจากการไอคอน

ถ้าคุณต้องการวิธีสำหรับนักพัฒนาที่ใช้คลาสที่กำหนดเองของคุณได้กำหนดค่าเริ่มต้นของเขตข้อมูลส่วนตัวของคุณ ใช้ตัวสร้างของคลาสที่กำหนดเองของคุณ ตัวสร้างแบบ Visual Basic .NET 2003 คือ วิธีการพิเศษที่เรียกว่าใหม่. กระบวนการใหม่.NET Framework เรียกวิธีเมื่อมี instantiated คลาสที่กำหนดเองของคุณ โดยใช้ Visual Basic .NET 2003 คุณสามารถส่งพารามิเตอร์ในการสร้างของคุณ

visual Basic .NET 2003 ยังสนับสนุนเมธอด overloading คุณสามารถกำหนดวิธีการเดียวกันหลายครั้ง ตราบเท่าที่ลายเซ็นของวิธีไม่ซ้ำกัน

โดยการใช้และวิธี overloading constructors คุณสามารถให้นักพัฒนาที่กำหนดค่าเริ่มต้นของเขตข้อมูลส่วนตัวของคลาสที่กำหนดเองของคุณ The code for your custom class may look similar to the following code example.
Public Class MyIconMenu Inherits MenuItem
       	Private font As Font
        Private icon As Icon

            Sub New(ByVal menuText As String)
                   MyClass.New(menuText, Nothing, Shortcut.None, Nothing)
           	End Sub

            Sub New(ByVal menuText As String, ByVal handler As EventHandler,  ByVal shortcut As Shortcut, ByVal ico As icon)
                MyBase.New(menuText, handler, shortcut)
                Me.icon = ico
                Me.font = New Font("Arial", 8)
                Me.OwnerDraw = True
            End Sub
   End Class
Notice that you have used method overloading on your constructor so that the developer has the option of having a menu item with an icon or a menu item without an icon. You must also set theOwnerDrawproperty of your custom class to theTruevalue if you want to display an icon. This step is important because if this step is not completed, no icons are displayed on your menu.

Add items to your menu

Examine the two methods that must be overridden. กระบวนการOnMeasureItemmethod is called when your menu is drawn. กระบวนการOnMeasureItemmethod lets you specify the size of your menu by setting two properties of theMeasureItemEventArgsconstructor. The two properties of theMeasureItemEventArgsconstructor that you set are theItemHeightคุณสมบัติและItemWidthคุณสมบัติ These settings are passed as parameters to theOnMeasureItemวิธีการ

You may want to determine the height of the menu item based on the height of the icon. This may or may not always be appropriate. Typically, the height of the text of the menu item should not exceed the height of the icon.

To determine the width of your menu, you must know the width of the string that is displayed in the menu item. คุณสามารถใช้ได้StringFormatobject to retrieve this information. This object can be found in theSystem.Drawingnamespace When you measure the width of the menu item, you must also consider the icon.

The code for yourOnMeasureItemmethod may be similar to the following code example.
Protected Overrides Sub OnMeasureItem(ByVal e As MeasureItemEventArgs)
        MyBase.OnMeasureItem(e)
        Dim sf As StringFormat = New StringFormat()

        sf.HotkeyPrefix = HotkeyPrefix.Show
        sf.SetTabStops(50, New Single() {0})

        e.ItemHeight = Me.icon.Height + 6
        e.ItemWidth = CInt(e.Graphics.MeasureString(AppendShortcut(), _ 
                           Me.font, 1000, sf).Width) + Me.icon.Width + 5
        sf.Dispose()
        sf = Nothing
End Sub

Draw your menu

After you specify the size of your menu, you must draw your menu by using theOnDrawItemmethod of your custom class. This method is passed to theDrawItemEventArgsวัตถุ คุณสามารถใช้ได้DrawItemEventArgsobject to obtain aกราฟิกobject for your menu item. This lets you draw directly on the surface of your menu by using the powerful GDI+ features that are available in the .NET Framework. First, draw a background color. Then, draw the icon. Last, draw the text of the menu item.

The code for your menu may be similar to the following code example.
Protected Overrides Sub OnDrawItem(ByVal e As DrawItemEventArgs)
   Dim br As Brush
   Dim sf As StringFormat

   MyBase.OnDrawItem(e)
   e.Graphics.FillRectangle(SystemBrushes.Control, e.Bounds)
   If Not (Me.icon Is Nothing) Then
      e.Graphics.DrawIcon(Me.icon, e.Bounds.Left + 3, e.Bounds.Top + 3)
   End If

   sf = New StringFormat()
   sf.HotkeyPrefix = HotkeyPrefix.Show
   sf.SetTabStops(50, New Single() {0})
   br = New SolidBrush(SystemColors.WindowText)
   e.Graphics.DrawString(AppendShortcut(), Me.font, br, e.Bounds.Left + _ 
                         Me.icon.Width + 10, e.Bounds.Top + 2, sf)
   'Clean up resources.
   br.Dispose()
   br = Nothing
   sf.Dispose()
   sf = Nothing
End Sub

Create a keyboard shortcut for the menu item

In the code examples, theAppendShortcutfunction is called in both theOnMeasureItemวิธีการ และOnDrawItemวิธีการ You could measure and draw your string based on theข้อความproperty of the menu item. However, this does not consider the fact that the menu item might have a keyboard shortcut. If the menu item does have a keyboard shortcut, you must display the keyboard shortcut and increase the width of the menu item. You must represent the keyboard shortcut as a string. กระบวนการAppendShortcutfunction represents the keyboard shortcut as a string and appends the shortcut string to the existing menu item text.

The code for theAppendShortcutfunction may be similar to the following code example.
Private Function AppendShortcut() As String
   Dim s As String
   s = Me.Text
   ' Check to see if we have a shortcut.
   ' If so, append it to our existing text.  
   If Me.ShowShortcut And Me.Shortcut <> Shortcut.None Then
      Dim k As Keys = CType(Shortcut, Keys)
      s = s & Convert.ToChar(9) & _ 
             TypeDescriptor.GetConverter(GetType(Keys)).ConvertToString(k)
      End If
   Return s
End Function

Highlight the menu item

After you create a basic icon menu item, you may want to highlight the menu item as it is selected. You must draw a border and highlight the text in theOnDrawItemวิธีการ

Code example

The following code example is the complete code for your custom class. This code example includes the code to highlight the menu item.
' Form1.vb
Public Class Form1
    Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

    Public Sub New()

        MyBase.New()

        'This call is required by the Windows Form Designer.

        InitializeComponent()

        'Add any initialization after the InitializeComponent() call.

    End Sub

 

    'Form overrides dispose to clean up the component list.

    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

        If disposing Then

            If Not (components Is Nothing) Then

                components.Dispose()

            End If

        End If

        MyBase.Dispose(disposing)

    End Sub

 

    'Required by the Windows Form Designer.

    Private components As System.ComponentModel.IContainer

 

    'Note The following procedure is required by the Windows Form Designer.

    'It can be modified by using the Windows Form Designer.  

    'Do not modify it by using the code editor.

    Friend WithEvents MainMenu1 As System.Windows.Forms.MainMenu

    Friend WithEvents MenuItem1 As System.Windows.Forms.MenuItem

    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

        Me.MainMenu1 = New System.Windows.Forms.MainMenu

        Me.MenuItem1 = New System.Windows.Forms.MenuItem

    

        Me.MainMenu1.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.MenuItem1})

        Me.MenuItem1.Index = 0

        Me.MenuItem1.Text = ""

       

        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)

        Me.ClientSize = New System.Drawing.Size(292, 273)

        Me.Menu = Me.MainMenu1

        Me.Name = "Form1"

        Me.Text = "Form1"

 

    End Sub

 

#End Region

 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        'Loading the MyIconMenu onto the first menu in MainMenu1.

        Dim ico As Icon = New Icon("c:\GSA.ico")

        Dim fm As MyIconMenu = New MyIconMenu("Testing", Nothing, Shortcut.None, ico)

        MainMenu1.MenuItems(0).MenuItems.Add(fm)

    End Sub

 

End Class




' MyIconMenu.vb

Imports System

Imports System.ComponentModel

Imports System.Drawing

Imports System.Drawing.Drawing2D

Imports System.Drawing.Text

Imports System.Windows.Forms

 

Public Class MyIconMenu

    Inherits MenuItem

 

    Private font As font

    Private icon As icon

 

    'Set properties for border highlighting.

    Private borderWidth As Integer = 1

    Private borderColor As Color = Color.DarkBlue

 

 

    Sub New(ByVal menuText As String, ByVal handler As EventHandler, _

            ByVal shortcut As Shortcut, ByVal ico As icon)

 

        MyBase.New(menuText, handler, shortcut)

        Me.icon = ico

        Me.font = New Font("Arial", 8)

        Me.OwnerDraw = True

 

    End Sub

 

    Public Overloads Sub Dispose()

 

        Me.font.Dispose()

        Me.font = Nothing

        Me.icon.Dispose()

        Me.icon = Nothing

        MyBase.Dispose()

 

    End Sub

 

    Protected Overrides Sub OnMeasureItem(ByVal e As MeasureItemEventArgs)

 

        MyBase.OnMeasureItem(e)

        Dim sf As StringFormat = New StringFormat

 

        sf.HotkeyPrefix = HotkeyPrefix.Show

        sf.SetTabStops(50, New Single() {0})

 

        e.ItemHeight = Me.icon.Height + 6

        e.ItemWidth = CInt(e.Graphics.MeasureString(AppendShortcut(), _

                           Me.font, 1000, sf).Width) + Me.icon.Width + 5

 

        sf.Dispose()

        sf = Nothing

 

    End Sub

 

    Protected Overrides Sub OnDrawItem(ByVal e As DrawItemEventArgs)

 

        Dim br As Brush

        Dim sf As StringFormat

 

        MyBase.OnDrawItem(e)

 

        If CBool(e.State And DrawItemState.Selected) Then

            'Draw a border to highlight the menu.

            e.Graphics.FillRectangle(SystemBrushes.HighlightText, _

                                     e.Bounds)

 

            ControlPaint.DrawBorder(e.Graphics, e.Bounds, _

                                    Me.borderColor, Me.borderWidth, _

                                    ButtonBorderStyle.Solid, _

                                    Me.borderColor, Me.borderWidth, _

                                    ButtonBorderStyle.Solid, _

                                    Me.borderColor, Me.borderWidth, _

                                    ButtonBorderStyle.Solid, _

                                    Me.borderColor, Me.borderWidth, _

                                    ButtonBorderStyle.Solid)

 

        Else

            e.Graphics.FillRectangle(SystemBrushes.Control, e.Bounds)

        End If

 

        If Not (Me.icon Is Nothing) Then

            e.Graphics.DrawIcon(Me.icon, e.Bounds.Left + 3, _

                                e.Bounds.Top + 3)

        End If

 

        sf = New StringFormat

        sf.HotkeyPrefix = HotkeyPrefix.Show

        sf.SetTabStops(50, New Single() {0})

        br = New SolidBrush(SystemColors.WindowText)

        e.Graphics.DrawString(AppendShortcut(), Me.font, br, _

                              e.Bounds.Left + Me.icon.Width + 10, _

                              e.Bounds.Top + 2, sf)

 

        'Clean up resources.

        br.Dispose()

        br = Nothing

        sf.Dispose()

        sf = Nothing

 

    End Sub

 

    Private Function AppendShortcut() As String

 

        Dim s As String

        s = Me.Text

 

        ' Check to see if we have a shortcut.

        ' If so, append it to our existing text.  

        If Me.ShowShortcut And Me.Shortcut <> Shortcut.None Then

            ' Use TypeDescriptor to get a string representation of a

            ' Shortcut class.

             Dim k As Keys = CType(Shortcut, Keys)

 

            s = s & Convert.ToChar(9) & _

            TypeDescriptor.GetConverter(GetType(Keys)).ConvertToString(k)

        End If

        Return s

    End Function

 

End Class
หมายเหตุ:คุณต้องเปลี่ยนรหัสใน Visual Basic 2005 โดยค่าเริ่มต้น Visual Basic สร้างแฟ้มที่สองสำหรับโครงการเมื่อคุณสร้างโครงการแบบฟอร์ม Windows ถ้าแบบฟอร์มมีชื่อ Form1 แฟ้มที่สองที่แสดงแบบฟอร์มมีชื่อ Form1.vb และ Form1.Designer.vb คุณสามารถเขียนรหัสในแฟ้ม Form1.vb ตัวออกแบบฟอร์ม Windows เขียนรหัสในแฟ้ม Form1.Designer.vb ตัวออกแบบฟอร์ม Windows ใช้คำสำคัญบางส่วนเพื่อแบ่งการใช้งานของ Form1 เป็นแฟ้มแยกต่างหากที่สอง ลักษณะการทำงานนี้ป้องกันไม่ให้รหัสสร้างโดยโปรแกรมออกจากการถูก interspersed ด้วยรหัสของคุณ

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการปรับปรุงใหม่ ๆ ของภาษา Visual Basic 2005 แวะไปที่เว็บไซต์ของ Microsoft สำหรับนักพัฒนาเครือข่าย (MSDN) ต่อไปนี้:
.aspx http://msdn2.microsoft.com/en-us/library/ms379584 (vs.80)
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับระดับชั้นบางส่วนและผู้ออกแบบฟอร์ม Windows ไปที่ MSDN เว็บไซต์ต่อไปนี้:
http://msdn2.microsoft.com/en-us/library/ms171843.aspx

คุณสมบัติ

หมายเลขบทความ (Article ID): 888168 - รีวิวครั้งสุดท้าย: 15 มกราคม 2554 - Revision: 3.0
ใช้กับ
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Keywords: 
kbvs2005swept kbvs2005applies kbhowtomaster kbprogramming kbmacroexample kbexpertiseinter kbhowto kbmt KB888168 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:888168

ให้ข้อเสนอแนะ

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com