Gestori per intervalli della mappa messaggi
Questo articolo illustra come eseguire il mapping di un intervallo di messaggi a una singola funzione del gestore di messaggi , anziché eseguire il mapping di un messaggio a una sola funzione.
In alcuni casi è necessario elaborare più messaggi o controllare la notifica esattamente nello stesso modo. In questi casi, è possibile eseguire il mapping di tutti i messaggi a una singola funzione del gestore. Gli intervalli di mapping dei messaggi consentono di eseguire questa operazione per un intervallo contiguo di messaggi:
È possibile eseguire il mapping degli intervalli di ID comando a:
Funzione del gestore dei comandi.
Funzione del gestore di aggiornamento dei comandi.
È possibile eseguire il mapping dei messaggi di notifica di controllo per un intervallo di ID di controllo a una funzione del gestore di messaggi.
Gli argomenti trattati in questo articolo includono:
Scrittura della voce Message-Map
Nel. Aggiungere il file CPP, aggiungere la voce della mappa messaggi, come illustrato nell'esempio seguente:
ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, &OnDoSomething)
La voce message-map è costituita dagli elementi seguenti:
Macro dell'intervallo di mapping dei messaggi:
Parametri della macro:
Le prime due macro accettano tre parametri:
ID comando che avvia l'intervallo
ID comando che termina l'intervallo
Nome della funzione del gestore messaggi
L'intervallo di ID comando deve essere contiguo.
La terza macro,
ON_CONTROL_RANGE
, accetta un primo parametro aggiuntivo: un messaggio di notifica del controllo, ad esempio EN_CHANGE.
Dichiarazione della funzione del gestore
Aggiungere la dichiarazione della funzione del gestore in . File H. Il codice seguente mostra l'aspetto, come illustrato di seguito:
public:
afx_msg void OnDoSomething(UINT nID);
Le funzioni del gestore per i singoli comandi in genere non accettano parametri. Ad eccezione delle funzioni del gestore di aggiornamento, le funzioni del gestore per gli intervalli di mapping dei messaggi richiedono un parametro aggiuntivo, nID, di tipo UINT. Questo parametro è il primo parametro. Il parametro aggiuntivo supporta l'ID comando aggiuntivo necessario per specificare quale comando l'utente ha effettivamente scelto.
Per altre informazioni sui requisiti dei parametri per l'aggiornamento delle funzioni del gestore, vedere Esempio per un intervallo di ID comando.
Esempio per un intervallo di ID comando
Quando si usano intervalli Un esempio consiste nella gestione di comandi come il comando Zoom nell'esempio di MFC HIERSVR. Questo comando consente di ingrandire la visualizzazione, ridimensionandola tra il 25% e il 300% delle dimensioni normali. La classe di visualizzazione di HIERSVR usa un intervallo per gestire i comandi Zoom con una voce della mappa messaggi simile alla seguente:
ON_COMMAND_RANGE(ID_VIEW_ZOOM25, ID_VIEW_ZOOM300, &OnZoom)
Quando si scrive la voce message-map, specificare:
Due ID comando, che iniziano e terminano un intervallo contiguo.
Qui sono ID_VIEW_ZOOM25 e ID_VIEW_ZOOM300.
Nome della funzione del gestore per i comandi.
Ecco .
OnZoom
La dichiarazione di funzione sarà simile alla seguente:
public:
afx_msg void OnZoom(UINT nID);
Il caso delle funzioni del gestore di aggiornamento è simile e probabilmente risulta più utile. È piuttosto comune scrivere ON_UPDATE_COMMAND_UI
gestori per un certo numero di comandi e trovare se stessi scrivendo, o copiando, lo stesso codice oltre e oltre. La soluzione consiste nel eseguire il mapping di un intervallo di ID comando a una funzione del gestore di aggiornamento usando la ON_UPDATE_COMMAND_UI_RANGE
macro. Gli ID comando devono formare un intervallo contiguo. Per un esempio, vedere il gestore e la OnUpdateZoom
relativa ON_UPDATE_COMMAND_UI_RANGE
voce della mappa messaggi nella classe di visualizzazione dell'esempio HIERSVR.
Le funzioni del gestore di aggiornamento per i singoli comandi accettano in genere un singolo parametro, pCmdUI, di tipo CCmdUI*
. A differenza delle funzioni del gestore, le funzioni del gestore di aggiornamento per gli intervalli di mapping dei messaggi non richiedono un parametro aggiuntivo, nID, di tipo UINT. L'ID del comando, necessario per specificare il comando scelto dall'utente, si trova nell'oggetto CCmdUI
.
Esempio per un intervallo di ID di controllo
Un altro caso interessante è il mapping dei messaggi di notifica del controllo per un intervallo di ID di controllo a un singolo gestore. Si supponga che l'utente possa fare clic su uno qualsiasi dei 10 pulsanti. Per eseguire il mapping di tutti i 10 pulsanti a un gestore, la voce message-map sarà simile alla seguente:
ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnButtonClicked)
Quando si scrive la ON_CONTROL_RANGE
macro nella mappa messaggi, specificare:
Messaggio di notifica del controllo specifico.
Ecco BN_CLICKED.
Valori ID controllo associati all'intervallo contiguo di controlli.
Ecco questi IDC_BUTTON1 e IDC_BUTTON10.
Nome della funzione del gestore messaggi.
Ecco .
OnButtonClicked
Quando si scrive la funzione del gestore, specificare il parametro UINT aggiuntivo, come illustrato di seguito:
void CRangesView::OnButtonClicked(UINT nID)
{
int nButton = nID - IDC_BUTTON1;
ASSERT(nButton >= 0 && nButton < 10);
// ...
}
Il OnButtonClicked
gestore per un singolo messaggio BN_CLICKED non accetta parametri. Lo stesso gestore per un intervallo di pulsanti accetta un solo UINT. Il parametro aggiuntivo consente di identificare il particolare controllo responsabile della generazione del messaggio di BN_CLICKED .
Il codice illustrato nell'esempio è tipico: la conversione del valore passato a un int
oggetto all'interno dell'intervallo di messaggi e l'asserzione che si tratta del caso. È quindi possibile eseguire un'azione diversa a seconda del pulsante su cui è stato fatto clic.