Gestionnaires pour les chaînes de table des messages
Cet article explique comment mapper une plage des messages à une fonction gestionnaire de messages unique (au lieu du message de mappage un à une seule fonction).
Il arrive que vous devez gérer plusieurs notification de message ou de contrôle de la même façon.À de telles fois, vous pouvez mapper tous les messages à une fonction gestionnaire unique.Les chaînes de la table des messages et vous permettent d'effectuer cette opération pour une plage contiguë des messages :
Vous pouvez mapper des plages des ID de commandes :
Une fonction du gestionnaire de commandes.
Une fonction du gestionnaire de mise à jour de commande.
Vous pouvez mapper les messages de contrôle-notification pour une plage des ID de contrôle à une fonction gestionnaire de messages.
Les rubriques abordées dans cet article incluent :
Écrire l'entrée de la table des messages
Déclarer la fonction gestionnaire
Exemple pour une plage des ID de commandes
Exemple pour une plage des ID de contrôle
Écrire l'entrée de la table des messages
Dans le fichier .cpp, ajoutez votre entrée de la table des messages, comme indiqué dans l'exemple suivant :
ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, &OnDoSomething)
L'entrée de la table des messages inclut les éléments suivants :
Macro de la plage de table des messages :
Paramètres à la macro :
Les deux premières macros prennent trois paramètres :
L'ID de commande qui démarre la plage
l'ID de commande qui termine la plage
Le nom de la fonction gestionnaire de messages
La plage des ID de commandes doit être contiguë.
La troisième macro, ON_CONTROL_RANGE, prend un premier paramètre supplémentaire : un message de contrôle-notification, tel qu' EN_CHANGE.
Déclarer la fonction gestionnaire
Ajoutez votre déclaration de fonction gestionnaire dans. fichier de H.Le code suivant montre comment cela peut ressembler, comme indiqué ci-dessous :
public:
afx_msg void OnDoSomething(UINT nID);
Les fonctions gestionnaires pour les commandes unique ne prennent normalement pas de paramètre.À l'exception de les fonctions de gestionnaire de mise à jour, les fonctions gestionnaires pour des plages de table des messages requièrent un paramètre supplémentaire, nID, de type UINT.Ce paramètre est le premier paramètre.Le paramètre supplémentaire s'adapte à l'ID de commande supplémentaire nécessaire pour spécifier que la commande l'utilisateur a choisi réellement.
Pour plus d'informations sur les spécifications de paramètres pour mettre à jour des fonctions gestionnaires, consultez l' Exemple pour une plage des ID de commandes.
Exemple pour une plage des ID de commandes
Lorsque pourriez-vous utiliser des plages ?Un exemple est dans la gestion des commandes comme la commande de zoom dans l'exemple HIERSVRMFC.Cette commande effectue un zoom la vue, la mise à l'échelle entre 25% et 300% de sa taille normale.La classe d'affichage de HIERSVR utilise une plage pour gérer les commandes de zoom avec une entrée de la table des messages qui ressemble à ceci :
ON_COMMAND_RANGE(ID_VIEW_ZOOM25, ID_VIEW_ZOOM300, &OnZoom)
Lorsque vous écrivez l'entrée de la table des messages, spécifiez :
Deux identificateurs, démarre et fins de commande une plage contiguë.
Ici ils sont ID_VIEW_ZOOM25 et ID_VIEW_ZOOM300.
Le nom de la fonction gestionnaire pour les commandes.
Ici c'est OnZoom.
La déclaration de fonction se présente comme suit :
public:
afx_msg void OnZoom(UINT nID);
Le cas de fonctions de gestionnaire de mise à jour est probablement semblable, et d'être plus largement utile.Il est fréquent d'écrire des gestionnaires d' ON_UPDATE_COMMAND_UI pour plusieurs commandes et de se trouver écriture, ou copiant, le même code à plusieurs reprises.La solution consiste à mapper une plage des ID de commandes à une fonction du gestionnaire de mise à jour à l'aide de la macro d' ON_UPDATE_COMMAND_UI_RANGE .Les ID de commande doivent former une plage contiguë.Pour obtenir un exemple, consultez le gestionnaire d' OnUpdateZoom et la son entrée de la table des messages d' ON_UPDATE_COMMAND_UI_RANGE dans la classe d'affichage de l'exemple HIERSVR.
Les fonctions de gestionnaire de mise à jour pour les commandes unique prennent normalement un paramètre unique, pCmdUI, de type CCmdUI*.Contrairement aux fonctions gestionnaires, les fonctions du gestionnaire de mise à jour pour des plages de table des messages ne requièrent pas de paramètre supplémentaire, nID, de type UINT.L'ID de commande, qui est nécessaire pour spécifier que la commande l'utilisateur a choisi réellement, est trouvé dans l'objet d' CCmdUI .
Exemple pour une plage des ID de contrôle
Un autre cas intéressant mappe les messages de contrôle-notification pour une plage des ID de contrôle à un gestionnaire unique.Supposons que l'utilisateur peut cliquer sur un de 10 boutons.Pour mapper les 10 boutons à un gestionnaire, votre entrée de la table des messages ressemblerait à ceci :
ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnButtonClicked)
Lorsque vous écrivez le d' ON_CONTROL_RANGE dans votre table des messages, spécifiez :
Un message particulier de contrôle-notification.
Ici c'est BN_CLICKED.
Les valeurs de l'ID du contrôle associé à la plage contiguë des contrôles.
Ici ce sont IDC_BUTTON1 et IDC_BUTTON10.
Le nom de la fonction gestionnaire de messages.
Ici c'est OnButtonClicked.
Lorsque vous écrivez la fonction gestionnaire, spécifiez le paramètre supplémentaire d' UINT , comme indiqué dans les éléments suivants :
void CRangesView::OnButtonClicked( UINT nID )
{
int nButton = nID - IDC_BUTTON1;
ASSERT( nButton >= 0 && nButton < 10 );
// ...
}
Le gestionnaire d' OnButtonClicked d'un message unique de BN_CLICKED ne prend pas de paramètres.Le même gestionnaire pour une plage des boutons prend un UINT.Le paramètre supplémentaire permet d'identifier le contrôle particulier chargé de générer le message de BN_CLICKED .
Le code illustré dans l'exemple est typique : convertissant la valeur est passé à int dans la plage de message et déclarer ce cela est le cas.Vous pouvez ensuite effectuer une opération différente selon laquelle le bouton concerné.