OVH Cloud OVH Cloud

MFC : message map d'un message utilisateur

4 réponses
Avatar
Jeremie Fouche
Bonjour

J'ai créé un controle MFC qui envoie le message WM_MYMSG lorsqu'il est
modifié.
SendMessage( GetParent()->m_hwnd, WM_MYMSG, (WPARAM) GetDlgId(), (LPARAM)
m_valueDuControle);

J'ai vu dans les sources MFC les defines utilisés pour le mapping des
messages (ON_EN_CHANGE, ON_COMMAND, ... ). Je me demandais s'il etait
possible de faire un define du genre :
#define ON_WM_MYMSG( id, memberFxn ) \
{ WM_MYMSG, ?, ?, AfxSig_v?, &memberFxn },

Qui permttrait de router le message dirrectement vers la bonne fonction en
fonction de l'ID du controle.

Aujourd'hui, je fonctionne gràce à ON_MESSAGE( WM_MYMSG, OnMyMsg ), et donc,
je traite l'ID en question de la fonction suivante:
LPARAM CMyWnd::OnMyMsg(WPARAM wParam, LPARAM lParam)
{
switch (wParam)
{
case ID_CONTROL1 :
OnControl1Change(lParam);
break
case ID_CONTROL2 :
OnControl2Change(lParam);
break
case ID_CONTROL3 :
OnControl3Change(lParam);
break
}

return 0;
}

J'espere avoir été clair. Et excusez moi si j'ai fait des erreurs de code
car mon PC de dev n'est pas mon pc internet ( donc pas de copier/coller du
code, tout dans la tete ;o) ).

--
Jérémie Fouché
jeremie.fouche.tonmasque@tiscali.fr - Enlève ton masque pour me repondre.

4 réponses

Avatar
AG
Quel est le problème de ta solution actuelle ?

Quel avantage apporterait ton idée, que je n'ai pas bien comprise au
passage ?

On ne peut pas router un message directement vers une fonction. Un
message passe dans une "message queue" dans laquelle on choisi vers
quelle fonction on va passer le message. Si tu veux faire plus court,
autant appeler la fonction directement à la place d'envoyer un message.
Mais tu risques de te heurter à des problèmes communications entre
classes incompatibles.

Alexandre

Jeremie Fouche wrote:
Bonjour

J'ai créé un controle MFC qui envoie le message WM_MYMSG lorsqu'il est
modifié.
SendMessage( GetParent()->m_hwnd, WM_MYMSG, (WPARAM) GetDlgId(), (LPARAM)
m_valueDuControle);

J'ai vu dans les sources MFC les defines utilisés pour le mapping des
messages (ON_EN_CHANGE, ON_COMMAND, ... ). Je me demandais s'il etait
possible de faire un define du genre :
#define ON_WM_MYMSG( id, memberFxn )
{ WM_MYMSG, ?, ?, AfxSig_v?, &memberFxn },

Qui permttrait de router le message dirrectement vers la bonne fonction en
fonction de l'ID du controle.

Aujourd'hui, je fonctionne gràce à ON_MESSAGE( WM_MYMSG, OnMyMsg ), et donc,
je traite l'ID en question de la fonction suivante:
LPARAM CMyWnd::OnMyMsg(WPARAM wParam, LPARAM lParam)
{
switch (wParam)
{
case ID_CONTROL1 :
OnControl1Change(lParam);
break
case ID_CONTROL2 :
OnControl2Change(lParam);
break
case ID_CONTROL3 :
OnControl3Change(lParam);
break
}

return 0;
}

J'espere avoir été clair. Et excusez moi si j'ai fait des erreurs de code
car mon PC de dev n'est pas mon pc internet ( donc pas de copier/coller du
code, tout dans la tete ;o) ).

--
Jérémie Fouché
- Enlève ton masque pour me repondre.



Avatar
Jeremie Fouche
AG a écrit dans le message :
Quel est le problème de ta solution actuelle ?

Quel avantage apporterait ton idée, que je n'ai pas bien comprise au
passage ?



Pas grand chose en faite, a part le fait que la selection de la fonction se
fait directement dans le message map, plutot que dans une fonction OnMyMsg
vue plus bas.


On ne peut pas router un message directement vers une fonction.



Comment font donc le CEdit avec le message EN_CHANGE. Car dans le message
map, il existe un ON_EN_CHANGE( id, memberFxn ) qui route le message
EN_CHANGE directement vers la fonction membre qui va bien en fonction de
l'ID, qui, il me semble, est un parametre du message. J'ai bien essayé de
comprendre comment fonctionnait le define ON_EN_CHANGE, grace aux sources
MFC ( afxmsg_.h il me semble ), mais heu, meme avec le MSDN, je n'arrive pas
à mes fin.

Un message passe dans une "message queue" dans laquelle on choisi vers
quelle fonction on va passer le message. Si tu veux faire plus court,
autant appeler la fonction directement à la place d'envoyer un message.
Mais tu risques de te heurter à des problèmes communications entre
classes incompatibles.

Alexandre

Jeremie Fouche wrote:
> Bonjour
>
> J'ai créé un controle MFC qui envoie le message WM_MYMSG lorsqu'il est
> modifié.
> SendMessage( GetParent()->m_hwnd, WM_MYMSG, (WPARAM) GetDlgId(),


(LPARAM)
> m_valueDuControle);
>
> J'ai vu dans les sources MFC les defines utilisés pour le mapping des
> messages (ON_EN_CHANGE, ON_COMMAND, ... ). Je me demandais s'il etait
> possible de faire un define du genre :
> #define ON_WM_MYMSG( id, memberFxn )
> { WM_MYMSG, ?, ?, AfxSig_v?, &memberFxn },
>
> Qui permttrait de router le message dirrectement vers la bonne fonction


en
> fonction de l'ID du controle.
>
> Aujourd'hui, je fonctionne gràce à ON_MESSAGE( WM_MYMSG, OnMyMsg ), et


donc,
> je traite l'ID en question de la fonction suivante:
> LPARAM CMyWnd::OnMyMsg(WPARAM wParam, LPARAM lParam)
> {
> switch (wParam)
> {
> case ID_CONTROL1 :
> OnControl1Change(lParam);
> break
> case ID_CONTROL2 :
> OnControl2Change(lParam);
> break
> case ID_CONTROL3 :
> OnControl3Change(lParam);
> break
> }
>
> return 0;
> }
>
> J'espere avoir été clair. Et excusez moi si j'ai fait des erreurs de


code
> car mon PC de dev n'est pas mon pc internet ( donc pas de copier/coller


du
> code, tout dans la tete ;o) ).
>
> --
> Jérémie Fouché
> - Enlève ton masque pour me


repondre.
>




Avatar
AG
Jeremie Fouche wrote:
Comment font donc le CEdit avec le message EN_CHANGE. Car dans le message
map, il existe un ON_EN_CHANGE( id, memberFxn ) qui route le message
EN_CHANGE directement vers la fonction membre qui va bien en fonction de
l'ID, qui, il me semble, est un parametre du message. J'ai bien essayé de
comprendre comment fonctionnait le define ON_EN_CHANGE, grace aux sources
MFC ( afxmsg_.h il me semble ), mais heu, meme avec le MSDN, je n'arrive pas
à mes fin.


Qu'on me corrige si je me trompe, mais, voici comment fonctionnent les
messages dans les MFC :

Il y a une pompe à message par thread. Lorsque tu envoies un message, le
message arrive dans la pompe à message du thread pour lequel il est
destiné. Donc lorsqu'il s'agit d'un message d'un CEdit, le message est
posté dans la pompe à message (unique à priori si tu n'as qu'un thread)
de ton application. Lorsque son tour arrive, il est lu et dispatché vers
la bonne fonction. C'est le rôle du message map :

ON_EN_CHANGE( id, memberFxn)

Quelque soit la manière dont tu fais ton message map (à la main, ou en
utilisant le Wizard), il faut qu'il soit fait dans la pompe à message de
ton thread. C'est fait automatiquement lorsque tu utilise les macro
ON_EN_CHANGE() et ses comparses. Tu peux le faire toi-même mais il faut
alors reécrire ta pompe à message.

Est ce plus clair ?
Avatar
Thierry
Bonjour,

AG a écrit :

Tu peux le faire toi-même mais il faut
alors reécrire ta pompe à message.



Ou surcharger la WindowProc de la fenetre parente de d'edit.
C'est elle qu'est notifiée (il me semble).

--
« Always look at the bright side of the life... »