Sie sind zurzeit offline. Es wird auf die erneute Herstellung einer Internetverbindung gewartet.

Ihr Browser wird nicht unterstützt.

Sie müssen Ihren Browser aktualisieren, um die Website zu verwenden.

Aktualisieren Sie auf die neueste Version von Internet Explorer.

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

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
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 Main-Steuerelement erbt und Eigenschaften den Elementen des Main-Steuerelements hinzufügt.

Zurück zum Anfan

Erweitern Sie die Item-Menu-Klasse

Die Menu-Klasse bietet eine integrierte Möglichkeit von dem Anzeigen eines Symbols nicht. Beispielsweise gibt es keine Eigenschaft 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 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 Menu-Klasse auf dem Bildschirm zeichnen.

Verwenden Sie die folgende Klassenvererbungssyntax, um die Menu-Klasse zu erweitern.
Public Class MyIconMenu    Inherits MenuItemEnd Class
Zurück zum Anfan

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

Wenn Sie von der Menu-Klasse 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 von der Methode und der Methode. Sie müssen private Felder außerdem innerhalb Ihrer benutzerdefinierten Klasse deklarieren, ein -Objekt und ein Objekt zu enthalten. Damit Ihre benutzerdefinierte Klasse Text zusätzlich zu Symbolen enthalten kann, benötigen Sie ein -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 aufgerufen wird. Wenn Ihre benutzerdefinierte Klasse instanziiert wird, wird die Methode 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 Eigenschaft Ihrer benutzerdefinierten Klasse auf dem Wert auch festlegen. Dieser Schritt ist wichtig, da nicht in Ihrem Menü kein Symbol angezeigt werden, wenn dieser Schritt nicht durchgeführt wird.

Zurück zum Anfan

Fügen Sie Ihrem Menü Elemente hinzu

Untersuchen Sie die zwei Methoden, die überschrieben werden müssen. Wenn Ihr Menü gezeichnet wird, wird die Methode aufgerufen. Nach zwei Einstellungseigenschaften des Konstruktors können Sie die Größe Ihres Menüs mit der Methode festlegen. Die zwei Eigenschaften des Konstruktors, das Sie festlegen, sind die Eigenschaft und die Eigenschaft. Diese Einstellungen werden an die Methode 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 Objekt verwenden. Dieses Objekt kann in dem Namespace 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 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 = NothingEnd Sub
Zurück zum Anfan

Zeichnen Sie Ihr Menü

Nachdem Sie die Größe Ihres Menüs angeben, müssen Sie Ihr Menü mithilfe Methode Ihrer benutzerdefinierten Klasse zeichnen. Diese Methode wird an das Objekt übergeben. Um ein Objekt für Ihr Menüelement zu erhalten, können Sie das 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 = NothingEnd Sub
Zurück zum Anfan

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

Die Funktion wird in den Codebeispielen in der Methode und der Methode aufgerufen. Sie konnten Ihre Zeichenfolge messen und Sie konnten zeichnen, die auf der Eigenschaft 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 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 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 sEnd Function
Zurück zum Anfan

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 markieren.

Zurück zum Anfan

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.vbPublic 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.vbImports SystemImports System.ComponentModelImports System.DrawingImports System.Drawing.Drawing2DImports System.Drawing.TextImports 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: Besuchen Sie die folgende MSDN-Website für Weitere Informationen zu partiellen Klassen und dem Windows Forms-Designer: Zurück zum Anfan

Warnung: Dieser Artikel wurde automatisch übersetzt.

Eigenschaften

Artikelnummer: 888168 – Letzte Überarbeitung: 05/11/2007 07:08:50 – Revision: 2.5

  • 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 KB888168 KbMtde kbmt
Feedback
id=1&t=">I=4050&did=1&t=">&did=1&t=">ementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?"> >>ascript' src='" + (window.location.protocol) + "//c.microsoft.com/ms.js'><\/script>");