Comment créer un menu personnalisé dans Visual Basic .NET ou dans Visual Basic 2005

Traductions disponibles Traductions disponibles
Numéro d'article: 888168 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Apprenez à créer un menu personnalisé dans Microsoft Visual Basic .NET ou Microsoft Visual Basic 2005 via les discussions et exemples de code.

INTRODUCTION

Cet article explique comment créer un menu personnalisé dans Microsoft Visual Basic .NET ou dans Microsoft Visual Basic 2005. Vous créez un menu personnalisé par héritage le contrôle MainMenu et en ajoutant des propriétés aux éléments du contrôle MainMenu .

Étendre la classe MenuItem

La classe MenuItem ne fournit pas un moyen intégré d'affichage d'une icône. Par exemple, il n'est aucune propriété de l'icône que vous pouvez définir pour afficher une icône. Lorsqu'une classe Microsoft .NET Framework ne fournit pas une fonctionnalité que vous souhaitez, vous pouvez étendre cette classe et vous pouvez fournir la fonctionnalité vous-même.

Vous pouvez étendre la classe MenuItem afin que vous pouvez créer un élément de menu tracé de propriétaire. Un élément de menu tracé de propriétaire signifie que le développeur est responsable du dessin de la classe MenuItem à l'écran.

Pour étendre la classe MenuItem , utilisez la syntaxe de l'héritage classe suivante.
Public Class MyIconMenu
    Inherits MenuItem
End Class

Déclarer un objet Font et un objet Icon pour la classe MenuItem

Lorsque vous héritez de la classe MenuItem , vous héritez ses propriétés, méthodes et événements. Vous pouvez créer votre propre icône pour votre classe personnalisée en remplaçant le comportement de deux des méthodes qui vous héritez. Vous remplacer le comportement de la méthode OnMeasureItem et de la méthode OnDrawItem . Vous devez également déclarer des champs privés dans votre classe personnalisée pour contenir une police objet et un objet de l'icône . Vous devez connaître un objet font pour votre classe personnalisée peut contenir du texte avec icônes.

Si vous avez besoin d'un moyen pour les développeurs qui utilisent votre classe personnalisée pour initialiser les champs privés, utiliser le constructeur de votre classe personnalisée. Un constructeur de Visual Basic .NET 2003 est une méthode spéciale qui est appelée à nouveau . La méthode New est appelée par le .NET Framework lorsque votre classe personnalisée est instancié. En utilisant Visual Basic .NET 2003, vous pouvez transmettre des paramètres à votre constructeur.

Visual Basic .NET 2003 prend également en charge la surcharge de méthode. Vous pouvez définir la même méthode autant de fois que les signatures de méthode sont uniques.

En utilisant constructeurs et la surcharge de méthode, vous pouvez laisser les développeurs initialiser les champs privés de votre classe personnalisée. Le code de votre classe personnalisée peut ressembler à l'exemple de code suivant.
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
Notez que vous avez utilisées surcharge de méthode dans le constructeur afin que le développeur la possibilité de disposer d'un élément de menu avec une icône ou d'un élément de menu sans une icône. Vous devez également définir la propriété OwnerDraw de votre classe personnalisée à la valeur true si vous souhaitez afficher une icône. Cette étape est importante car si cette étape n'est pas effectuée, aucune icône ne s'affichent dans le menu.

Ajouter des éléments au menu

Examinez les deux méthodes qui doivent être remplacés. La méthode OnMeasureItem est appelée lorsque le menu est dessiné. La méthode OnMeasureItem permet de spécifier la taille de votre menu en paramétrant les propriétés deux du constructeur MeasureItemEventArgs . Les deux propriétés du constructeur MeasureItemEventArgs que vous définissez sont la propriété ItemHeight et la propriété ItemWidth . Ces paramètres sont transmis en tant que paramètres à la méthode OnMeasureItem .

Vous voulez pouvez déterminer la hauteur de l'élément de menu en fonction de la hauteur de l'icône. Cela peut ou peuvent ne pas toujours être appropriée. En règle générale, la hauteur du texte de l'élément de menu ne doit pas dépasser la hauteur de l'icône.

Pour déterminer la largeur de votre menu, vous devez connaître la largeur de la chaîne qui est affichée dans l'élément de menu. Vous pouvez utiliser l'objet StringFormat pour récupérer cette information. Cet objet peut être trouvé dans l'espace de noms System.Drawing . Lorsque vous mesurer la largeur de l'élément de menu, vous devez également considérer l'icône.

Le code de votre méthode OnMeasureItem peut être semblable à l'exemple de code suivant.
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

Dessiner votre menu

Après avoir spécifié la taille de votre menu, vous devez tracer votre menu à l'aide la méthode OnDrawItem de votre classe personnalisée. Cette méthode est transmise à l'objet DrawItemEventArgs . Vous pouvez utiliser l'objet DrawItemEventArgs pour obtenir un objet Graphics pour votre élément de menu. Cela permet de dessiner directement sur la surface de votre menu en utilisant les puissantes fonctionnalités GDI + qui sont disponibles dans le .NET Framework. Tout d'abord, tracez une couleur d'arrière-plan. Dessinez ensuite, l'icône. Enfin, dessiner le texte de l'élément de menu.

Le code pour votre menu peut être semblable à l'exemple de code suivant. e.Graphics.FillRectangle
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
br.Dispose() br = Nothing sf.Dispose() sf = Nothing End Sub

Créer un raccourci clavier pour l'élément de menu

Dans les exemples de code, la fonction AppendShortcut est appelée dans la méthode OnMeasureItem et la méthode OnDrawItem . Vous pourriez mesurer et dessiner votre chaîne de la propriété Text de l'élément de menu. Toutefois, cela ne tient pas compte du fait que l'élément de menu peut avoir un raccourci clavier. Si l'élément de menu possède de raccourci clavier, vous devez afficher le raccourci clavier, augmenter la largeur de l'élément de menu. Vous devez représenter le raccourci clavier sous la forme d'une chaîne. La fonction AppendShortcut représente le raccourci clavier en tant que chaîne et ajoute la chaîne de raccourci à du texte d'élément menu existant.

Le code de la fonction AppendShortcut peut être semblable à l'exemple de code suivant.
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

Mettez en surbrillance l'article de menu

Après avoir créé un élément de menu icône de base, vous souhaiterez peut-être sélectionnez ce dernier menu qu'il est sélectionné. Vous devez dessiner une bordure, sélectionnez le texte de la méthode OnDrawItem .

Exemple de code

L'exemple de code suivant est le code complet de votre classe personnalisée. Cet exemple de code inclut le code pour mettre en surbrillance l'élément de 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
Remarque vous devez modifier le code dans Visual Basic 2005. Par défaut, Visual Basic crée deux fichiers pour le projet lorsque vous créez un projet Windows Forms. Si le formulaire est nommé Form1, les fichiers deux qui représentent le formulaire sont nommés Form1.vb et Form1.Designer.vb. Vous écrivez le code dans le fichier Form1.vb. Le concepteur Windows Forms écrit le code dans le fichier Form1.Designer.vb. Le concepteur Windows Forms utilise le mot clé partiel pour répartir l'implémentation de Form1 en deux fichiers distincts. Ce comportement empêche le code concepteur généré d'être insérés dans votre code.

Pour plus d'informations sur les nouvelles améliorations de langage Visual Basic 2005, reportez-vous au site de Web MSDN (Microsoft Developer Network) suivant :
http://msdn2.microsoft.com/en-us/library/ms379584(vs.80).aspx
Pour plus d'informations sur des classes partielles et le concepteur Windows Forms, reportez-vous au site Web MSDN suivant :
http://msdn2.microsoft.com/en-us/library/ms171843.aspx

Propriétés

Numéro d'article: 888168 - Dernière mise à jour: vendredi 11 mai 2007 - Version: 2.5
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Initiation
  • Microsoft Visual Basic .NET 2002 Initiation
Mots-clés : 
kbmt kbvs2005swept kbvs2005applies kbhowtomaster kbprogramming kbmacroexample kbexpertiseinter kbhowto KB888168 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 888168
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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