Traitement des messages (win32)

Messages postés
66
Date d'inscription
vendredi 3 mai 2002
Statut
Membre
Dernière intervention
11 juillet 2002
- - Dernière réponse : Dorgendubal
Messages postés
66
Date d'inscription
vendredi 3 mai 2002
Statut
Membre
Dernière intervention
11 juillet 2002
- 1 juil. 2002 à 12:51
Bonjour,

j'ai un petit probleme de traitement des messages sous win32 (sans MFC !). Quand je crée un nouvel objet (bouton, edit,...) avec CreateWindow(...) et que je clique dessus (par exemple) ... tout ce passe comme prévu, je peux filtrer le message dans la procédure WinProc.

Là où ça se complique, c'est quand je rajoute un bouton dans un bouton (c'est qu'un exemple). Alors quand je clique sur le bouton intérieur, rien ne se passe parce que WinProc ne reçoit pas le message.
Si je réoriente la destination des messages avec SetWindowLong(...,GWL_WNDPROC,...), le problème, c'est que je reçoit tout les messages (même ceux servant à la création du bouton) et que le bouton n'apparait plus à l'écran !

Alors deux questions : (1 des 2 solutions me suffit)
1) Comment rediriger les messages vers le parent tout en le faisant quand même traiter par la procédure par défaut ?

2) Comment appeller la procédure par défaut d'un objet (bouton, edit, ...)

Merci pour votre aide.

Sven.

PS: j'espère que c'est compréhensible ...
Afficher la suite 

2 réponses

Messages postés
174
Date d'inscription
mardi 10 avril 2001
Statut
Membre
Dernière intervention
30 juillet 2003
1
0
Merci
Essaye une GetMessage avec le hwnd celui de ton bouton imbriqué que tu auras trouvé a l'aide de FindWindowEx
Commenter la réponse de mmuller57
Messages postés
66
Date d'inscription
vendredi 3 mai 2002
Statut
Membre
Dernière intervention
11 juillet 2002
0
Merci
Ta méthode je l'utilise déjà. Je fais un GetMessage(...,NULL,...) ce qui fait que tous les messages sont reçus. Mais le problème est que je ne peux pas les filtrer sous WM_COMMAND ... ils n'apparaissent pas.

J'ai tout de même trouvé une solution ! (un peu compliquée).

Voici les étapes :

1) GetClassInfoEx : extraire les infos d'une classe
// MyButton
WNDCLASSEX buttcls;
buttcls.cbSize = sizeof buttcls;
::GetClassInfoEx(NULL, _T("Button"), &buttcls);

2) Garder quelque part la fonction de traitement par défaut :
defaultButtonProc = buttcls.lpfnWndProc;

3) Modifier la fonction qui traitera les msgs :
buttcls.lpfnWndProc = MyButtonProc;

4) Enregister la nouvelle classe
buttcls.lpszClassName = _T("MyButton");
::RegisterClassEx(&buttcls)

5) Créer un nouveau bouton
HWND mainBut =
::CreateWindowEx(0,"MyButton","Click", WS_CHILD | BS_PUSHBUTTON,x,y,w,h, mainWnd,NULL,NULL,NULL);
::ShowWindow(mainBut,SW_SHOW);

6) Créer un sous bouton
HWND subBut =
::CreateWindowEx(0,"MyButton","Click", WS_CHILD | BS_PUSHBUTTON,x,y,w,h, mainBut,NULL,NULL,NULL);
::ShowWindow(subBut,SW_SHOW);

Et voilà ... puis dans la procedure de traitement des Msg :

LRESULT CALLBACK MyButtProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if(message == WM_COMMAND)
{
....
}
return ::CallWindowProc(defaultButtonProc, hWnd, message, wParam, lParam);
}

Note : ne pas oublier ::CallWindowProc(default...) sinon le bouton ne sera pas créé !

Voilà, si il y a une méthode plus simple ... je suis preneur !

Merci

Sven
Commenter la réponse de Dorgendubal