Il controllo NotifyIcon e le applicazioni senza interfaccia utente

Una delle funzionalità maggiormente richieste dai programmatori per Windows è quella di inserire un’icona della propria applicazione nella System tray, la parte della barra delle applicazioni vicino all’orologio. Fino alla versione 6 di Visual Basic era necessario ricorrere a controlli OCX di terze parti oppure utilizzare le API di Windows per raggiungere questo scopo. Con VB .NET finalmente Microsoft ha introdotto un controllo nativo per aggiungere un’icona alla System tray: il controllo NotifyIcon, forse uno dei più facili da utilizzare.

Le proprietà messe a disposizione da questo oggetto sono ridotte all’osso, ma d’altra parte sono le uniche di cui si ha bisogno. ContextMenu permette di associare un menu contestuale all’icona; anche per la NotifyIcon valgono tutte le considerazione fatte a proposito dei menu nella Menu e Tooltip in VB .NET.
Icon consente di definire l’icona da visualizzare nella System tray; è possibile utilizzare solo file di tipo ICO.
Text specifica il tooltip da visualizzare quando il puntatore del mouse si sofferma sull’icona per alcuni istanti.
Visible consente di visualizzare o nascondere l’icona. Gli eventi della NotifyIcon sono quelli relativi al mouse, quindi Click, DblClick, MouseDown, MouseMove e MouseUp.

Per utilizzare questo controllo non serve sapere altro, quindi vediamo subito un esempio pratico che metta in luce le sue peculiarità.
Vogliamo realizzare una piccola utilità che consenta di avviare in modo veloce i programmi Blocco note e Calcolatrice di Windows: per fare questo è naturale pensare ad un programma che risiede nella System tray, poiché in questo modo sarà sempre visibile.
Questa volta, però, l’applicazione non avrà un’interfaccia utente, ma sarà composta da un unico modulo di Visual Basic. Dopo aver creato la solita Windows Applications, quindi, selezionare con il tasto destro del mouse il file Form1.vb nel Solution Explorer e fare clic sul comando Delete (Elimina), rispondendo Sì alla domanda successiva. Ora fare clic sul nome del progetto (è visualizzato in grassetto e, se non diversamente specificato, ha la forma WindowsApplicationX, dove X è un numero progressivo), selezionate il comando Add (Aggiungi) e quindi Add New Item (Aggiungi nuovo elemento); nella finestra di dialogo che comparirà selezionare nella lista di destra Module (Modulo) e confermare con un clic sul pulsante Open (Apri). Si aprirà l’editor del codice all’interno del nuovo modulo:

Module Module1
End Module

E’ all’interno di questo modulo che scriveremo tutto il codice della nostra applicazione. La prima cosa da fare è dichiarare esplicitamente gli oggetti che utilizzeremo, poiché non abbiamo a disposizione un’interfaccia grafica, quindi non possiamo trascinare i controlli dalla casella degli strumenti. Nelle prime Lezioni abbiamo detto che nell’editor di VB .NET è visibile l’intero codice dell’applicazione, compreso quello che determina la posizione e le proprietà iniziali degli oggetti, a differenza delle versioni precedenti, in cui tali informazioni erano “nascoste” nell’intestazione dei file sorgente. Possiamo farci un’idea di come sono organizzate queste strutture visualizzando la regione Windows Form Designer generated code di una qualsiasi form realizzata con VB .NET. Dopo le funzioni New e Dispose, rispettivamente il costruttore e il distruttore della form, potremmo trovare qualcosa del tipo:

Friend WithEvents Button1 As System.Windows.Forms.Button
Friend WithEvents Button2 As System.Windows.Forms.Button

La parola chiave WithEvents specifica che l’oggetto dichiarato si riferisce all’istanza di una classe che può generare eventi. Nell’esempio sopra mostrato, Button1 e Button2sono di tipo Button, quindi possono generare gli eventi del mouse, della tastiera, ecc. Notiamo che, usando WithEvents, nella ComboBox che visualizza gli oggetti della form (in alto a sinistra nella finestra del codice) sono presenti sia Button1 sia Button2, quindi siamo in grado di selezionare un evento e scrivere il codice relativo. Se proviamo a rimuovere la parola chiave WithEvents dalla dichiarazione di Button1, quest’ultimo sparirà dalla ComboBox sopra citata, quindi non potremo più intercettare i suoi eventi. Se continuiamo a leggere la regione Windows Form Designer generated code, troviamo la Sub InitializeComponent, in cui vengono impostate tutte le proprietà iniziali degli oggetti.

Tornando al nostro programma, dobbiamo seguire i principi illustrati finora per creare gli oggetti che ci serviranno, in particolare una NotifyIcon e un ContextMenu; quest’ultimo, è composto da varie voci (nel nostro esempio saranno 4), ciascuna delle quali non è altro che un oggetto di tipo MenuItem. Il codice che dobbiamo scrivere all’interno del modulo è dunque il seguente:

Friend WithEvents nfiIcona As NotifyIcon
Friend WithEvents MenuContestuale As ContextMenu
Friend WithEvents mnuContBloccoNote As MenuItem
Friend WithEvents mnuContCalcolatrice As MenuItem
Friend WithEvents mnuContSep0 As MenuItem
Friend WithEvents mnuContEsci As MenuItem

La prima riga definisce la NotifyIcon, la seconda il menu contestuale, mentre le rimanenti i comandi del menu. Ora dobbiamo impostare le proprietà iniziali di questi controlli. Per fare questo scriveremo una Sub dedicata, chiamandola ad esempio Init. Cominciamo ad impostare le proprietà della NotifyIcon; dobbiamo innanzi tutto creare un’istanza dell’oggetto usando la parola chiave New, quindi assegnare un’icona e il tooltip:

Private Sub Init()
nfiIcona = New NotifyIcon()
nfiIcona.Icon = New Icon(“C:ProgrammiMicrosoft Visual Studio .NETCommon7GraphicsiconsComputerkey04.ico”)
nfiIcona.Text = “Avvio applicazioni”
End Sub

Per assegnare l’icona abbiamo creato un nuovo oggetto di tipo Icon, utilizzando una delle icona fornite con Visual Studio .NET; al suo posto è possibile utilizzare un qualsiasi file in formato ICO.
A questo punto possiamo già provare ad eseguire il programma. Prima però dobbiamo definire il punto di ingresso dell’applicazione, cioè la routine che verrà eseguita nel momento in cui si lancia il progetto. Per fare questo, fare clic con il tasto destro del mouse sul nome del progetto all’interno del Solution Explorer, quindi selezionare il comandoProperties (Proprietà); nella finestra Properties Pages (Pagine delle proprietà di ) cercare la ComboBox con etichetta Startup Object (Oggetto di avvio) e impostarla su Sub Main. Ora non ci resta che scrivere questa Sub Main:

Sub Main()
Init()
nfiIcona.Visible = true
Application.Run()
End Sub

Dopo aver richiamato la routine Init, si visualizza l’icona nella System tray. L’istruzione Application.Run(), come dice la Guida in linea, fa in modo che l’applicazione entri in un ciclo in cui resta in attesa di messaggi; in pratica, con essa si indica che il programma deve rimanere in esecuzione finché non si richiama il metodo Application.Exit().

Avvio applicazione

Avviamo il progetto con il tasto F5: l’icona del programma verrà visualizzata nella barra delle applicazioni, a fianco dell’orologio; spostando il mouse su di essa per alcuni istanti comparirà il tooltip che abbiamo impostato, ovvero “Avvio applicazioni”. Ora che abbiamo verificato il corretto funzionamento del nostro progetto, interrompiamolo con un clic sul pulsante figura (Stop Debugging) e aggiungiamo il menu contestuale. Come prima useremo la Sub Init per impostare le proprietà dei vari comandi:

MenuContestuale = New ContextMenu()
mnuContBloccoNote = New MenuItem()
mnuContCalcolatrice = New MenuItem()
mnuContSep0 = New MenuItem()
mnuContEsci = New MenuItem()
mnuContBloccoNote.Text = “Avvia &Blocco note”
mnuContCalcolatrice.Text = “Avvia &Calcolatrice”
mnuContSep0.Text = “-”
mnuContEsci.Text = “&Esci”
MenuContestuale.MenuItems.AddRange(New MenuItem() {mnuContBloccoNote, mnuContCalcolatrice, mnuContSep0, mnuContEsci})

Le prime istruzioni dovrebbero essere ormai chiare. L’ultima inserisce i vari MenuItem all’interno del menu. Ora dobbiamo associare il menu contestuale appena creato alla NotifyIcon; questo si ottiene facilmente con l’istruzione:

nfiIcona.ContextMenu = MenuContestuale

Eseguendo il programma a questo punto, se si fa clic con il tasto destro del mouse sull’icona nella barra delle applicazioni comparirà il menu contestuale. L’ultima cosa che ci resta da fare è scrivere il codice da eseguire in risposta ai vari clic sui comandi del menu. Ricordando le considerazioni fatte nella Lezione 14 (Menu e Tooltip in VB .NET), si ottiene:

Public Sub mnuMenuContestuale(ByVal sender As Object, ByVal e As System.EventArgs) Handles mnuContBloccoNote.Click, mnuContCalcolatrice.Click, mnuContEsci.Click
Select Case CType(sender, MenuItem).Text
Case “Avvia &Blocco note”
Shell(“Notepad.exe”, AppWinStyle.NormalFocus)
Case “Avvia &Calcolatrice”
Shell(“Calc.exe”, AppWinStyle.NormalFocus)
Case “&Esci”
nfiIcona.Visible = False
Application.Exit()
End Select
End Sub

Per avviare un programma esterno si è usata l’istruzione Shell; per la sua sintassi si rimanda alla consultazione della Guida in linea. Se l’utente seleziona il comando Esci, si nasconde l’icona nel System tray e si richiama il metodo Application.Exit, che come detto in precedenza termina l’applicazione. Il progetto completo è disponibile per il download facendo clic qui.

Con questa Lezione termina la nostra analisi dei controlli di Visual Basic .NET. In realtà sarebbero ancora molte le cose da analizzare, primi tra tutti i controlli standard come laListView e la ToolBar, ma quanto esposto finora è più che sufficiente per permettere a chiunque sia interessato di approfondire autonomamente lo studio di questo linguaggio di programmazione. Nelle rimanenti Lezioni del corso di concentreremo sulla realizzazione di un altro tipo di progetto con VB .NET: la Class Library.

Both comments and pings are currently closed.

Comments are closed.