Come creare un menu personalizzato in Visual Basic .NET o in Visual Basic 2005

Traduzione articoli Traduzione articoli
Identificativo articolo: 888168 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

informazioni su come creare un menu personalizzato in Microsoft Visual Basic .NET o Microsoft Visual Basic 2005 tramite le discussioni e gli esempi di codice.

INTRODUZIONE

In questo articolo viene descritto come creare un menu personalizzato in Microsoft Visual Basic .NET o in Microsoft Visual Basic 2005. Creare un menu personalizzato ereditando il controllo MainMenu e aggiungendo proprietÓ agli elementi del controllo MainMenu .

Estendere la classe MenuItem

La classe MenuItem non fornisce un metodo incorporato di visualizzare un'icona. Ad esempio, non esiste una proprietÓ icona che Ŕ possibile impostare per visualizzare un'icona. Quando una classe di Microsoft .NET Framework non fornisce una funzionalitÓ che si desidera, Ŕ possibile estendere tale classe e fornire le funzionalitÓ manualmente.

╚ possibile estendere la classe MenuItem in modo che si possa creare una voce di menu creati dal proprietario. Un elemento di menu creati dal proprietario indica che lo sviluppatore Ŕ responsabile del disegno la classe MenuItem sullo schermo.

Per estendere la classe MenuItem , utilizzare la seguente sintassi di ereditarietÓ di classe.
Public Class MyIconMenu
    Inherits MenuItem
End Class

Dichiarare un oggetto Font e un oggetto di icona per la classe MenuItem

Quando si eredita dalla classe MenuItem , Ŕ possibile ereditare le proprietÓ, metodi ed eventi. ╚ possibile creare un'icona personalizzata per la classe personalizzata eseguendo l'override il comportamento di due dei metodi che si ereditano. ╚ eseguire l'override del comportamento del metodo OnMeasureItem e del metodo OnDrawItem . ╚ inoltre necessario dichiarare campi privati all'interno della classe per contenere un carattere personalizzata e un oggetto di icona . Occorre un oggetto Font in modo che la classe personalizzata pu˛ contenere testo oltre ai icone.

Se Ŕ necessario un modo per gli sviluppatori che utilizzano la classe personalizzata per inizializzare i campi privati, utilizzare il costruttore della classe personalizzata. Un costruttore di Visual Basic .NET 2003 Ŕ un metodo speciale che viene chiamato di Nuovo . Il metodo New viene chiamato da .NET Framework quando viene creata un'istanza la classe personalizzata. Utilizzando Visual Basic .NET 2003, Ŕ possibile passare parametri al costruttore del.

Visual Basic .NET 2003 supporta anche l'overload del metodo. ╚ possibile definire lo stesso metodo molte volte, purchÚ le firme del metodo siano univoche.

Utilizzando i costruttori e l'overload del metodo, Ŕ possibile consentire agli sviluppatori di inizializzare i campi privati della classe personalizzata. Il codice per la classe personalizzata potrebbe essere simili a quelle nell'esempio di codice riportato di seguito.
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
Si noti che Ŕ stato utilizzato l'overload di metodo con il costruttore in modo che lo sviluppatore abbia la possibilitÓ di una voce di menu con un'icona o di una voce di menu senza un'icona. ╚ inoltre necessario impostare la proprietÓ OwnerDraw della classe personalizzata sul valore true se si desidera visualizzare un'icona. Questo passaggio Ŕ importante perchÚ se questo passaggio non Ŕ stata completata, non le icone vengono visualizzate nel menu.

Aggiungere elementi al menu

Esaminare i due metodi che devono essere sottoposto a override. Il metodo OnMeasureItem viene chiamato quando il menu viene disegnato. Il metodo OnMeasureItem consente di specificare la dimensione di menu impostando le proprietÓ di due del costruttore MeasureItemEventArgs . Le due proprietÓ del costruttore MeasureItemEventArgs che Ŕ possibile impostare sono la proprietÓ ItemHeight e la proprietÓ ItemWidth . Queste impostazioni vengono passate come parametri al metodo OnMeasureItem .

╚ possibile che si desidera determinare l'altezza della voce di menu in base all'altezza dell'icona. Questo pu˛ o non sempre essere appropriato. In genere, l'altezza del testo della voce di menu non deve superare l'altezza dell'icona.

Per determinare la larghezza del menu, Ŕ necessario conoscere la larghezza della stringa visualizzata nella voce di menu. ╚ possibile utilizzare l'oggetto StringFormat per recuperare queste informazioni. Questo oggetto Ŕ reperibile nello spazio dei nomi System.Drawing . Quando si misura la larghezza della voce di menu, Ŕ necessario considerare anche l'icona.

Il codice per il metodo OnMeasureItem potrebbe essere simile all'esempio di codice riportato di seguito.
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

Disegnare il menu

Dopo aver specificato la dimensione del menu, Ŕ necessario disegnare il menu utilizzando il metodo OnDrawItem della classe personalizzata. Questo metodo viene passato all'oggetto DrawItemEventArgs . ╚ possibile utilizzare l'oggetto DrawItemEventArgs per ottenere un oggetto Graphics per la voce di menu. Questo consente di disegnare direttamente sulla superficie del menu utilizzando le potenti funzionalitÓ GDI + disponibili in .NET Framework. In primo luogo, disegnare un colore di sfondo. Quindi disegnare l'icona. Infine, disegna il testo della voce di menu.

Il codice per il menu potrebbe essere simile all'esempio di codice riportato di seguito.
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

Creare un collegamento da tastiera per la voce di menu

Negli esempi di codice, la funzione AppendShortcut viene chiamata nel metodo OnMeasureItem e il metodo OnDrawItem . ╚ possibile misurare e disegnare la stringa in base alla proprietÓ testo della voce di menu. Tuttavia, questo non considera il fatto che la voce di menu potrebbe avere un tasto di scelta rapida. Se la voce di menu Ŕ un tasto di scelta rapida, Ŕ necessario visualizzare i tasti di scelta rapida e aumentare la larghezza della voce di menu. ╚ necessario rappresentare i tasti di scelta rapida come stringa. La funzione AppendShortcut rappresenta la scelta rapida come stringa e accoda la stringa di collegamento al testo dell'elemento menu esistente.

Il codice per la funzione AppendShortcut potrebbe essere simile all'esempio di codice riportato di seguito.
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

Evidenziare la voce di menu

Dopo aver creato una voce di menu sull'icona di base, sarÓ necessario selezionare la voce di menu, come l'opzione Ŕ selezionata. ╚ necessario disegnare un bordo e selezionare il testo nel metodo OnDrawItem .

Esempio di codice

Nell'esempio di codice riportato di seguito Ŕ il codice completo per la classe personalizzata. Questo esempio di codice include il codice per evidenziare la voce di menu.
' 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
Nota ╚ necessario modificare il codice in Visual Basic 2005. Per impostazione predefinita, in Visual Basic due file per il progetto viene creata quando si crea un progetto Windows Form. Se il modulo denominato Form1, i due file che rappresentano il form sono denominati Form1.vb e Form1.Designer.vb. ╚ possibile scrivere il codice nel file Form1.vb. Progettazione Windows Form scrive il codice nel file Form1.Designer.vb. Progettazione Windows Form consente di utilizzato la parola chiave partial per dividere l'implementazione di Form1 in due file distinti. Questo comportamento impedisce che il codice generato per la finestra di progettazione venga frammisto con il codice.

Per ulteriori informazioni sui miglioramenti apportati nuovo linguaggio Visual Basic 2005, visitare il seguente sito Web MSDN (informazioni in lingua inglese):
http://msdn2.microsoft.com/en-us/library/ms379584(vs.80).aspx
Per ulteriori informazioni sulle classi parziali e Progettazione Windows Form, visitare il seguente sito Web MSDN:
http://msdn2.microsoft.com/en-us/library/ms171843.aspx

ProprietÓ

Identificativo articolo: 888168 - Ultima modifica: venerdý 11 maggio 2007 - Revisione: 2.5
Le informazioni in questo articolo si applicano a:
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Chiavi:á
kbmt kbvs2005swept kbvs2005applies kbhowtomaster kbprogramming kbmacroexample kbexpertiseinter kbhowto KB888168 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 888168
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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