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 les noms de ces gestionnaires sur le nom du message. Par exemple, le gestionnaire du message WM_PAINT est déclaré comme CWnd
suit :
afx_msg void OnPaint();
La afx_msg mot clé suggère l’effet du mot clé C++ virtual
en distinguent les gestionnaires d’autres CWnd
fonctions membres. 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 des macros de préprocesseur standard, et non des extensions au langage C++. La afx_msg mot clé se résout en espace blanc après le prétraitement.
Pour remplacer un gestionnaire défini dans une classe de base, il vous suffit de définir une fonction avec le même prototype dans votre classe dérivée et de 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 substitution dépend des circonstances. 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 gestionnaire, selon la valeur et l'état retourné par le gestionnaire de la classe de base.
Attention
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 OnChar
gestionnaire (pour convertir en majuscules, par exemple). Ce comportement est assez obscur, mais si vous avez besoin d’accomplir cet effet, utilisez plutôt la CWnd
fonction SendMessage
membre.
Comment déterminer la façon appropriée de remplacer un message donné lorsque l’Assistant Classe écrit le squelette de la fonction de gestionnaire pour un message donné , un OnCreate
gestionnaire pour WM_CREATE, par exemple, il croquis sous 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 continue uniquement à 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 ne prennent aucun argument, tandis que d’autres prennent plusieurs. Certains ont également un type de retour autre que void
. Les gestionnaires par défaut pour tous les messages WM_ sont documentés dans la référence MFC en tant que fonctions membres de classe CWnd
dont les noms commencent par « On ». Les déclarations de fonction membre dans CWnd
sont précédées de afx_msg.