begin process at 2008 08 20 14:43:59
1 228 884 membres
250 nouveaux aujourd'hui
14 258 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : API Windows, gestion de WM_COMMAND [ Windows / System ] (coucou_le_minou)

API Windows, gestion de WM_COMMAND le 08/04/2008 16:19:46

coucou_le_minou
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 !


Re : API Windows, gestion de WM_COMMAND le 08/04/2008 17:50:46

juju12
Réponse acceptée !
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.

Re : API Windows, gestion de WM_COMMAND le 08/04/2008 18:47:05

jfrancois
Réponse acceptée !

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


Re : API Windows, gestion de WM_COMMAND le 08/04/2008 19:12:38

coucou_le_minou
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 !



Classé sous : message, edit, controle, wm, api

Participer à cet échange

Pub



Appels d'offres

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS