L’area di notifica risiede sulla destra della barra principale nel desktop di Windows, dove di solito appaiono le icone di programmi che risiedono in memoria, ma anche l’ora e la lingua della tastiera.
Per personalizzare le icone visibili possiamo aprire le proprietà della barra e scegliere Area di notifica. In questo articolo vedremo come registrare un’icona in quell’area, si tratta di un compito abbastanza semplice, qui faremo un esempio pratico in C++.
Per inserire un’icona nell’area di notifica di Windows occorre utilizzare una funzione, Shell_NotifyIcon, che presenta come argomento una struttura, NOTIFYICONDATA. Passiamo subito a vedere le variabili che compongono questa struttura:
- cbSize – tipo: DWORD – La grandezza della struttura in bytes.
- hWnd – tipo: HWND – L’handle della finestra che riceve la notifica associata all’icona nell’area di notifica.
- uID – tipo: UINT – L’identificatore della risorsa, che in questo caso è la nostra icona.
- uCallbackMessage – tipo: UINT – Una funzione callback per gestire i messaggi di notifica dai movimenti del mouse alla tastiera ed altro, il messaggio risiede in LPARAM.
- hIcon – tipo: HICON – L’handle dell’icona da aggiungere, da Windows XP in poi può essere anche a 32 bit per pixel.
- szTip – tipo: TCHAR[64] – Stringa terminata dal carattere nullo di 64 caratteri per il testo del tooltip standard.
- dwState – tipo: DWORD – Lo stato dell’icona e può essere: NIS_HIDDEN per nasconderla o NIS_SHAREDICON per condividere la risorsa tra più icone.
- dwStateMask – tipo: DWORD – Determina quale valore è valido per lo stato dell’icona, ad esempio con NIS_HIDDEN si può modificare solo lo stato nascosto dell’icona.
- szInfo – tipo: TCHAR[256] – Il messaggio da visualizzare nel tooltip balloon.
- uVersion – tipo: UINT – Valore da assegnare per avere vari tipi di interfacce grafiche e comportamenti del tooltip, in particolare: zero per applicazioni precedenti a Windows 2000, NOTIFYICON_VERSION per Windows 2000 fino a Windows XP e NOTIFYICON_VERSION_4 per Windows Vista o superiori.
- szInfoTitle – tipo: TCHAR[64] – Stringa per il testo del tooltip balloon.
- uFlags – tipo: UINT – Valore che indica i membri validi della struttura ed in particolare: NIF_MESSAGE per il membro uCallbackMessage, NIF_ICON per hIcon, NIF_TIP per szTip, NIF_STATE per dwState e dwStateMask, NIF_INFO per i nuovi tooltip balloon, NIF_GUID per guidItem ( solo in Windows 7 ).
- dwInfoFlags – tipo DWORD
- guidItem – tipo: GUID
- hBalloonIcon – tipo HICON
Per informazioni complete sulla struttura potete leggere l’aiuto in linea di Microsoft per il Windows SDK ( in lingua Inglese). Vediamo un semplice esempio in C++ per mostrare un’icona nell’area di notifica, il codice va inserito dopo che l’applicazione è stata creata, quindi in MFC va inserita nella funzione InitInstance.
... NOTIFYICONDATA nid; ZeroMemory(&nid, sizeof(NOTIFYICONDATA)); nid.cbSize = NOTIFYICONDATA_V2_SIZE; nid.uFlags = NIF_TIP | NIF_ICON | NIF_MESSAGE; wcscpy_s(nid.szTip, _T("La mia notifica")); nid.hWnd = m_pMainWnd->m_hWnd; nid.uCallbackMessage = WM_MYNOTIFY; nid.hIcon = LoadIcon(MYICON); Shell_NotifyIcon(NIM_ADD, &nid); ZeroMemory(&nid, sizeof(NOTIFYICONDATA)); nid.cbSize = NOTIFYICONDATA_V2_SIZE; nid.hWnd = m_pMainWnd->m_hWnd; nid.uVersion = NOTIFYICON_VERSION; Shell_NotifyIcon(NIM_SETVERSION, &nid); ... Shell_NotifyIcon(NIM_DELETE, &nid); ...
Come potete notare occorre inserire la finestra a cui far arrivare le notifiche, il messaggio e l’icona, quindi inserire il tutto con NIM_ADD, NIM_SETVERSION serve per abilitare i nuovi tipi di tooltip, altro comando che si può dare è NIM_MODIFY per modificare i valori dei membri della struttura. Quando terminato occorre eliminare l’icona dall’area di notifica con NIM_DELETE.
Diamo ora uno sguardo al messaggio WM_MYNOTIFY da intercettare nel ciclo dei messaggi della finestra principale dell’applicazione:
... switch (lParam) { case WM_RBUTTONDOWN: // di solito si mostra il menu dei comandi break; case WM_LBUTTONDBLCLK: // di solito si compie il comando di default break; case NIN_BALLOONTIMEOUT: // operazione fatta ogni tot tempo break; case NIN_BALLOONSHOW: // quando appare il tooltip balloon break; case NIN_BALLOONHIDE: // quando scompare il tooltip balloon break; case NIN_BALLOONUSERCLICK: // quando l'utente fa clic sul tooltip balloon break; } ...
Come potete vedere non è molto complicato gestire le icone nell’area di notifica, se avete bisogno di altre informazioni non esitate a chiedere.