2009-06-10 19 views
3

Dans une instance d'une classe dérivée de CWnd, est-il possible de transférer (rediriger) tous les messages MFC vers un autre objet, sans écrire des gestionnaires séparés et des mappages de messages pour chaque message possible? Plus précisément, je souhaite transférer tous les messages WM_ non gérés vers un autre objet. Si cela n'est pas possible, alors est-il possible pour les objets d'écouter les événements qui se produisent dans d'autres objets? Je peux fournir des détails si cela aiderait à clarifier ma question.Comment rediriger les messages MFC vers un autre objet?

Merci.

Répondre

4

Vous devrez viser un peu plus bas que le MFC. Vous devez remplacer la méthode PreTranslateMessage de votre fenêtre et traiter les messages directement. Une fois que vous avez la boucle de message principal, vous pouvez choisir ceux qui sont gérés par votre application et ceux qui sont envoyés/envoyés à un autre. Si vous choisissez d'envoyer le message, je recommanderais SendMessageTimeout (...)

+0

Merci; override PreTranslateMessage() était exactement la solution dont j'avais besoin. – Geoff

+0

Voulez-vous dire PreTranslateMessage? D'après le commentaire de Geoff, il semble que vous l'ayez fait. AFAIK PreProcessMessage est dotnet. PreTranslateMessage est une fonction MFC. Je pense qu'il sera utile d'éditer la réponse pour éviter toute confusion. –

+0

Merci! Modifier fait. –

1

Je pense que vous avez besoin de sous-classe.

+0

L'appel de SubclassWindow() n'a pas vraiment fonctionné dans ma mise en œuvre, mais je vais le garder à l'esprit pour une utilisation future. Merci. – Geoff

1

Non, vous ne pouvez pas vraiment faire ce que vous demandez, mais vous ne probablement pas à. (Certains détails de votre problème peuvent être en ordre.) Lorsque vous créez un mappage de message, vous spécifiez à la fois la classe à laquelle il s'applique et la classe de base pour cette classe. Si votre classe dérivée n'a pas une entrée de mappe de message pour un message particulier, MFC vérifie la mappe de message pour la classe de base. Si la table des messages de la classe de base n'a pas d'entrée, elle vérifie la table des messages pour sa classe de base, et ainsi de suite. Par exemple, supposons que vous ayez un tas de boîtes de dialogue avec des fonctionnalités communes. Vous pouvez exposer vos classes ainsi:

class CMyBaseDialog : public CDialog { 
    DECLARE_MESSAGE_MAP(); 
} 

BEGIN_MESSAGE_MAP(CMyBaseDialog, CDialog) 
    // Handle any common messages here... 
END_MESSAGE_MAP() 

class CDerivedDialog : public CMyBaseDialog { 
    DECLARE_MESSAGE_MAP(); 
} 

BEGIN_MESSAGE_MAP(CDerivedDialog, CMyBaseDialog) 
    // Handle any specific messages here... 
END_MESSAGE_MAP() 

de même pour toutes les autres classes basées HWND, comme CWnd, CView, CFrame, et ainsi de suite. Si vous traitez spécifiquement des messages de commande, vous avez des options supplémentaires.

0

Eh bien puisque je ne peux pas être en mesure de poster un commentaire, je l'afficherai comme une réponse. J'ai eu un problème suite à la réponse de Brad où certains messages WM_COMMANd n'ont pas été routés via la fonction PreTranslateMessage (voir ma réponse à ma question How to stop MFC from disabling my controls if I don't declare a message map entry for it's corresponding command?) mais étaient via OnCommand donc j'ai fondamentalement surchargé la fonction OnCommand pour transférer tous les messages WM_COMMAND aussi. Je poste ceci au cas où quelqu'un aurait le même problème.

En tout cas merci pour l'aide Brad, votre réponse m'a beaucoup aidé.

Questions connexes