Gestione delle notifiche di personalizzazione
Un controllo della barra degli strumenti di Windows possiede funzionalità di personalizzazione incorporate, inclusa una finestra di dialogo di personalizzazione definita dal sistema, che consentono all'utente di inserire, eliminare, o riordinare i pulsanti della barra degli strumenti. L'applicazione determina se le funzionalità di personalizzazione sono disponibili all'utente e controlla l'ambito in cui l'utente può personalizzare la barra degli strumenti.
È possibile rendere disponibili all'utente le funzionalità di personalizzazione fornendo alla barra degli strumenti lo stile CCS_ADJUSTABLE. Le funzionalità di personalizzazione consentono all'utente di trascinare un pulsante in una nuova posizione o rimuovere un pulsante trascinandolo dalla barra degli strumenti. Inoltre, l'utente può fare doppio clic sulla barra degli strumenti per visualizzare la finestra di dialogo Personalizza barra degli strumenti, che consente all'utente di aggiungere, eliminare e riordinare i pulsanti della barra degli strumenti. L'applicazione può visualizzare la finestra di dialogo utilizzando la funzione membro Personalizza.
La barra degli strumenti invia i messaggi di notifica alla finestra padre ad ogni passaggio nel processo di personalizzazione. Se l'utente tiene premuto il tasto MAIUSC e inizia a trascinare un pulsante, la barra degli strumenti gestisce automaticamente l'operazione di trascinamento. La barra degli strumenti invia il messaggio di notifica TBN_QUERYDELETE alla finestra padre per determinare se il pulsante venga eliminato. L'operazione di trascinamento termina se la finestra padre restituisce FALSE. In caso contrario, la barra degli strumenti acquisisce l'input del mouse e attende che l'utente rilasci il pulsante del mouse.
Quando l'utente rilascia il pulsante del mouse, la barra degli strumenti determina la posizione del cursore del mouse. Se il cursore si trova fuori della barra degli strumenti, il pulsante viene eliminato. Se il cursore si trova in un altro pulsante della barra degli strumenti, la barra degli strumenti invia il messaggio di notifica di TBN_QUERYINSERT alla finestra padre per determinare se un pulsante può essere inserito a sinistra del pulsante specificato. Il pulsante viene inserito se la finestra padre restituisce TRUE; in caso contrario, non lo è. La barra degli strumenti invia il messaggio di notifica TBN_TOOLBARCHANGE per segnalare la fine dell'operazione di trascinamento.
Se l'utente inizia un'operazione di trascinamento senza tenere premuto MAIUSC, la barra degli strumenti invia il messaggio di notifica TBN_BEGINDRAG alla finestra proprietaria. Un'applicazione che implementa il proprio codice di trascinamento di pulsante può utilizzare questo messaggio come segnale per l'inizio di un'operazione di trascinamento. La barra degli strumenti invia il messaggio di notifica TBN_ENDDRAG per segnalare la fine dell'operazione di trascinamento.
Un controllo toolbar invia i messaggi di notifica quando l'utente personalizza la barra degli strumenti mediante la finestra di dialogo Personalizza barra degli strumenti. La barra degli strumenti invia il messaggio di notifica TBN_BEGINADJUST dopo che l'utente fa doppio clic sulla barra degli strumenti, ma prima che la finestra di dialogo venga creata. Successivamente, la barra degli strumenti inizia ad inviare una serie di messaggi di notifica TBN_QUERYINSERT per determinare se la barra degli strumenti consenta l'inserimento dei pulsanti. Quando la finestra padre restituisce TRUE, la barra degli strumenti smette di inviare i messaggi di notifica di TBN_QUERYINSERT. Se la finestra padre non restituisce TRUE per qualsiasi pulsante, la barra degli strumenti elimina la finestra di dialogo.
Successivamente, il controllo toolbar determina se i pulsanti possano essere eliminati dalla barra degli strumenti inviando un messaggio di notifica di TBN_QUERYDELETE per ciascun pulsante sulla barra degli strumenti. La finestra padre restituisce TRUE per indicare che un pulsante può essere eliminato; in caso contrario, restituisce FALSE. La barra degli strumenti aggiunge tutti i pulsanti della barra degli strumenti nella finestra di dialogo, ma ingrigisce quelle che non possono essere eliminati.
Ogni volta che la barra degli strumenti necessita di informazioni su un pulsante nella finestra di dialogo della barra degli strumenti di personalizzare, invia il messaggio di notifica TBN_GETBUTTONINFO, specificando l'indice del pulsante per il quale sono necessarie informazioni e l'indirizzo di una struttura di TBNOTIFY. La finestra padre deve occupare l'intera struttura con informazioni valide.
La finestra di dialogo Personalizza barra degli strumenti include un pulsante ? e un pulsante reimposta. Quando l'utente sceglie il pulsante ?, la barra degli strumenti invia il messaggio di notifica TBN_CUSTHELP. La finestra padre deve rispondere visualizzando le informazioni della guida. La finestra di dialogo invia il messaggio di notifica TBN_RESET quando l'utente seleziona il pulsante reimposta. Questo messaggio segnala che la barra degli strumenti sta per reinizializzare la finestra di dialogo.
Questi messaggi sono tutti i messaggi WM_NOTIFY e possono essere gestiti nella finestra proprietaria aggiungendo voci nella mappa messaggi nel formato seguente alla mappa messaggi della finestra proprietaria:
ON_NOTIFY( wNotifyCode, idControl, memberFxn )
wNotifyCode
Codice d'identificazione del messaggio di notifica, come TBN_BEGINADJUST.idControl
L'identificatore del controllo che invia la notifica.memberFxn
La funzione membro da chiamare quando questa notifica viene ricevuta.
La funzione membro sarebbe dichiarata con il prototipo seguente:
afx_msg void memberFxn( NMHDR * pNotifyStruct, LRESULT * result );
Se il gestore di messaggio di notifica restituisce un valore, è necessario inserirlo in LRESULT puntato in base al risultato.
Per ogni messaggio, pNotifyStruct punta ad una struttura NMHDR o ad una struttura TBNOTIFY. Di seguito vendono descritte le possibili strutture:
La struttura NMHDR contiene i seguenti membri:
typedef struct tagNMHDR {
HWND hwndFrom; // handle of control sending message
UINT idFrom;// identifier of control sending message
UINT code; // notification code; see below
} NMHDR;
hwndFrom
Gestore della finestra di controllo che sta inviando la notifica. Per convertire questo gestore in un puntatore CWnd, utilizzare CWnd::FromHandle.idFrom
Identificatore del controllo che invia la notifica.codice
Codice di notifica. Questo membro può essere un valore specifico per un tipo di controllo, come TBN_BEGINADJUST o TTN_NEEDTEXT, oppure può essere uno dei valori comuni di notifica elencati di seguito:NM_CLICK L'utente ha fatto clic sul pulsante sinistro del mouse all'interno del controllo.
NM_DBLCLK L'utente ha fatto doppio clic sul pulsante sinistro del mouse all'interno del controllo.
NM_KILLFOCUS Il controllo perde lo stato attivo per l'input.
NM_OUTOFMEMORY Il controllo non può completare un'operazione poiché la memoria disponibile non è sufficiente.
NM_RCLICK L'utente ha fatto clic sul pulsante destro del mouse all'interno del controllo.
NM_RDBLCLK L'utente ha fatto doppio clic sul pulsante destro del mouse all'interno del controllo.
NM_RETURN Il controllo ha lo stato attivo per l'input e l'utente ha premuto il tasto INVIO.
NM_SETFOCUS Il controllo ha ricevuto lo stato attivo per l'input.
La struttura TBNOTIFY contiene i seguenti membri:
typedef struct {
NMHDR hdr; // information common to all WM_NOTIFY messages
int iItem; // index of button associated with notification
TBBUTTON tbButton; // info about button associated withnotification
int cchText; // count of characters in button text
LPSTR lpszText;// address of button text
} TBNOTIFY, FAR* LPTBNOTIFY;
Note
hdr
Informazione comune a tutti i messaggi WM_NOTIFY.iItem
Indice del pulsante associato alla notifica.tbButton
La struttura TBBUTTON che contiene informazioni sul pulsante della barra degli strumenti associato alla notifica.cchText
Numero di caratteri nel testo del pulsante.lpszText
Puntatore al testo del pulsante.
Le notifiche che la barra degli strumenti invia sono le seguenti:
TBN_BEGINADJUST Inviato quando l'utente inizia la personalizzazione di una barra degli strumenti. Il puntatore punta ad una struttura NMHDR che contiene informazioni sulle notifiche. Il gestore non deve restituire un valore specifico.
TBN_BEGINDRAG Inviato quando l'utente inizia il trascinamento di un pulsante in una barra degli strumenti. Il puntatore punta ad una struttura TBNOTIFY. Il membro iItem contiene l'indice in base zero del pulsante trascinato. Il gestore non deve restituire un valore specifico.
TBN_CUSTHELP Inviato quando l'utente sceglie il pulsante ? nella finestra di dialogo Personalizza Barra degli Strumenti. Nessun valore restituito. Il puntatore punta ad una struttura NMHDR che contiene informazioni sui messaggi di notifica. Il gestore non deve restituire un valore specifico.
TBN_ENDADJUST Inviato quando l'utente smette di personalizzare una barra degli strumenti. Il puntatore punta ad una struttura NMHDR che contiene informazioni sui messaggi di notifica. Il gestore non deve restituire un valore specifico.
TBN_ENDDRAG Inviato quando l'utente smette di trascinare un pulsante in una barra degli strumenti. Il puntatore punta ad una struttura TBNOTIFY. Il membro iItem contiene l'indice in base zero del pulsante trascinato. Il gestore non deve restituire un valore specifico.
TBN_GETBUTTONINFO Inviato quando l'utente sta personalizzando una barra degli strumenti. La barra degli strumenti utilizza questo messaggio di notifica per recuperare le informazioni necessarie dalla finestra di dialogo di Personalizza Barra degli Strumenti. Il puntatore punta ad una struttura TBNOTIFY. Il membro iItem specifica l'indice in base zero di un pulsante. I membri cchText e pszText specificano l'indirizzo e la lunghezza, i caratteri, il testo del pulsante corrente. Un'applicazione deve occupare la struttura di informazioni sul pulsante. Restituisce TRUE se le informazioni sul pulsante vengano copiate nella struttura, o FALSE in caso contrario.
TBN_QUERYDELETE Inviato mentre l'utente sta personalizzando una barra degli strumenti per determinare se un pulsante può essere eliminato da una barra degli strumenti. Il puntatore punta ad una struttura TBNOTIFY. Il membro iItem contiene l'indice in base zero del pulsante da eliminare. Restituisce TRUE per consentire al pulsante di essere eliminato o FALSE per impedire al pulsante di essere eliminato.
TBN_QUERYINSERT Inviato mentre l'utente sta personalizzando un controllo toolbar per determinare se un pulsante può essere inserito a sinistra del pulsante specificato. Il puntatore punta ad una struttura TBNOTIFY. Il membro iItem contiene l'indice in base zero del pulsante da inserire. Restituisce TRUE per consentire ad un pulsante di essere inserito prima del pulsante specificato o FALSE per impedire che il pulsante venga inserito.
TBN_RESET Inviato quando l'utente ripristina il contenuto della finestra di dialogo Personalizza Barra degli Strumenti. Il puntatore punta ad una struttura NMHDR che contiene informazioni sui messaggi di notifica. Il gestore non deve restituire un valore specifico.
TBN_TOOLBARCHANGE Inviato dopo che l'utente abbia personalizzato una barra degli strumenti. Il puntatore punta ad una struttura NMHDR che contiene informazioni sui messaggi di notifica. Il gestore non deve restituire un valore specifico.