coucou_le_minou
Messages postés5Date d'inscriptionlundi 12 septembre 2005StatutMembreDernière intervention 8 avril 2008
-
8 avril 2008 à 16:19
coucou_le_minou
Messages postés5Date d'inscriptionlundi 12 septembre 2005StatutMembreDerniè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 :
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 !
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 8 avril 2008 à 18:47
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;
coucou_le_minou
Messages postés5Date d'inscriptionlundi 12 septembre 2005StatutMembreDernière intervention 8 avril 2008 8 avril 2008 à 19:12
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 !