Traitement des messages (win32)

Dorgendubal Messages postés 66 Date d'inscription vendredi 3 mai 2002 Statut Membre Dernière intervention 11 juillet 2002 - 1 juil. 2002 à 08:49
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 ...

2 réponses

mmuller57 Messages postés 174 Date d'inscription mardi 10 avril 2001 Statut Membre Dernière intervention 30 juillet 2003 1
1 juil. 2002 à 10:23
Essaye une GetMessage avec le hwnd celui de ton bouton imbriqué que tu auras trouvé a l'aide de FindWindowEx
0
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
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
0
Rejoignez-nous