Question

Je me demandais simplement quelle était la différence (le cas échéant) entre les deux interruptions de message suivantes dans MFC pour la fonction OnSize (..).

1 - Via la carte de messages:

BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd)
...
    ON_WM_SIZE()
..
END_MESSAGE_MAP()

2 - Via afx_message:

afx_msg type OnSize(...);

Ils semblent être utilisés de manière interchangeable, lequel devrait être utilisé ou dépend-il d'autres facteurs?

Était-ce utile?

La solution

Les deux parties sont nécessaires pour ajouter un gestionnaire de messages à une classe. La mappe de messages doit être déclarée dans votre classe, avec les déclarations de toutes les fonctions du gestionnaire de messages (par exemple, OnSize ).

class CClassWnd : public CBaseClassWnd {
    ...
    afx_msg void OnSize(UINT nType, int cx, int cy);
    DECLARE_MESSAGE_MAP
};

afx_msg est simplement une macro d'espace réservé vide. En réalité, elle ne fait rien, mais est toujours incluse par convention.

La mappe de messages est ensuite définie dans le fichier .cpp de la classe:

BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd)
    ON_WM_SIZE()
END_MESSAGE_MAP()

Ces macros génèrent une table de consultation pour la classe qui permet aux messages reçus par la fenêtre d’être envoyés aux fonctions de gestionnaire correspondantes. La macro ON_WM_SIZE permet de décoder les paramètres de message wParam et lParam dans le message WM_SIZE . la fonction de gestionnaire de messages ( nType , cx et cy dans ce cas). MFC fournit des macros pour la plupart des messages de fenêtre ( WM_LBUTTONDOWN , WM_DESTROY , etc.).

Pour plus d'informations sur le fonctionnement des mappages de messages dans le MFC, ici sur MSDN.

Autres conseils

afx_msg est simplement une macro vide. En gros, il indique simplement que la méthode est un gestionnaire de messages MFC à des fins de lisibilité. Même avec afx_msg, vous devez toujours avoir une entrée dans la mappe de messages.

Certains messages Windows sont déjà gérés par MFC . Dans ces cas, vous pouvez vous en tirer en ajoutant simplement la méthode à votre classe dérivée.

Par exemple, la classe CWnd (comme beaucoup d'autres classes MFC) mappe déjà quelques messages Windows dans sa mappe de messages ( ON_WM_DRAWITEM , ON_WM_MEASUREITEM , ON_WM_ENTERIDLE , etc.).

Cependant, pour que tout message qui n'a pas encore été mappé par MFC ait à la fois une méthode de classe et une entrée dans la mappe de messages, il fonctionnera.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top