Partager via


Gestionnaires pour les messages windows standard

Les gestionnaires par défaut pour les messages Windows standard (WM_) sont prédéfinis dans la classe CWnd. La bibliothèque de classes base des noms de ces gestionnaires sur le nom du message. Par exemple, le gestionnaire du message WM_PAINT est déclaré dans CWnd comme suit :

afx_msg void OnPaint();

Le mot clé afx_msg suggère l'effet du mot clé C++ virtual en caractéristisant les gestionnaires d'autres fonctions membres CWnd. Notez, toutefois, que ces fonctions ne sont pas réellement virtuelles ; elles sont plutôt implémentées dans les tables des messages. Les tables des messages dépendent uniquement les macros standard du préprocesseur, et non des extensions au langage C++. Le mot clé afx_msg correspond à un espace blanc après prétraitement.

Pour remplacer un gestionnaire défini dans une classe de base, il vous suffit de définir une fonction du même prototype de votre classe dérivée et créer une entrée dans la table des messages du gestionnaire. Le gestionnaire « substitue » tout gestionnaire du même nom dans n'importe laquelle des classes de base de vos classes.

Dans certains cas, le gestionnaire doit appeler le gestionnaire de remplacement dans la classe de base pour que la classe de base et Windows puissent traiter le message. L'emplacement où vous appelez le gestionnaire de classe de base dans votre fichier dépend des cas. Parfois vous devez appeler le gestionnaire de classe de base en premier et parfois en dernier. Parfois vous appelez le gestionnaire de classe de base de manière conditionnelle, si vous choisissez de ne pas traiter le message vous-même. Parfois vous devez appeler le gestionnaire de classe de base, puis exécuter de manière conditionnelle votre propre code manager, selon la valeur et l'état retourné par le gestionnaire de la classe de base.

Avertissement

Il n'est pas sécurisé de modifier les arguments passés dans un gestionnaire si vous envisagez de les transmettre à un gestionnaire de la classe de base.Par exemple, vous pouvez être tenté de modifier l'argument nChar du gestionnaire OnChar (pour convertir en majuscules, par exemple).Ce comportement est suffisamment obscur, mais si vous devez obtenir cet effet, utilisez la fonction membre SendMessageCWnd à la place.

Comment déterminer la méthode appropriée pour remplacer un message donné ? Lorsque la fenêtre Propriétés dans la structure de la fonction gestionnaire d'un message donné (un gestionnaire OnCreate pour WM_CREATE, par exemple) cela prend la forme de la fonction membre substituée recommandée. L'exemple suivant recommande que le gestionnaire appelle d'abord le gestionnaire de classe de base et procède uniquement à la condition qu'il ne retourne pas – 1.

int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
   if (CFormView::OnCreate(lpCreateStruct) == -1)
      return -1;

   // TODO:  Add your specialized creation code here 

   return 0;
}

Par convention, les noms de ces gestionnaires commencent par le préfixe « On ». Certains de ces gestionnaires n'occupent aucun argument, tandis que d'autres en ont plusieurs. Certains ont également un type de retour autre que void. Les gestionnaires par défaut pour tous les messages de WM_ sont décrits dans le guide de MFC comme fonctions membres de la classe CWnd dont les noms commencent par « On ». Les déclarations de fonctions membres dans CWnd portent le préfixe afx_msg.

Voir aussi

Concepts

déclarer des fonctions gestionnaires de messages