Erstellen eines benutzerdefinierten Menüs in Visual Basic 6.0 oder Visual Basic 2005

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 888168 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Erfahren Sie mehr über das Erstellen eines benutzerdefinierten Menüs in Microsoft Visual Basic .NET oder Microsoft Visual Basic 2005 durch Diskussionen und Codebeispiele.

EINFÜHRUNG

Dieser Artikel beschreibt, wie ein benutzerdefiniertes Menü in Microsoft Visual Basic .NET oder Microsoft Visual Basic 2005 erstellt wird. Sie erstellen ein benutzerdefiniertes Menü, indem das Menu Main-Steuerelement erbt und Eigenschaften den Elementen des Menu Main-Steuerelements hinzufügt.

Erweitern Sie die Item-Menu-Klasse

Die Item Menu-Klasse bietet eine integrierte Möglichkeit von dem Anzeigen eines Symbols nicht. Beispielsweise gibt es keine Eigenschaft Symbol der Sie so einstellen können, ein Symbol anzuzeigen. Wenn eine Microsoft .NET Framework-Klasse eine Feature nicht bereitstellt, die gewünscht wird, können Sie die Klasse erweitern und Sie die Feature bereitstellen.

Sie können die Item Menu-Klasse erweitern, so dass Sie ein von dem Besitzer gezeichnetes Menüelement erstellen können. Ein von dem Besitzer gezeichnetes Menüelement bedeutet, dass der Entwickler verantwortlich ist für die Item Menu-Klasse auf dem Bildschirm zeichnen.

Verwenden Sie die folgende Klassenvererbungssyntax, um die Item Menu-Klasse zu erweitern.
Public Class MyIconMenu
    Inherits MenuItem
End Class

Deklarieren Sie ein Font-Objekt und ein Icon-Objekt für die Item-Menu-Klasse

Wenn Sie von der Menu-Klasse Item erben, erben Sie seine Eigenschaften, seine Methoden und seinen Ereignisse. Durch das Setzen des Verhaltens beider Methoden, die Sie erben, außer Kraft kann Ihr eigenes Symbol für Ihre benutzerdefinierte Klasse erstellt werden. Außer Kraft setzen Sie das Verhalten OnDrawItem OnMeasureItem von der Methode und der Methode. Sie müssen private Felder außerdem innerhalb Ihrer benutzerdefinierten Klasse deklarieren, ein Font -Objekt und ein Objekt Symbol zu enthalten. Damit Ihre benutzerdefinierte Klasse Text zusätzlich zu Symbolen enthalten kann, benötigen Sie ein Font -Objekt.

Verwenden Sie das Konstruktor Ihrer benutzerdefinierten Klasse, wenn Sie eine Möglichkeit für Entwickler benötigen, die Ihre benutzerdefinierte Klasse verwenden, um Ihre privaten Felder zu initialisieren. A Visual Basic .NET 2003 Konstruktoren ist eine spezielle Methode, die Neu aufgerufen wird. Wenn Ihre benutzerdefinierte Klasse instanziiert wird, wird die Methode Neu von dem FRAMEWORK aufgerufen. Sie können Parameter an Ihr Konstruktor übergeben, indem Sie Visual Basic .NET 2003 verwenden.

Darüber hinaus unterstützt Visual Basic .NET 2003 Methodenüberladen. Sie können dieselbe Methode viel Male definieren, solange die Methodensignaturen eindeutig sind.

Sie können Ihnen, Entwickler die privaten Felder Ihrer benutzerdefinierten Klasse zu initialisieren ermöglichen, indem Konstruktor verwendet und Methode überlädt. Kann der Code für Ihre benutzerdefinierte Klasse in dem folgenden Codebeispiel vergleichbar aussehen.
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
Beachten Sie, dass Sie Methodenüberladen, so dass der Entwickler über die Option verfügt, ein Menüelement mit einem Symbol oder ein Menüelement ohne ein Symbol aufzuweisen, für Ihr Konstruktor verwandt haben. Wenn Sie ein Symbol anzeigen möchten, müssen Sie die OwnerDraw Eigenschaft Ihrer benutzerdefinierten Klasse auf dem Wert True auch festlegen. Dieser Schritt ist wichtig, da nicht in Ihrem Menü kein Symbol angezeigt werden, wenn dieser Schritt nicht durchgeführt wird.

Fügen Sie Ihrem Menü Elemente hinzu

Untersuchen Sie die zwei Methoden, die überschrieben werden müssen. Wenn Ihr Menü gezeichnet wird, wird die OnMeasureItem Methode aufgerufen. Nach zwei Einstellungseigenschaften des MeasureItemEventArgs Konstruktors können Sie die Größe Ihres Menüs mit der Methode OnMeasureItem festlegen. Die zwei Eigenschaften MeasureItemEventArgs des Konstruktors, das Sie festlegen, sind ItemHeight die Eigenschaft und ItemWidth die Eigenschaft. Diese Einstellungen werden an die Methode OnMeasureItem als Parameter weitergegeben.

Empfiehlt sich, Sie die Höhe des Menüelements auf Grundlage auf der Höhe des Symbols zu definieren. Das ist immer möglicherweise geeignet oder möglicherweise befindet sich das nicht immer. Die Höhe des Texts des Menüelements sollte die Höhe des Symbols nicht normalerweise überschreiten.

Um die Breite Ihres Menüs zu bestimmen, müssen Sie die Breite der Zeichenfolge, die in dem Menüpunkt angezeigt wird, wissen. Um diese Information abzurufen, können Sie das StringFormat Objekt verwenden. Dieses Objekt kann in dem Namespace System.Drawing gefunden werden. Wenn Sie die Breite des Menüelements messen, müssen Sie das Symbol außerdem berücksichtigen.

Der Code für Ihre Methode OnMeasureItem kann in dem folgenden Codebeispiel vergleichbar sein.
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

Zeichnen Sie Ihr Menü

Nachdem Sie die Größe Ihres Menüs angeben, müssen Sie Ihr Menü mithilfe OnDrawItem Methode Ihrer benutzerdefinierten Klasse zeichnen. Diese Methode wird an das Objekt DrawItemEventArgs übergeben. Um ein Objekt Grafik für Ihr Menüelement zu erhalten, können Sie das DrawItemEventArgs Objekt verwenden. Das ermöglicht Ihnen, indem Sie die leistungsstarken GDI+-Features verwenden, die in dem .NET verfügbar sind, direkt auf der Oberfläche Ihres Menüs zu zeichnen. Zeichnen Sie eine Hintergrundfarbe zuerst. Zeichnen Sie dann das Symbol. Zuletzt der Text des Menüelements zeichnet.

Der Code für Ihr Menü kann in dem folgenden Codebeispiel vergleichbar sein.
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

Erstellen Sie eine Tastaturverknüpfung für das Menüelement

Die AppendShortcut Funktion wird in den Codebeispielen in der Methode OnMeasureItem und der Methode OnDrawItem aufgerufen. Sie konnten Ihre Zeichenfolge messen und Sie konnten zeichnen, die auf der Eigenschaft Text des Menüelements basiert. Das berücksichtigt jedoch das Faktum nicht, dass das Menüelement möglicherweise über eine Tastenkombination verfügt. Falls der Menüartikel eine Tastenkombination hat müssen Sie die Tastenkombination anzeigen und Sie müssen die Breite des Menüelements vergrößern. Sie müssen die Tastenkombination als eine Zeichenfolge darstellen. Die AppendShortcut Funktion stellt die Tastenkombination als eine Zeichenfolge dar und fügt die Kontextzeichenfolge zu dem vorhandenen Menüartikeltext an.

Der Code für die Funktion AppendShortcut kann in dem folgenden Codebeispiel vergleichbar sein.
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

Markieren Sie das Menüelement

Empfiehlt, das Menüelement zu markieren, wenn es ausgewählt wird sich, nachdem Sie ein grundlegendes Symbolmenüelement erstellen. Sie müssen einen Rahmen zeichnen und Sie müssen den Text in der Methode OnDrawItem markieren.

Codebeispiel

Das folgende Codebeispiel ist der vollständige Code für Ihre benutzerdefinierte Klasse. Dieses Codebeispiel enthält den Code, um das Menüelement zu hervorgehoben werden.
' 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
Hinweis: Sie müssen den Code in Visual Basic 2005 ändern. Wenn Sie ein Windows Forms-Projekt erstellen, erstellt Visual Basic standardmäßig zwei Dateien für das Projekt. Wenn das Formular als Form1 bezeichnet wird, werden die zwei Dateien, die das Formular darstellen, als Form1.vb und Form1.Designer.vb bezeichnet. Sie schreiben den Code in der Datei Form1.vb. Der Windows Forms-Designer schreibt den Code in der Form1.Designer.vb-Datei. Der Windows Forms-Designer verwendet das Teilschlüsselwort, um die Implementierung von Form1 in zwei separaten Dateien aufzuteilen. Dieses Verhalten hindert dem designer-generated Code mit Ihrem Code intersperse.

Findet mehreres Weitere Informationen über die neuen Visual Basic 2005-Sprachenverbesserungen auf der folgenden Microsoft Developer Network ( MSDN )-Website:
http://msdn2.microsoft.com/en-us/library/ms379584(vs.80).aspx
Besuchen Sie die folgende MSDN-Website für Weitere Informationen zu partiellen Klassen und dem Windows Forms-Designer:
http://msdn2.microsoft.com/en-us/library/ms171843.aspx

Eigenschaften

Artikel-ID: 888168 - Geändert am: Freitag, 11. Mai 2007 - Version: 2.5
Die Informationen in diesem Artikel beziehen sich auf:
  • 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 KB888168 KbMtde kbmt
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 888168
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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