Partager via


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_RANGEprend 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é.

Voir aussi

Déclaration des fonctions de gestionnaire de messages