Как создать пользовательские меню в Visual Basic.NET или Visual Basic 2005

Переводы статьи Переводы статьи
Код статьи: 888168 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

Описание способов создания пользовательских меню в Microsoft Visual Basic.NET или Microsoft Visual Basic 2005 через обсуждения и примеры кода.

ВВЕДЕНИЕ

В данной статье описывается создание пользовательских меню в Microsoft Visual Basic.NET или Microsoft Visual Basic 2005. Создание пользовательских меню путем наследования MainMenu элемент управления и путем добавления свойств элементов MainMenu элемент управления.

Расширение класса MenuItem

В Пункт меню класс не поддерживает встроенный способ отображения значка. Например, не существует никаких Значок свойство, которое можно присвоить Отображение значка. Когда Microsoft.NET Framework класс не предоставляет компонент, который требуется, можно расширить этот класс и дает возможность самостоятельно.

Можно расширить Пункт меню класс таким образом, чтобы создать меню, рисуемые владельцем элемент. Элемент меню, рисуемые владельцем означает, что разработчик отвечает за рисование Пункт меню класс на экране.

Для расширения Пункт меню класс, используйте следующий синтаксис наследование класса.
Public Class MyIconMenu
    Inherits MenuItem
End Class

Объявите объект шрифта и значок объекта для класса MenuItem

При наследовании из класса Пункт меню наследовать класс, его свойства, методы и события. Можно создать свой собственный значок для пользовательского класса посредством переопределения поведения двух методов, которые можно наследовать. Переопределение поведения OnMeasureItem метод и OnDrawItem метод. Также необходимо объявлять закрытые поля в пользовательский класс для хранения Шрифтобъект и Значок объект. Необходимо Шрифт объект так, чтобы пользовательский класс может содержать текст, в дополнение к значкам.

Если требуется способ для разработчиков, использующих пользовательского класса для инициализации закрытые поля, используйте конструктор пользовательского класса. Visual Basic.NET 2003 конструктор — это особый метод, вызываемый Новый. В Новый метод вызывается.NET Framework во время создания экземпляра пользовательского класса. С помощью Visual Basic.NET 2003, можно передать параметры в конструкторе.

Visual Basic.NET 2003 также поддерживает перегрузку метода. Можно определить тот же метод много раз, до тех пор, пока метод подписи являются уникальными.

С помощью конструкторов и перегрузка метода, можно позволяют разработчикам инициализации закрытого поля пользовательского класса. Код для настраиваемого класса может выглядеть примерно в следующем примере кода.
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
Обратите внимание, что используется перегрузка метода конструктор, так что разработчик имеет возможность элемента меню с помощью значка или пункт меню без значка. Необходимо также установить OwnerDraw Свойство пользовательского класса ИСТИНА значение, если требуется отобразить значок. Это важно, поскольку если это действие не завершено, значки не отображаются в меню.

Добавление элементов в меню

Рассмотрим два метода, которые должны быть переопределены. В OnMeasureItem метод вызывается при отрисовке по меню. В OnMeasureItem метод позволяет указать размер меню путем задания двух свойств MeasureItemEventArgs конструктор. Два свойства MeasureItemEventArgs конструктор, который можно установить, ItemHeight свойства и ItemWidth свойство. Эти параметры передаются как параметры OnMeasureItem метод.

Можно определить необходимую высоту элемента меню, в зависимости от высоты значок. Это может и не всегда может быть соответствующим. Как правило высота текста пункта меню, не должна превышать высоту значка.

Чтобы определить ширину меню, необходимо знать ширину строки, которая отображается в пункте меню. Можно использовать StringFormat объект для получения этой информации. Этот объект можно найти в System.Drawing пространство имен. При выполнении измерения ширины элемента меню, следует также учитывать, значок.

Код для вашего OnMeasureItem метод может быть похож на приведенный ниже код.
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

В меню «действия»

После указания размера меню необходимо нарисовать меню с помощью OnDrawItem метод пользовательского класса. Этот метод передается DrawItemEventArgs объект. Можно использовать DrawItemEventArgs объект для получения Графики объект для элемента меню. Это позволяет рисовать непосредственно на поверхности по меню с помощью мощных GDI + возможностей, доступных в.NET Framework. Во-первых рисуйте цветом фона. Нарисуйте значок. И, наконец нарисовать текст данного элемента меню.

Код для вашего меню может быть похож на приведенный ниже код.
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

Создание сочетания клавиш для элемента меню

В примерах кода AppendShortcut в обоих вызывается функция OnMeasureItem метод и OnDrawItem метод. Можно измерять и нарисовать строку на основе Текст свойства пункта меню. Однако это не учитывает тот факт, что пункт меню может иметь сочетания клавиш. Если пункт меню сочетания клавиш, необходимо отобразить сочетания клавиш и увеличить ширину элемента меню. Сочетания клавиш необходимо представлять в виде строк. В AppendShortcut функция представляет сочетание клавиш как строку и добавляет строку ярлык существующий текст элемента меню.

Код AppendShortcut функция может быть похож на приведенный ниже код.
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

Выделите пункт меню

После создания элемента меню Основные значок может потребоваться Выделите пункт меню, как он установлен. Вы необходимо нарисовать рамку и выделите текст в OnDrawItem метод.

Пример кода

В следующем примере кода используется полный код для настраиваемого класса. Данный пример кода содержит код для выделения элемента меню.
' 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 Forms. Если форму с именем Form1, два файла, которые представляют собой форму именами Form1.vb и Form1.Designer.vb. Напишите код в файл Form1.vb. Конструктор Windows Forms записывает код в файле Form1.Designer.vb. Конструктор Windows Forms использует ключевое слово partial разделить на два отдельных файла реализации класса Form1. Такое поведение предотвращает код, созданный конструктором перемежаемых кода.

Для получения дополнительных сведений о новых улучшений языка Visual Basic 2005 посетите следующий веб-узел Microsoft Developer Network (MSDN):
http://msdn2.Microsoft.com/en-us/library/ms379584 (vs.80) .aspx
Для получения дополнительных сведений о разделяемых классов и в конструкторе Windows Forms посетите веб-узле MSDN:
http://msdn2.Microsoft.com/en-us/library/ms171843.aspx

Свойства

Код статьи: 888168 - Последний отзыв: 17 июня 2011 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Ключевые слова: 
kbvs2005swept kbvs2005applies kbhowtomaster kbprogramming kbmacroexample kbexpertiseinter kbhowto kbmt KB888168 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке: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