Ferramentas de Usuário

Ferramentas de Site


dev_net:vb.net:contextmenu

Context Menus

Introdução

Se não faz ideia do que sejam menus de contexto, sem se ter apercebido está regularmente a recorrer a eles. Mesmo aqui no web browser que interpretou esta página existem dezenas de menus de contexto. Estes menus de contexto são menus cujas opções se adaptam ao contexto da sua origem. Se carregar no botão direito do rato (ou esquerdo, o oposto ao de selecção na sua configuração) verá que surge um menu a partir da localização do ponteiro do rato. Ao olhar cuidadosamente para este menu, verifica que todas as opções estão directa ou indirectamente relacionadas com o sítio onde está o ponteiro do rato. No web browser, poderá ver opções como "Ver código fonte", "Imprimir" ou "Actualizar página". Estas opções estão directamente relacionadas com o que está sobre o rato: a página. Se tentar aceder ao menu de contexto noutro sítio, digamos na barra de endereço, verificará que as opções se inclinam mais para o texto: "Copiar", "Cortar", "Apagar", "Seleccionar tudo". Na nossa realidade, é possível adaptar um menu de contexto a cada situação, mas torna-se mais fácil ter um menu de contexto para cada objecto, até porque a maioria dos objectos .NET suportam a atribuição de um ContextMenu. Os menus de contexto são, aliás, tão importantes que a maioria dos teclados desenhados para Microsoft Windows incluem para além da "WinKey" (a tecla com o logotipo do Windows) uma tecla para aceder a menus de contexto.

A tecla de menus de contexto encontra-se geralmente colocada entre a "WinKey" direita e o Ctrl direito

Criar menus de contexto

Posta a importância, passemos à prática. Existem duas maneiras de criar um menu de contexto. Se se tratar de um menu estático, é aconselhável que o desenhe no IDE. Se por outro lado, sentir a necessidade de criar um menu programáticamente não terá como o fazer no IDE. Em alternativa, é possível criar um menu no IDE e alterá-lo programáticamente.

Criação em "Runtime"

A criação do menu de contexto em runtime exige algum trabalho.

A falta de explicação no corpo do artigo é compensada pelos comentários nos blocos de código
Public Class Form1
    'criamos a instância do menu de contexto
    Private CM As New ContextMenuStrip
    'criamos uma instancia para um item, o que vai servir de "checkbox" e para a combobox
    'todos os outros podem ser adicionados através do método ADD()
    Dim TSMI As New ToolStripMenuItem
    Dim CB As New ToolStripComboBox
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 
        'adicionamos um item normal ao menu, que se endereça ao sub MudaCor quando clicado
        CM.Items.Add("Mudar cor...", Me.Icon.ToBitmap, AddressOf MudaCor)
        'adicionamos um item normal ao menu, que se endereça ao sub TrocaNome quando clicado
        CM.Items.Add("Altera nome do form", Me.Icon.ToBitmap, AddressOf TrocaNome)
        'adicionamos um separador de items
        CM.Items.Add(New ToolStripSeparator)
 
        'atribuimos alguns items à combobox
        CB.Items.Add("João")
        CB.Items.Add("Maria")
        CB.Items.Add("Joaquina")
        CB.SelectedIndex = 0
 
        'de seguida inserimos a combobox no menu de contexto
        CM.Items.Add(CB)
 
        'adicionamos outro separador de items
        CM.Items.Add(New ToolStripSeparator)
 
        'adicionamos um item que vai ser mais à frente dado como uma verificação
        'nos anteriores não é necessário instanciar um novo item ToolStripMenuItem mas no caso de ser um item
        'para servir de checkbox, é necessário para podermos defenir a propriedade CheckOnClick
        TSMI.CheckOnClick = True
        TSMI.Text = "Avisar ao sair"
        TSMI.CheckState = CheckState.Checked
 
        'criamos um novo item e associamos ao item previamente criado para servir de checkbox
        'para demonstrar a capacidade "multi níveis" de um menu.
        'DropDownItems representa a colecção de items dentro de um item.
        Dim TSMI2 As New ToolStripMenuItem
        TSMI2.Text = "Nível 2"
        TSMI2.DropDownItems.Add("Nível 3")
        TSMI.DropDownItems.Add(TSMI2)
 
        CM.Items.Add(TSMI)
 
        'adicionamos um item normal ao menu, que se endereça ao sub SairDaqui quando clicado
        CM.Items.Add("Sair", Me.Icon.ToBitmap, AddressOf SairDaqui)
 
        'determinamos que a imgem dos items 0,1,3 e 6 não deve redimensionar, para ficar com o icone grande
        CM.Items(0).ImageScaling = ToolStripItemImageScaling.None
        CM.Items(1).ImageScaling = ToolStripItemImageScaling.None
        CM.Items(3).ImageScaling = ToolStripItemImageScaling.None
        CM.Items(6).ImageScaling = ToolStripItemImageScaling.None
 
        'adicionamos ToolTipText a todos os items
        CM.Items(0).ToolTipText = "Troca a cor de fundo do form"
        CM.Items(1).ToolTipText = "Alterar nome"
        CM.Items(3).ToolTipText = "Escolhe o sujeito"
        CM.Items(5).ToolTipText = "Determina se deve avisar o utilizador antes de sair"
        CM.Items(6).ToolTipText = "Sai da aplicação"
 
        'trocamos a cor de fundo do item 0 (o da troca de cor) para a actual cor de fundo do form
        CM.Items(0).BackColor = Me.BackColor
 
        'por fim, adicionamos esta CM (ContextMenu) ao Form, tornando-o disponível quando o menu de contexto
        'for chamado em qualquer ponto da superfície do form
        Me.ContextMenuStrip = CM
    End Sub
 
    'o sub para mudar a cor, endereço de um botão no menu de contexto
    Private Sub MudaCor()
        Dim CD As New ColorDialog
        CD.ShowDialog()
        Me.BackColor = CD.Color
        CM.Items(0).BackColor = CD.Color
    End Sub
 
    'o sub para trocar de nome, endereço de um botão no menu de contexto
    Private Sub TrocaNome()
        Dim NovoNome As String = InputBox("Novo nome", "Novo nome", "Sou eu!")
        If NovoNome = String.Empty Then NovoNome = "[Sem nome]"
        MsgBox(CB.Text & " acabou de alterar o nome do form")
        Me.Text = NovoNome
    End Sub
 
    'o sub para sair da aplicação, endereço de um botão no menu de contexto
    Private Sub SairDaqui()
        Form1_FormClosed(Nothing, Nothing)
        End
    End Sub
 
    Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        'verificamos, quando o form vai fechar, se temos o aviso activo ou não
        If TSMI.Checked = True Then MsgBox("A aplicação vai agora fechar!")
    End Sub
 
End Class
É possível atribuír imagens de estado (checked ou unchecked) e imagens normais através do uso e associação de uma ImageList (não coberto neste artigo)

Criação no IDE

Para a maioria dos casos, um menu de contexto deve ser desenhado no IDE. Ao desenhar o menu de contexto no IDE, os blocos de código comuns e repetitivos são automáticamente gerados e todas as propriedades de cada item estão na caixa de propriedades do IDE e as ferramentas de desenho do menu estão curiosamente também elas disponíveis através de um menu de contexto. Eis os passos para a criação de um menu parecido com o que se desenhou programáticamente:

Passo 1 - Adicionar componente

Passo 2 - Adicionar items. Basta escrever.

Passo 3 - Adicionando items em níveis diferentes

Passo 4 - Alterar o tipo de item para separador

Passo 5 - Alterar o tipo de item para combobox

Passo 6 - Alterar o tipo de item para "checkbox"

Passo 7 - Defenir uma imagem para o item

Nota 1 - Verificar a imagem adicionada

Nota 2 - Todas as propriedades para cada um dos items

Nota 3 - Duplo clique gera o código para manuseamento do evento Click do item do menu

Ir mais além

Se as propriedades forem cuidadosamente estudadas, existe muito mais para além do exemplificado. É possível fazer virtualmente tudo o que se vê em aplicações .NET e ainda mais onde a sua imaginação o levar. Se os menus de contexto forem combinados com elementos como o NotifyIcon, produzem uma agradável utilização dos seus interfaces.

dev_net/vb.net/contextmenu.txt · Última modificação em: 2018/05/14 21:37 (edição externa)