La gestione dei menu in Visual Basic .NET è radicalmente diversa rispetto a quella delle versioni precedenti.
L'amato-odiato Editor di menu ha fatto il suo tempo: ora per inserire un menu in un'applicazione VB .NET si deve utilizzare l'oggetto MainMenu, disponibile nella casella degli strumenti standard.
Aggiungendo il controllo MainMenu in una form, comparirà un'area nella parte bassa della finestra in cui verrà inserita l'icona relativa.
Si tratta di una novità di VB .NET: i controlli non visibili in fase di esecuzione, ad esempio il Timer, non vengono più visualizzati nella form, ma in una zona separata, così da evitare appesantimenti inutili.
Dopo aver inserito il MainMenu, sotto la barra del titolo della form apparirà la barra dei menu, come si può vedere nell'immagine a lato. Ecco un'altro cambiamento rispetto alle versioni precedenti di Visual Basic: per definire i comandi dei menu ora basta scriverli all'interno del menu stesso in fase di progettazione. Ad esempio, proviamo a fare clic sulla comando Type Here (scrivi qui) nella barra dei menu e a scrivere File: questo è sufficiente per creare un menu di nome File.
Appariranno ora nuove voci nella barra dei menu, tutte contrassegnate da Type Here: al posto di ognuna di esse è possibile inserire un comando di menu. Come nelle versioni precedenti di Visual Basic, per inserire una barra di separazione nel menu basta creare una nuova voce e impostare la sua etichetta su - (segno meno); in alternativa, è anche possibile fare clic con il tasto destro del mouse all'interno del menu e selezionare Insert Separator (Inserisci separatore). Per spostare un comando da una posizione ad un'altra basta trascinare l'elemento del menu nella posizione desiderata.
facendo clic su un comando, nella finestra delle Proprietà compariranno le proprietà della voce di menu. Checked consente di visualizzare un segno di spunta a sinistra del nome del menu; RadioCheck, novità di VB .NET, deve essere impostato su true se si vuole che al posto del segno di spunta venga visualizzato un radio button (può essere usato, ad esempio, per indicare la scelta corrente in un insieme di opzioni). Shortcut consente di definire una scorciatoia da tastiera per il comando; è possibile decidere se visualizzare o meno tale combinazione di tasti agendo sulla proprietà ShowShortcut.
Per scrivere il codice da eseguire quando si seleziona un comando dal menu, fare doppio clic sul comando stesso: si aprirà l'editor del codice all'interno della routine che gestisce l'evento Click sulla voce di menu.
Altro evento importante è Select, che viene generato quando il puntatore del mouse di sposta su una voce del menu.
L'altro tipo di menu disponibile in VB .NET è il menu contestuale: nelle applicazioni per Windows esso viene visualizzato quando si fa clic con il tasto destro del mouse su di un controllo. Nelle precedenti versioni di Visual Basic, per mostrare questo tipo di menu era necessario aggiungerlo alla barra dei menu standard, quindi richiamarlo con il metodo PopupMenu ad esempio all'interno dell'evento MouseUp, in modo da intercettare la pressione del tasto destro del mouse. In VB .NET il metodo PopupMenu non esiste più: per associare un menu contestuale ad un controllo è necessario creare un oggetto di tipo ContextMenu. Anch'esso, al pari del MainMenu, una volta inserito nella form viene visualizzato nella parte bassa della finestra di progettazione; anche la fase di creazione delle voci di menu e di impostazioni delle proprietà è la medesima. Se in una form sono presenti sia un MainMenu sia uno o più ContextMenu, facendo clic sull'uno o sull'altro il corrispondente layout dei menu verrà visualizzato sotto la barra del titolo, anche se, in fase di esecuzione, la barra dei menu sarà quella impostata nel MainMenu.
Dopo aver creato un menu contestuale, è necessario associarlo ad uno o più controlli. Per fare questo si deve selezionare il controllo a cui si vuole collegare il menu e impostare la sua proprietà ContextMenu sul nome del menu contestuale interessato.
Fatto questo, ogni volta che si farà clic con il tasto destro del mouse sul controllo verrà visualizzato il menu contestuale; non è più necessario scrivere nemmeno una riga di codice per ottenere questo effetto.
L'evento Popup del ContextMenu viene generato prima della visualizzazione del menu contestuale. Può essere utilizzato, ad esempio, nel caso di un menu associato a più controlli, per adattare i comandi in base all'oggetto su cui è stato fatto il clic.
Supponiamo di avere un ContextMenu associato ai controlli Button1 e Button2 con un unico comando, MenuItem1.
Consideriamo il codice seguente:
Private Sub ContextMenu1_Popup(ByVal sender As Object, ByVal e As System.EventArgs) Handles ContextMenu1.Popup
If ContextMenu1.SourceControl Is Button1 Then
MenuItem1.Text = "Nascondi pulsante"
ElseIf ContextMenu1.SourceControl Is Button2 Then
MenuItem1.Text = "Esci dal programma"
End If
End Sub
Esso fa in modo che, premendo il pulsante destro del mouse su Button1, il comando del menu contestuale sia "Nascondi pulsante", mentre, facendo clic sul Button2, diventi "Esci dal programma".
Per fare questo si è usata la proprietà SourceControl dell'oggetto ContextMenu, che specifica il controllo su cui è stato eseguito il clic destro. Anche gli elementi del ContextMenu dispongono dell'evento Click che viene generato quando l'utente seleziona un comando di menu con il tasto sinistro del mouse.
Passiamo ora al controllo ToolTip, utilizzato per visualizzare un breve messaggio descrittivo quando si posiziona il mouse su un oggetto per alcuni istanti. Anch'esso è una novità di Visual Basic .NET: nelle precedenti versioni di VB, infatti, per assegnare un tooltip era sufficiente impostare la proprietà ToolTipText. In VB .NET, per definire un tooltip è necessario inserire prima nella form un oggetto di tipo ToolTip; anch'esso, come il MainMenu e il ContextMenu, si posiziona nella parte bassa della finestra di progettazione. Inserito il ToolTip, tra le proprietà dei controlli della form ne apparirà una nuova, Tooltip on <nome oggetto ToolTip>: il messaggio specificato in questa proprietà verrà utilizzato come tooltip.
La decisione di aggiungere un controllo a parte per visualizzare i tooltip è dovuta al fatto che, così facendo, è possibile impostarne alcune proprietà, come il ritardo di visualizzazione, che prima non erano disponibili. In particolare, InitialDelay consente di specificare l'intervallo di tempo, in millisecondi, che deve passare da quando il puntatore del mouse si sposta su un controllo alla visualizzazione del messaggio descrittivo; AutoPopDelay indica per quanti millisecondi deve essere visualizzato il tooltip. La proprietà AutomaticDelay ha lo stesso scopo di InitialDelay, con la differenza che sulla base del valore in essa specificato, verranno automaticamente impostate anche le proprietà AutoPopDelay, InitialDelay e ReshowDelay (quest'ultima proprietà specifica quanti millisecondi devono passare prima di visualizzare il nuovo tooltip quando il puntatore del mouse si sposta da un controllo ad un altro). Per maggiori informazioni su come vengono impostate tali proprietà sulla base di AutomaticDelay, si rimanda alla consultazione della Guida in linea.
Dopo aver esaminato i controlli MainMenu, ContextMenu e ToolTip, novità assoluta per i programmatori Visual Basic, nella prossima Lezione realizzeremo un piccolo programma in cui troveranno posto tutti e tre questi oggetti.