Como criar um menu personalizado no Visual Basic .NET ou no Visual Basic 2005

Traduções deste artigo Traduções deste artigo
ID do artigo: 888168 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Aprenda a criar um menu personalizado no Microsoft Visual Basic .NET ou Microsoft Visual Basic 2005 através de discussões e exemplos de código.

INTRODUÇÃO

Este artigo descreve como criar um menu personalizado no Microsoft Visual Basic .NET ou no Microsoft Visual Basic 2005. Você criar um menu personalizado por herança o controle MainMenu e adicionando propriedades para os itens do controle MainMenu .

Estender a classe MenuItem

A classe MenuItem não fornece uma maneira interna de exibir um ícone. Por exemplo, não há nenhuma propriedade ícone que você pode definir para exibir um ícone. Quando uma classe do Microsoft .NET Framework não fornece um recurso que deseja, você pode estender a classe e você pode fornecer o recurso.

Você pode estender a classe MenuItem para que você possa criar um item de menu desenhados pelo proprietário. Um item de menu desenhados pelo proprietário significa que o desenvolvedor é responsável pela classe MenuItem na tela de desenho.

Para estender a classe MenuItem , use a seguinte sintaxe de herança de classe.
Public Class MyIconMenu
    Inherits MenuItem
End Class

Declare um objeto Font e um objeto ícone para a classe MenuItem

Quando você herdar da classe MenuItem , herdam suas propriedades, métodos e eventos. Você pode criar seu próprio ícone para sua classe personalizada, substituindo o comportamento dos dois dos métodos que você herdar. Você substituir o comportamento do método OnMeasureItem e do método OnDrawItem . Você também deve declarar campos particulares em sua classe personalizada para armazenar uma fonte de objeto e um ícone de objeto. Um objeto Font é necessário que sua classe personalizada pode conter texto, além do ícones.

Se você precisar de uma maneira para os desenvolvedores que usam sua classe personalizada para inicializar os campos particulares, use o construtor da sua classe personalizada. Um construtor Visual Basic .NET 2003 é um método especial que é chamado de novo . O método New é chamado pelo .NET Framework quando sua classe personalizada é instanciado. Usando o Visual Basic .NET 2003, você pode passar parâmetros para o construtor.

Visual Basic .NET 2003 também oferece suporte a sobrecarga de método. Você pode definir o mesmo método muitas vezes, desde que as assinaturas de método são exclusivas.

Usando o construtores e sobrecarga de método, você pode permitir que os desenvolvedores inicializar os campos particulares da sua classe personalizada. O código para sua classe personalizada pode ser semelhante ao seguinte exemplo de código.
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
Observe que você usou o método sobrecarga em seu construtor para que o desenvolvedor tem a opção de ter um item de menu com um ícone ou um item de menu sem um ícone. Você também deve definir a propriedade OwnerDraw de sua classe personalizada para o valor true se você desejar exibir um ícone. Essa etapa é importante porque se essa etapa não for concluída, nenhum ícone é exibido no menu.

Adicionar itens ao menu

Examine os dois métodos que devem ser substituídos. O método OnMeasureItem é chamado quando o menu é desenhado. O método OnMeasureItem permite que você especificar o tamanho do seu menu duas propriedades de configuração do construtor MeasureItemEventArgs . As duas propriedades do construtor MeasureItemEventArgs que você definir são propriedade ItemHeight e a propriedade ItemWidth . Essas configurações são passadas como parâmetros para o método OnMeasureItem .

Convém determinar a altura do item de menu com base na altura do ícone. Isso pode ou não sempre ser apropriado. Normalmente, a altura do texto do item de menu não deve exceder a altura do ícone.

Para determinar a largura do seu menu, você deve saber a largura da seqüência que é exibida no item de menu. Você pode usar o objeto StringFormat para recuperar essas informações. Este objeto pode ser encontrado no namespace System.Drawing . Quando você medir a largura do item de menu, você também deve considerar o ícone.

O código para o método OnMeasureItem pode ser semelhante ao exemplo de código a seguir.
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

Desenhar seu menu

Depois de especificar o tamanho do seu menu, você deve desenhar seu menu usando o método OnDrawItem de sua classe personalizada. Esse método é passado para o objeto DrawItemEventArgs . Você pode usar o objeto DrawItemEventArgs para obter um objeto Graphics para o item de menu. Isso permite que você desenhar diretamente na superfície do seu menu usando os recursos GDI + poderosos que estão disponíveis no .NET Framework. Primeiro, desenhe uma cor de plano de fundo. Em seguida, desenhe o ícone. Por último, desenhar o texto do item de menu.

O código para o menu pode ser semelhante ao exemplo de código a seguir.
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

Criar um atalho de teclado para o item de menu

Os exemplos de código, a função AppendShortcut é chamada no método OnMeasureItem e o método OnDrawItem . Você pode medir e desenhar sua seqüência baseada na propriedade Text do item de menu. No entanto, isso não considera o fato de que o item de menu talvez tenha um atalho de teclado. Se o item de menu tiver um atalho de teclado, você deve exibir o atalho de teclado e aumentar a largura do item de menu. Você deve representar o atalho de teclado como uma seqüência de caracteres. A função AppendShortcut representa o atalho de teclado como uma seqüência de caracteres e o acrescenta a seqüência de caracteres de atalho ao texto de item de menu existente.

O código para a função AppendShortcut pode ser semelhante ao exemplo de código a seguir.
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

Realce o item de menu

Depois de criar um item de menu de ícone básico, talvez queira realçar o item de menu enquanto ele está selecionado. Você deve desenhar uma borda e realce o texto no método OnDrawItem .

Exemplo de código

O exemplo de código a seguir é o código completo para sua classe personalizada. Este exemplo de código inclui o código para realçar o item 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
Observação você deve alterar o código no Visual Basic 2005. Por padrão, Visual Basic cria dois arquivos para o projeto quando você cria um projeto Windows Forms. Se o formulário é denominado Form1, os dois arquivos que representam o formulário são chamados de Form1.vb e Form1.Designer.vb. Escreva o código no arquivo Form1.vb. O Windows Forms Designer escreve o código no arquivo Form1.Designer.vb. O Windows Forms Designer usa a palavra-chave partial para dividir a implementação de Form1 em dois arquivos separados. Esse comportamento impede que o código gerado pelo designer sendo intercaladas com seu código.

Para obter mais informações sobre os novos aprimoramentos linguagem Visual Basic 2005, visite o seguinte site da Web Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/library/ms379584(vs.80).aspx
Para obter mais informações sobre classes parciais e o Windows Forms Designer, visite o seguinte site da MSDN:
http://msdn2.microsoft.com/en-us/library/ms171843.aspx

Propriedades

ID do artigo: 888168 - Última revisão: sexta-feira, 11 de maio de 2007 - Revisão: 2.5
A informação contida neste artigo aplica-se a:
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Palavras-chave: 
kbmt kbvs2005swept kbvs2005applies kbhowtomaster kbprogramming kbmacroexample kbexpertiseinter kbhowto KB888168 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 888168

Submeter comentários

 

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