Gestionnaires pour les chaînes de table des messages
Cet article explique comment mapper une plage des messages à une seule fonction gestionnaire des messages (au lieu du message d'un mappage à une seule fonction).
Il arrive que vous devez traiter plusieurs notifications de message ou le contrôle de la même manière. Dans de tels cas, vous pouvez mapper tous les messages d'une seule fonction gestionnaire. Les chaînes de table des messages vous permettent de procéder pour une plage contigue des messages :
Vous pouvez mapper les plages des ID de commande :
Une fonction de responsable de commandes.
Une fonction du conseiller de mise à jour de commande.
Vous pouvez mapper les messages de notification contrôle pour une plage des ID de contrôle dans une fonction gestionnaire des messages.
Les rubriques traitées dans cet article sont les suivantes :
Écriture de l'entrée de la table des messages
États la fonction gestionnaire
Exemple d'une plage d'ID de commande
Exemple d'une plage d'ID de contrôle.
Écriture de l'entrée du mappage des messages
Dans le fichier .cpp, ajoutez l'entrée de la table des messages, comme le montre l'exemple suivant :
ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, &OnDoSomething)
L'entrée de la table des messages incluent les éléments suivants :
La macro de la plage de table des messages :
Paramètres de la macro :
Les deux premières macros prennent trois paramètres :
ID de commande qui engage la plage
ID de commande qui termine la plage
Le nom de la fonction gestionnaire des messages
La plage des ID de commande doit être contigue.
La troisième macro, ON_CONTROL_RANGE, accepte un premier paramètre supplémentaire : un message de notification contrôle, tel que EN_CHANGE.
Déclare la fonction gestionnaire
Ajoutez votre déclaration de fonction gestionnaire de rôles dans. Fichier de H. Le code suivant montre comment il peut le consulter, comme indiqué ci-dessous :
public:
afx_msg void OnDoSomething(UINT nID);
Les fonctions de gestion pour chaques commandes ne prennent pas de paramètres en général. À l'exception de les fonctions du gestionnaire de mise à jour, les fonctions et pour les 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 requis pour spécifier quelle commande l'utilisateur a réellement choisi.
Pour plus d'informations sur les spécifications de paramètre pour mettre à jour les fonctions et, consultez Exemple d'une plage d'ID de commande.
Exemple d'une portée d'ID de commande
Quand pourrez-vous utiliser ces plages ? Un exemple est dans commandes de gestion tels que l'ordre de zoom dans l'exemple HIERSVRde MFC. Cette commande zoome la vue, la mise à l'échelle est comprise 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 ressemblant à ceci :
ON_COMMAND_RANGE(ID_VIEW_ZOOM25, ID_VIEW_ZOOM300, &OnZoom)
Lorsque vous entrez l'entrée du mappage des messages, spécifiez :
Deux ID de commande, débute et fin de commande d'une plage contigue.
Ici ils sont ID_VIEW_ZOOM25 et ID_VIEW_ZOOM300.
Le nom de la fonction gestionnaire pour la commande.
Ici il s'agit OnZoom.
La déclaration de fonction ressemblerait à ceci :
public:
afx_msg void OnZoom(UINT nID);
Le cas de la mise à jour des fonctions de gestions est similaire, et supposé être bien plus utile. Il est assez fréquent d'écrire des gestionnaires de ON_UPDATE_COMMAND_UI pour plusieurs commandes et de recherche en écriture, ou en copiant le même code de façon répétée. La solution consiste à mapper une plage d'ID d'ordre à une fonction du conseiller de mise à jour à l'aide de la macro de ON_UPDATE_COMMAND_UI_RANGE. Les ID de commande doivent constituer une plage contigue. Pour obtenir un exemple, consultez le gestionnaire de OnUpdateZoom et de son entrée de la table des messages de ON_UPDATE_COMMAND_UI_RANGE de la classe d'affichage de l'exemple de HIERSVR.
Les fonctionnalités du conseiller de mise à jour pour les commandes prennent généralement un seul paramètre, pCmdUI, de type CCmdUI*. Contrairement aux fonctions, et les fonctionnalités du conseiller de mise à jour pour les plages de table des messages ne requièrent pas un paramètre supplémentaire, nID, de type UINT. ID de commande, qui est nécessaire pour spécifier quelle commande l'utilisateur a choisi, se trouve dans l'objet de CCmdUI.
Exemple d'une plage d'ID de contrôle.
Un autre cas intéressant mappe les messages de notification de contrôle pour une plage des ID de contrôle à un seul gestionnaire. Supposons que l'utilisateur peut cliquer sur l'un des 10 boutons. Pour mapper chacun des 10 boutons à un responsable, votre entrée de la table des messages ressemblerait à ceci :
ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnButtonClicked)
Lorsque vous entrez la macro de ON_CONTROL_RANGE dans la table des messages, spécifiez :
Un message particulier de contrôle de notification.
Ici il s'agit BN_CLICKED.
Les valeurs d'ID du contrôle associées à la plage contigue des contrôles.
Ici ce sont IDC_BUTTON1 et IDC_BUTTON10.
Le nom de la fonction gestionnaire des messages.
Ici il s'agit OnButtonClicked.
Lorsque vous entrez la fonction gestionnaire, spécifiez le paramètre supplémentaire de UINT, comme suit :
void CRangesView::OnButtonClicked( UINT nID )
{
int nButton = nID - IDC_BUTTON1;
ASSERT( nButton >= 0 && nButton < 10 );
// ...
}
Le gestionnaire de OnButtonClicked pour un seul message de BN_CLICKED ne requiert 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 chargé de générer un message de BN_CLICKED.
Le code présenté dans l'exemple de scénario : la conversion de la valeur passée à int dans la plage de message et déclarer que c'est le cas. Vous pouvez effectuer certaines mesures différente selon le bouton sur lequel l'utilisateur a cliqué.