API Windows, gestion de WM_COMMAND [Résolu]

Messages postés
5
Date d'inscription
lundi 12 septembre 2005
Statut
Membre
Dernière intervention
8 avril 2008
- - Dernière réponse : coucou_le_minou
Messages postés
5
Date d'inscription
lundi 12 septembre 2005
Statut
Membre
Dernière intervention
8 avril 2008
- 8 avril 2008 à 19:12
Bonjour, tout d'abord pardonnez moi si mon message ne correspond pas a la rubrique choisie, j'ai eu quelques soucis a cerner la categorie de mon probleme. Ensuite je voudrais remercier les developpeurs de ce site, qui m'a toujours permis de trouver mon bonheur (jusqu'a maintenant) !

Je suis en train de developper une application Win32 grace a l'API windows en C++, et je ne suis qu'au debut (creation de l'interface). En effet, lors de l'interception du message "WM_PAINT", je crée plusieurs fenetres enfant (controles) de type "EDIT", "BUTTON" etc... avec le meme Handle que je definis avant (hedit) ex :

hedit = CreateWindow("EDIT", "Welcome...", WS_CHILD ...ES_READONLY , 10, 10, 575, 385, hwnd, NULL, hinst, NULL);

Ce que je souhaite, au clic d'une personne sur ce controle (et celui la uniquement), c'est connaitre l'identifiant de ce meme controle pour pouvoir afficher le texte que je veux dedans. J'ai deja créé la procedure de lecture du message "WM_COMMAND" envoyé lors d'une action sur un controle, et je sais qu'il faut prendre le mot de poids faible de la variable LParam (LOWORD(lParam)) pour recuperer l'id du controle actif. Or lors de la lecture de plusieurs tutos, j'ai remarqué :
1: qu'ils utilisaient les fichiers .rc pour leurs controles : ex, ici a la place du message "Welcome", ils mettent "IDM_EDIT", et je ne peux pas en utiliser (imposé dans le projet)
2: que je n'ai aucune chose qui me permettrait d'identifier mon controle clairement (aucun id)
3: s'il est identifié par son deuxieme parametre ("Welcome"), lors du changement de son texte, son identifiant changerai t il en meme temps?
4: s'il est identifié par sa "classe" (ex ici "EDIT"), dans le cas ou j'aurais plusieurs "EDIT" comment les differencier?

J'espere avoir ete assez clair, merci d'avance pour l'aide que vous pourriez m'apporter, je reste dispo pour toutes vos questions !
Afficher la suite 

3 réponses

Meilleure réponse
Messages postés
968
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
3
Merci
Tu peux les identifier par leur hwnd. Je ne sais pas ce que tu veux dire par "leur même handle qui est unique" car ce n'est pas le cas.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 130 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_juju12
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
3
Merci
Bonjour,

1) C'est dans le message WM_CREATE (ou WM_INITDIALOG si c'est une fenêtre type "Boîte de dialogue") qu'il faut créer les contrôles enfant de la fenêtre, pas dans le message WM_PAINT (lui va plutôt servir à mettre à jour une image de fond par exemple).

2) Dans la fonction CreateWindow() (ou CreateWindowEx()), le paramètre de type HMENU permet de passer l'identificateur associé au contrôle. Exemple :

 #define ID_CONNECTER  1000 // identificateur du bouton "Connecter"

      case WM_CREATE :
      {
         ...

         HWND hWndBtn = CreateWindow
         (
             "BUTTON"              // contrôle de style bouton
            ,"Connecter"           // texte du bouton
            ,WS_CHILD | WS_VISIBLE // styles du contrôle
            ,340,300               // x,y
            ,60,30                 // largeur,hauteur
            ,hWnd                  // handle de la fenêtre parent
            ,(HMENU)ID_CONNECTER   // identificateur du bouton
            ,g_hInstance           // instance de l'application
            ,NULL
         );
         SendMessage(hWndBTN,WM_SETFONT,(WPARAM)hFontText,(LPARAM)true);

         ...
      }
      return 0;

Dans cet exemple je récupère le handle du contrôle pour lui envoyer le message de modification de la fonte utilisée pour présenter le texte du bouton. On pourrait ne pas conserver ce handle et faire un :
SendMessage(GetDlgItem(hWnd,IDCANCEL),WM_SETFONT,...);


Si la fenêtre est de type "Boîte de dialogue", sa description peut être faite dans le fichier des ressources du projet (je ne sais pas si ça existe avec une fenêtre classique, je ne l'ai jamais vu en tout cas !). Voir l'aide sur DIALOGEX. C'est une question de choix de programmation !




Pour utiliser l'action sur le contrôle, ça se passe dans la gestion du message WM_COMMAND :

      case WM_COMMAND:
      switch(LOWORD(wParam)) // on passe en revue tous les identificateurs
      {                      // associés aux contrôles de la fenêtre
         // --- Bouton "Connecter"
         case ID_CONNECTER :
         ... Traitement du bouton "Connecter" ...
         break;

         // --- Contrôle "???"
         case ID_autre_contrôle_1 :
         ... Traitement de l'autre contrôle 1 ...

         break;

         // --- Contrôle "???"
         case ID_autre_contrôle_2 :
         ... Traitement de l'autre contrôle 2 ...
         break;

         ...
      }
      return 0;



Jean-François

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 130 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_jfrancois
Messages postés
5
Date d'inscription
lundi 12 septembre 2005
Statut
Membre
Dernière intervention
8 avril 2008
0
Merci
Merci pour toutes ces reponses :
@Juju12 : oui je voulais bien parler du hwnd, et pas de l'instance, me suis mal exprimé ;)

@JFrancois : Voila, en fait c'est juste les infos que je cherchais, a savoir le neuvieme argument de la fonction createwindow() (HMENU), qui etais toujours Null dans les exemples etudiés, et n'indiquais pas l'identifiant de la fenetre.
J'ai regardé mon code avec plus d'attention et les fenetres enfants sont bien créées dans le cas du message "WM_CREATE".

Encore merci pour votre rapidité et votre clarté, bonne soirée a tous !
Commenter la réponse de coucou_le_minou