Donc un goupe de contôle contenant des contôles. Dans cette situation je ne sais pas intercépter le clic sur le bouton "Search"
Voila la boucle de traitement des messages :
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
MessageBox(hWnd, "WM_COMMAND", "WndProc", NULL);
...
...
break;
...
...
case ID_CMD_SEARCH:
//MessageBox(hWnd, "Contrôle non trouvé", "Recherche du contrôle", NULL);
EnumChildWindows(hWnd, (WNDENUMPROC) EnumChildProc_Find_Control, ID_EDIT_LOG_ADM);
//GetWindowText(hHandel_Control....);
//Connexion_AD();
break;
...
...
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
J'imagine bien que je m'y prend mal mais je vois pas comment procéder.
Une autre question au passage mais qui mérite peut-être un autre poste. EnumChildWindows me permet de récuperer le HWND du contrôle que je cherche, cela marche parfaitement mais pour récuper le HWND j'ai declaré une variable global et j'aimerais plustot faire en sorte d'avoir une fonction qui me retourne le HWND. Je vois comme solution à cela la création d'une classe mais il doit y avoir plus simple.
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 14 févr. 2006 à 21:53
Salut,
Le message WM_COMMAND est normalement
envoyé à la procédure de le fenêtre (ou le controle) mère du bouton.
Pour pouvoir intercepter ce message il y'a 2 solutions:
1- Remplacer la procédure de ton Static (parent) par celle de la
fenêtre principale. Ainsi, tous les messages destinés au Static seront
détournés vers ta WndProc.
2- Sous-classer le Static parent pour pouvoir intercepter et traiter les messages envoyés par ses controles enfants (child).
Dans ton cas, les messages sont envoyés à la procédure par défaut de ton Static hGoupeConnexion.
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 16 févr. 2006 à 01:35
C'est bien d'éviter les variables globales tant que possible. Mais parfois on ne peut pas faire autrement.
Dans ton cas tu peux éviter cette variable globale en faisant une
fonction qui retourne le HWND du controle recherché et reçoit en
paramètre le HWND parent et l'identificateur du controle. Cette
fonction utilisera GetWindow() ou FindWindowEx() pour trouver les
controles child et GetWindowLong() pour trouver les identificateurs. Si
l'identificateur obtenu correspond à celui donné en paramètre, la
fonction retourne son HWND. Si l'énumération est terminé sans trouver
le controle voulu, elle retourne 0.
Voici un petit exemple fait rapidement:
HWND GetChild(HWND hParent, int Identificateur)
{
HWND child=GetWindow(hParent, GW_CHILD);
while (child)
{
int id=(int)GetWindowLong(child, GWL_ID);
if (id==Identificateur) return child;
yserver
Messages postés203Date d'inscriptionlundi 2 août 2004StatutMembreDernière intervention 8 septembre 2006 14 févr. 2006 à 17:52
Il me semble bien que je l'avais fait ainsi au depart. Mais face à mon échec, j'ai essayé de le mettre un peut par tout. D'ou la présence de MessageBox(hWnd, "WM_COMMAND", "WndProc", NULL); pour tester la boucle.
J'avais pas fait attention en postant à ca je vérifirais. Il faut donc que je switch comme suis:
switch (wmId)
{
...
case ID_CMD_SEARCH:
...
}
Pour ce soir je peux pas aller plus loin. Reponse demain.
Vous n’avez pas trouvé la réponse que vous recherchez ?
yserver
Messages postés203Date d'inscriptionlundi 2 août 2004StatutMembreDernière intervention 8 septembre 2006 15 févr. 2006 à 17:43
Merci de votre aide.
C'est SetWindowLong(hGoupeConnexion,GWL_WNDPROC,(LPARAM)WndProc); qui me manquait. Le code que j'ai posté contenait bien une erreur dans la boucle de traitement mais ce que je faisait initialement etait correcte :
switch (wmId)
{
...
case ID_CMD_SEARCH:
J'ai donc pu poursuivre, c'était vraiment simple.
Concerant :
Une autre question au passage mais qui mérite peut-être un autre poste. EnumChildWindows me permet de récuperer le HWND du contrôle que je cherche, cela marche parfaitement mais pour récuper le HWND j'ai declaré une variable global et j'aimerais plustot faire en sorte d'avoir une fonction qui me retourne le HWND. Je vois comme solution à cela la création d'une classe mais il doit y avoir plus simple.
Voila ce que je veux faire. Ce code marche tres bien mais je souhaiterais une fonction qui me retourne directement le HWND que du controle que je cherche et non de passer par une variable globale, ce que je ne trouve pas très élégant.
yserver
Messages postés203Date d'inscriptionlundi 2 août 2004StatutMembreDernière intervention 8 septembre 2006 17 févr. 2006 à 18:59
Voila finalement la fonction que j'utilise pour trouver un controle dans une fenetre en n'en connaissant que son ID.
En parmetre la fenetre parent et l'ID du controle.
Retourne le HWND du controle.
La recherche ce fait dans la fenetre les sous fenetre et leur sous fenetre....
HWND Find_Control(HWND hWnd, LONG ID_to_Find) {
HWND hControl=GetWindow(hWnd, GW_CHILD);
while (hControl)
{
LONG ID_Control = GetWindowLong(hControl, GWL_ID);
if (ID_Control==ID_to_Find)
return hControl;
Find_Control(hControl, ID_to_Find);
hControl=GetWindow(hControl, GW_HWNDNEXT);
}
return 0;
}