begin process at 2012 05 28 12:57:34
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

System

 > 

API Windows, gestion de WM_COMMAND


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

API Windows, gestion de WM_COMMAND

mardi 8 avril 2008 à 16:19:46 | API Windows, gestion de WM_COMMAND

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 !

mardi 8 avril 2008 à 17:50:46 | Re : API Windows, gestion de WM_COMMAND

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.
mardi 8 avril 2008 à 18:47:05 | Re : API Windows, gestion de WM_COMMAND

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

mardi 8 avril 2008 à 19:12:38 | Re : API Windows, gestion de WM_COMMAND

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 !



Cette discussion est classée dans : message, edit, controle, wm, api


Répondre à ce message

Sujets en rapport avec ce message

CONTROLE EDIT [ par Telemorphix ] Bonjour,Je fais mes premiers pas en ce moment en C et C++ (Visual C++ 6.0) et sur l'API Windows.Je souhaite afficher du texte dans une fenêtre EDIT mu [keyboard] attente windows message [ par Andejen ] Bonjour,Je viens de creer une fonction assez simple qui me permet d'effectuer une action des que l'utilisateur tape une touche au clavier. Cependant, Envoyer un message WM_USER à un service ? [ par spectrobob ] Comment fait-on pour envoyer un message de type WM_USER d'un exécutable  console (MFC) vers un service windows (MFC) donc sans handle de fenêtre ?Merc comment choper un message WM_KEYDOWN d'une Ccombobox? [ par papipsycho ] Bonjour comment choper un message WM_KEYDOWN d'une CcomboboxMerci.--==Papi Psycho==-- GetMessage d'un HWND [ par kiki67100 ] Bonjour tousJ'aimerais recupere les message d'une api dabord je recupere le HWND via HWND API  = FindWindow(0,"API");  Puis j'aimerais recuperer les m Les messages envoyés aux fenêtres dans une API Windows [ par totoui ] Bonjour, je poste ici en espérant que ce soit le bon endroit (difficile de rechercher "message de fenêtres")...Je programme une API en C++ sans MFC so fenetre [ par lektrosonic ] Bonjour,j'ai une petite fenetre avec un arriere plant un bitmap, je creer un controle "edit" par dessus avec la fonction CreteWindowEx()cettre fenetre controle EDIT [ par SnOOpss ] Bonjour,  je suis en train de creer une dll qui sous classe un edit et j'aurait 2 kestions a vous demander. En fait la scrollbar a gauche de l'edit ap listbox controle [ par JoebarGlut ] Salut, j'utilise l'api win32 et les controles preconstruis de l'api. Salut, Existe t il un message pour gerer les positions du genre LB_UPSTRING ?, LB message WM_ENTER [ par samia82 ] bonjour a tous novice dans le visual c++ je cherche à créer une sorte de moteur de recherche dans une base de donnée ...je souhaiterai pour lancer ma


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,889 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales