Dorgendubal
Messages postés66Date d'inscriptionvendredi 3 mai 2002StatutMembreDernière intervention11 juillet 2002
-
1 juil. 2002 à 08:49
Dorgendubal
Messages postés66Date d'inscriptionvendredi 3 mai 2002StatutMembreDernière intervention11 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, ...)
Dorgendubal
Messages postés66Date d'inscriptionvendredi 3 mai 2002StatutMembreDernière intervention11 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 :