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

Traduções de Artigos Traduções de Artigos
Artigo: 888168 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Aprenda a criar um menu personalizado no Microsoft Visual Basic .NET ou Microsoft Visual Basic 2005 pela debates 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. Criar um menu personalizado por herança controlo MainMenu e adicionar propriedades aos itens do controlo MainMenu .

Expandir a classe MenuItem

A classe MenuItem não fornece uma forma incorporada de apresentar um ícone. Por exemplo, não existe nenhuma propriedade de ícones que podem ser definidas para apresentar um ícone. Quando uma classe de Microsoft .NET Framework não fornece uma funcionalidade que pretende, pode expandir dessa classe e pode fornecer a funcionalidade de si próprio.

Pode expandir a classe MenuItem para que possa criar um item de menu desenhada de proprietário. Um item de menu desenhado proprietário significa que o programador é responsável pela classe MenuItem de desenho no ecrã.

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

Declarar um objecto de tipo de letra e um objecto de ícone para a classe MenuItem

Quando herda da classe MenuItem , herdam respectivas propriedades, métodos e eventos. Pode criar seu próprio ícone para a classe personalizada por substituir o comportamento de dois métodos que pode herda. Substituir o comportamento do método OnMeasureItem e do método OnDrawItem . Também tem de declarar campos privados dentro da classe personalizada para conter um tipo de letra objecto e um objecto de ícone . Necessita de um objecto de tipo de letra para que a classe personalizada pode conter texto juntamente com ícones.

Se necessitar de uma forma para programadores que utilizam a classe personalizada para inicializar os campos privados, utilize o Construtor de sua classe personalizada. Um construtor Visual Basic .NET 2003 é um método especial denominada Novo . O Novo método é chamado pelo .NET Framework quando a classe personalizada é instanciado. Utilizando o Visual Basic .NET 2003, pode passar parâmetros para o construtor.

Visual Basic .NET 2003 também suporta o método sobrecarga. Pode definir o mesmo método muitas vezes, desde que as assinaturas do método são exclusivas.

Utilizando construtores e método de sobrecarga, pode permitir que os programadores inicializar os campos privados da sua classe personalizada. O código para a classe personalizada poderá 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
Repare que utilizou método sobrecarga no construtor para que o programador tenha a opção de ter um item de menu com um ícone ou um item de menu sem um ícone. Também tem de definir a propriedade OwnerDraw a classe personalizada para o valor true se pretender apresentar um ícone. Este passo é importante porque se este passo não é concluído, sem ícones são apresentados no menu.

Adicionar itens de menu

Examine os dois métodos que tem de ser substituídos. O método OnMeasureItem é chamado quando o menu é desenhado. O método OnMeasureItem permite especificar o tamanho do seu menu configurando as duas propriedades do construtor MeasureItemEventArgs . As duas propriedades do construtor MeasureItemEventArgs que definiu são propriedade ItemHeight e a propriedade ItemWidth . Estas definições são passadas como parâmetros para o método OnMeasureItem .

Poderá pretender determinar a altura do item de menu com base na altura do ícone. Isto pode ou não sempre ser adequado. Normalmente, a altura do texto do item de menu não deve exceder a altura do ícone.

Para determinar a largura do seu menu, tem de saber a largura da cadeia que é apresentada no item de menu. Pode utilizar o objecto StringFormat para obter estas informações. Este objecto poderá encontrar no espaço de nomes System.Drawing . Ao medir a largura do item de menu, também tem de considerar o ícone.

O código para o método OnMeasureItem poderá ser semelhante ao seguinte exemplo de código.
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 o menu

Depois de especificar o tamanho do menu do, tem de desenhar o menu utilizando o método OnDrawItem a classe personalizada. Este método é transmitido para o objecto DrawItemEventArgs . Pode utilizar o objecto DrawItemEventArgs para obter um objecto gráfico para o item de menu. Isto permite-lhe desenhar directamente na superfície do seu menu utilizando as poderosas GDI + funcionalidades disponíveis no .NET Framework. Em primeiro lugar, desenhe uma cor de fundo. Em seguida, desenhe o ícone. Por último, desenhar o texto do item de menu.

O código para o menu poderá ser semelhante ao seguinte exemplo de código.
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

No exemplos de código, a função AppendShortcut denomina-se no método OnMeasureItem e o método OnDrawItem . Pode medir e desenhar a cadeia baseada a propriedade de texto do item de menu. No entanto, isto não considera o facto de que o item de menu pode ter um atalho de teclado. Se o item de menu tiver um atalho de teclado, tem de apresentar o atalho de teclado e aumentar a largura do item de menu. Tem de representar o atalho de teclado como uma cadeia. A função AppendShortcut representa o atalho de teclado como uma cadeia e anexa a cadeia de atalho o texto do item de menu existente.

O código para a função AppendShortcut poderá ser semelhante ao seguinte exemplo de código.
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 menu de ícone básica, poderá realçar o item de menu que esteja seleccionada. Deve desenhar um limite e realce o texto no método OnDrawItem .

Exemplo de código

O exemplo de código seguinte é o código concluído para a 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
Nota tem de alterar o código do Visual Basic 2005. Por predefinição, o Visual Basic cria dois ficheiros para o projecto quando cria um projecto de Windows Forms. Se o formulário é o nome Form1, os dois ficheiros que representam o formulário são denominados Form1.VB e Form1.Designer.vb. Tem de escrever o código no ficheiro Form1.VB. O Windows Forms Designer escreve o código no ficheiro Form1.Designer.vb. O Windows Forms Designer utiliza a palavra-chave parcial para dividir a implementação do Form1 em dois ficheiros separados. Este comportamento impede que o código gerado pelo estruturador a ser intercalados com o código.

Para obter mais informações sobre novos melhoramentos de idioma do Visual Basic 2005, visite o seguinte Web site da 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 Web MSDN:
http://msdn2.microsoft.com/en-us/library/ms171843.aspx

Propriedades

Artigo: 888168 - Última revisão: 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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