Gestionnaires pour les plages de table des messages
Cet article explique comment mapper une plage de messages à une fonction de gestionnaire de messages unique (au lieu de mapper un seul message à une seule fonction).
Il existe des moments où vous devez traiter plusieurs messages ou notifications de contrôle de la même façon. À ce stade, vous souhaiterez peut-être mapper tous les messages à une fonction de gestionnaire unique. Les plages de mappage de messages vous permettent d’effectuer cette opération pour une plage de messages contiguë :
Vous pouvez mapper des plages d’ID de commandes à :
Fonction de gestionnaire de commandes.
Fonction de gestionnaire de mise à jour de commande.
Vous pouvez mapper des messages de notification de contrôle pour une plage d’ID de contrôle à une fonction de gestionnaire de messages.
Les sujets traités dans cet article sont les suivants :
Écriture de l’entrée de mappage de messages
Dans le . Fichier CPP, ajoutez votre entrée de carte de messages, comme illustré dans l’exemple suivant :
ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, &OnDoSomething)
L’entrée de carte de messages se compose des éléments suivants :
Macro de plage de mappage de messages :
Paramètres de la macro :
Les deux premières macros prennent trois paramètres :
ID de commande qui démarre la plage
ID de commande qui termine la plage
Nom de la fonction de gestionnaire de messages
La plage d’ID de commandes doit être contiguë.
La troisième macro,
ON_CONTROL_RANGE
prend un premier paramètre supplémentaire : un message de notification de contrôle, tel que EN_CHANGE.
Déclaration de la fonction gestionnaire
Ajoutez votre déclaration de fonction de gestionnaire dans le . Fichier H. Le code suivant montre comment cela peut ressembler, comme indiqué ci-dessous :
public:
afx_msg void OnDoSomething(UINT nID);
Les fonctions de gestionnaire pour les commandes uniques ne prennent normalement aucun paramètre. À l’exception des fonctions de gestionnaire de mise à jour, les fonctions de gestionnaire pour les plages de mappage de messages nécessitent un paramètre supplémentaire, nID, de type UINT. Ce paramètre est le premier paramètre. Le paramètre supplémentaire accepte l’ID de commande supplémentaire nécessaire pour spécifier la commande que l’utilisateur a réellement choisie.
Pour plus d’informations sur la configuration requise pour la mise à jour des fonctions de gestionnaire, consultez Exemple pour obtenir une plage d’ID de commandes.
Exemple pour une plage d’ID de commandes
Quand vous pouvez utiliser des plages Un exemple consiste à gérer des commandes comme la commande Zoom dans l’exemple HIERSVR de L’exemple MFC. Cette commande zoome sur la vue, la mettant à l’échelle entre 25 % et 300 % de sa taille normale. La classe d’affichage de HIERSVR utilise une plage pour gérer les commandes Zoom avec une entrée de carte de message semblable à ceci :
ON_COMMAND_RANGE(ID_VIEW_ZOOM25, ID_VIEW_ZOOM300, &OnZoom)
Lorsque vous écrivez l’entrée de carte de messages, vous spécifiez :
Deux ID de commande, début et fin d’une plage contiguë.
Ici, ils sont ID_VIEW_ZOOM25 et ID_VIEW_ZOOM300.
Nom de la fonction de gestionnaire pour les commandes.
Ici, c’est
OnZoom
.
La déclaration de fonction ressemble à ceci :
public:
afx_msg void OnZoom(UINT nID);
Le cas des fonctions de gestionnaire de mises à jour est similaire et peut être plus utile. Il est très courant d’écrire ON_UPDATE_COMMAND_UI
des gestionnaires pour un certain nombre de commandes et de vous retrouver à écrire, ou copier, le même code. La solution consiste à mapper une plage d’ID de commandes à une fonction de gestionnaire de mise à jour à l’aide de la ON_UPDATE_COMMAND_UI_RANGE
macro. Les ID de commande doivent former une plage contiguë. Pour obtenir un exemple, consultez le OnUpdateZoom
gestionnaire et son ON_UPDATE_COMMAND_UI_RANGE
entrée de carte de messages dans la classe d’affichage de l’exemple HIERSVR.
Les fonctions de gestionnaire de mise à jour pour les commandes uniques prennent normalement un paramètre unique, pCmdUI, de type CCmdUI*
. Contrairement aux fonctions de gestionnaire, les fonctions de gestionnaire de mise à jour pour les plages de mappage de messages ne nécessitent pas de paramètre supplémentaire, nID, de type UINT. L’ID de commande, qui est nécessaire pour spécifier la commande que l’utilisateur a réellement choisie, se trouve dans l’objet CCmdUI
.
Exemple pour une plage d’ID de contrôle
Un autre cas intéressant est le mappage des messages de notification de contrôle pour une plage d’ID de contrôle à un seul gestionnaire. Supposons que l’utilisateur puisse cliquer sur l’un des 10 boutons. Pour mapper tous les 10 boutons à un seul gestionnaire, votre entrée de carte de messages ressemble à ceci :
ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnButtonClicked)
Lorsque vous écrivez la ON_CONTROL_RANGE
macro dans votre carte de messages, vous spécifiez :
Message de notification de contrôle particulier.
C’est BN_CLICKED.
Valeurs d’ID de contrôle associées à la plage contiguë de contrôles.
Voici IDC_BUTTON1 et IDC_BUTTON10.
Nom de la fonction de gestionnaire de messages.
Ici, c’est
OnButtonClicked
.
Lorsque vous écrivez la fonction de gestionnaire, spécifiez le paramètre UINT supplémentaire, comme indiqué dans les éléments suivants :
void CRangesView::OnButtonClicked(UINT nID)
{
int nButton = nID - IDC_BUTTON1;
ASSERT(nButton >= 0 && nButton < 10);
// ...
}
Le OnButtonClicked
gestionnaire d’un message BN_CLICKED unique ne prend aucun paramètre. Le même gestionnaire pour une plage de boutons prend un UINT. Le paramètre supplémentaire permet d’identifier le contrôle particulier responsable de la génération du message BN_CLICKED .
Le code présenté dans l’exemple est typique : la conversion de la valeur passée dans une int
plage de messages et l’affirmation qu’il s’agit du cas. Vous pouvez ensuite effectuer une action différente en fonction du bouton sur lequel vous avez cliqué.