2010-01-18 9 views
1

Je crée l'application MFC dans laquelle CDialog avec contrôle enfant est dérivé de CStatic. Je souhaite recevoir des événements de souris pour le contrôle CStatic, donc j'ai réglé "Notify" sur true. Maintenant, je suis en mesure de recevoir des événements de message par carte de message directement à MyStatic:Consommez des événements dans CStatic de MFC et transmettez-les au parent

 

class CMyStatic : public CStatic 
{ 
afx_msg void OnLButtonDown(UINT nFlags, CPoint point); // Gets invoked 
DECLARE_MESSAGE_MAP() 
} 
 

Le problème est que désormais le parent CDialog ne reçoit pas les événements de la souris lorsque la souris est plus MyStatic enfant. Je peux les envoyer à partir de MyStatic manuellement, mais est-il possible de les laisser passer automatiquement? Et toujours être en mesure de les recevoir également sur MyStatic en utilisant des cartes de message?

Répondre

4

Non, vous êtes malentendu. SS_NOTIFY n'entraîne pas la réception de messages par CStatic, mais le CStatic renvoie les messages au parent. Donc "Maintenant, je suis en mesure de recevoir des événements de message à travers la carte de message directement dans MyStatic" est basé sur une fausse prémisse. Ceci est un point important à faire car un contrôle ne peut recevoir que des messages pour lui-même, pas pour ses enfants, à moins que ces enfants "jouent" en relayant des messages ou en faisant d'autres trucs (hooking global, ...) mais ces cas sont l'exception, la manière «normale» est que chaque fenêtre reçoive des messages pour elle-même. Donc, cela répond à votre question: non, il n'y a aucun moyen de laisser un parent (votre CDialog) et un enfant (votre CStatic) recevoir des événements de souris sans le faire manuellement ou de s'impliquer dans des hacks de routage de messages fastidieux. Donc dans votre cas, ce que vous devez faire est GetParent() -> SendMessage (WM_LBUTTONDOWN, ...) etc., en recréant manuellement les valeurs WPARAM et LPARAM; ou appelez OnLButtonDown directement sur le CDialog: GetParent() -> OnLButtonDown (...). Vous devrez penser aux coordonnées de la souris que vous transmettez à CDialog, vous devrez peut-être les traduire dans les coordonnées du client de CDialog.

+0

Roel, merci pour l'explication. Cependant, sauf si vous définissez SS_NOTIFY, je n'ai pas pu recevoir de messages à l'aide de la carte de messages. Peut-être que c'est un comportement MFC bizarre? –

+0

Essayez d'attraper WM_MOUSEMOVE dans votre CStatic et de faire SetFocus() là-bas. – Roel

1

Si vous appelez le gestionnaire OnLButtonDown de base, le message doit être envoyé au parent.

CMyStatic::OnLButtonDown(UINT nFlags, CPoint point) 
{ 
    CStatic::OnLButtonDown(nFlags, point); 

    // custom handling 
} 
+0

Cela n'a pas fonctionné pour moi. J'ai dû mettre 'GetParent() -> SendMessage (WM_COMMAND, GetDlgCtrlID() | WM_LBUTTONDOWN << 16, (LONG) GetSafeHwnd());' dans ma méthode CMyStatic :: OnLButtonDown() pour que cela fonctionne. De même pour WM_LBUTTONUP et CMyStatic :: OnLButtonUp(). Cette technique a été suggérée par [cette page] (http://www.tenouk.com/visualcplusmfc/visualcplusmfc16b.html). – ulatekh