Tabela de Conteúdos
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.
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.
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
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.