Πώς μπορείτε να δημιουργήσετε ένα προσαρμοσμένο μενού σε Visual Basic .NET ή Visual Basic 2005

Σύνοψη

Μάθετε πώς μπορείτε να δημιουργήσετε ένα προσαρμοσμένο μενού σε Microsoft Visual Basic .NET ή Microsoft Visual Basic 2005 μέσω συζητήσεις και παραδείγματα κώδικα.

ΕΙΣΑΓΩΓΗ

Αυτό το άρθρο περιγράφει τον τρόπο δημιουργίας ενός προσαρμοσμένου μενού σε Microsoft Visual Basic .NET ή Microsoft Visual Basic 2005. Μπορείτε να δημιουργήσετε ένα προσαρμοσμένο μενού από μεταβίβαση του στοιχείου ελέγχου ' MainMenu ' και με την προσθήκη ιδιοτήτων στα στοιχεία του στοιχείου ελέγχου ' MainMenu ' .

Επιστροφή στην κορυφή

Επεκτείνετε την κλάση MenuItem

Η κλάση MenuItem δεν παρέχει έναν ενσωματωμένο τρόπο εμφανίζοντας ένα εικονίδιο. Για παράδειγμα, δεν υπάρχει καμία ιδιότητα εικονίδιο που μπορείτε να ορίσετε να εμφανίζεται ένα εικονίδιο. Όταν μια κλάση του Microsoft .NET Framework δεν παρέχει μια δυνατότητα που θέλετε, μπορείτε να επεκτείνετε αυτήν την κλάση, και μπορείτε να δώσετε τη δυνατότητα στον εαυτό σας.

Μπορείτε να επεκτείνετε το
MenuItem κλάση έτσι ώστε να μπορείτε να δημιουργήσετε ένα στοιχείο μενού που σχεδιάζονται από τον κάτοχο. Ένα στοιχείο μενού που σχεδιάζονται από τον κάτοχο σημαίνει ότι ο προγραμματιστής είναι υπεύθυνος για τη σχεδίαση της κλάσης MenuItem στην οθόνη.

Για να επεκτείνετε το
MenuItem κλάση, χρησιμοποιήστε την ακόλουθη σύνταξη μεταβίβασης της κλάσης.
Public Class MyIconMenu    Inherits MenuItem
End Class
Επιστροφή στην κορυφή

Για να δηλώσετε ένα αντικείμενο γραμματοσειράς και εικονίδιο αντικειμένου για την κλάση MenuItem

Όταν η μεταβίβαση από την κλάση MenuItem , κληρονομούν τις ιδιότητες, τις μεθόδους και τα συμβάντα. Μπορείτε να δημιουργήσετε το δικό σας εικονίδιο για προσαρμοσμένη κλάση σας, παρακάμπτοντας τη συμπεριφορά δύο από τις μεθόδους που θα μεταβιβαστούν. Μπορείτε να παρακάμψετε τη συμπεριφορά της μεθόδου OnMeasureItem και της OnDrawItem μεθόδου. Τα πεδία private πρέπει επίσης να δηλώσει εντός σας προσαρμοσμένη κλάση για τη διατήρηση ενός αντικειμένου γραμματοσειράς και εικονίδιο αντικειμένου. Χρειάζεστε ένα αντικείμενο γραμματοσειράς έτσι ώστε να σας προσαρμοσμένη κλάση μπορεί να περιέχει κείμενο, εκτός από τα εικονίδια.

Εάν χρειάζεστε έναν τρόπο για προγραμματιστές που χρησιμοποιούν την κλάση προσαρμοσμένο σας να προετοιμάσει τα ιδιωτικά πεδία, χρησιμοποιήστε την κατασκευή του σας προσαρμοσμένη κλάση. Μια κατασκευή 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 του σας προσαρμοσμένη κλάση στην τιμή true αν θέλετε να εμφανίσετε ένα εικονίδιο. Αυτό το βήμα είναι σημαντικό, γιατί αν δεν ολοκληρωθεί αυτό το βήμα, θα εμφανίζονται εικονίδια μενού σας.

Επιστροφή στην κορυφή

Προσθήκη στοιχείων στο μενού ""

Εξετάστε τις δύο μεθόδους που πρέπει να αντικατασταθεί. Η μέθοδος OnMeasureItem καλείται όταν σχεδιάζεται το μενού σας. Η μέθοδος OnMeasureItem σάς επιτρέπει να προσδιορίσετε το μέγεθος του μενού σας ρυθμίζοντας τις δύο ιδιότητες της κατασκευής MeasureItemEventArgs . Οι δύο ιδιότητες της κατασκευής MeasureItemEventArgs που ορίζετε είναι η ιδιότητα ItemHeight και την ιδιότητα ItemWidth . Αυτές οι ρυθμίσεις μεταβιβάζονται ως παράμετροι για τη μέθοδο OnMeasureItem .

Εάν θέλετε, μπορείτε να καθορίσετε το ύψος του στοιχείου μενού με βάση το ύψος του εικονιδίου. Αυτό μπορεί να ή ενδέχεται να μην είναι πάντοτε κατάλληλες. Συνήθως, το ύψος του κειμένου του στοιχείου μενού δεν πρέπει να υπερβαίνει το ύψος του εικονιδίου.

Για να προσδιορίσετε το πλάτος του μενού σας, πρέπει να γνωρίζετε το πλάτος του τη συμβολοσειρά που εμφανίζεται στο στοιχείο μενού. Μπορείτε να χρησιμοποιήσετε το αντικείμενο μορφή για να ανακτήσουν αυτές τις πληροφορίες. Μπορείτε να βρείτε αυτό το αντικείμενο στο χώρο ονομάτων 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.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.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

Σημείωση Πρέπει να αλλάξετε τον κωδικό του 2005 Visual Basic. Από προεπιλογή, η Visual Basic δημιουργεί δύο αρχεία για το έργο, όταν δημιουργείτε ένα έργο Windows φόρμες. Εάν η φόρμα ονομάζεται Form1, τα δύο αρχεία που αντιπροσωπεύει τη φόρμα ονομάζονται Form1.vb και Form1.Designer.vb. Συντάξτε τον κώδικα στο αρχείο Form1.vb. Η σχεδίαση φορμών Windows εγγράφει τον κώδικα στο αρχείο Form1.Designer.vb. Ο σχεδιαστής των Windows χρησιμοποιεί τη μερική λέξη-κλειδί για να διαιρέσετε την εφαρμογή της φόρμας Form1 σε δύο ξεχωριστά αρχεία. Αυτή η συμπεριφορά αποτρέπει είναι διάσπαρτα με τον κώδικά σας τον κώδικα που δημιουργείται από το σχεδιαστή.

Για περισσότερες πληροφορίες σχετικά με τις νέες βελτιώσεις γλώσσα Visual Basic 2005, επισκεφθείτε την ακόλουθη τοποθεσία του Microsoft Developer Network (MSDN) στο Web:

Για περισσότερες πληροφορίες σχετικά με τη μερική κλάσεις και ο σχεδιαστής των Windows, επισκεφθείτε την ακόλουθη τοποθεσία MSDN στο Web:

Επιστροφή στην κορυφή
Ιδιότητες

Αναγνωριστικό άρθρου: 888168 - Τελευταία αναθεώρηση: 17 Ιαν 2017 - Αναθεώρηση: 1

Σχόλια