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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
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é
jeremie.fouche.tonmasque@tiscali.fr - Enlève ton masque pour me repondre.
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.
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.
>
AG <ag@tb.fr> a écrit dans le message : 40BEFFE7.8000408@tb.fr...
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é
> jeremie.fouche.tonmasque@tiscali.fr - Enlève ton masque pour me
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.
>
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 ?
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.
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 ?
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... »
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... »