MFC (C++) - C++ - Programmation
Marsh Posté le 01-04-2003 à 10:49:48
hummmmm, t sur que t en MFC la ?
tu peux donner le contexte de ton appel ) parce que visiblement la tu appeles pas CWnd::GetDlgItem(..) comme tu le souhaiterais mais plus ::GetDlgItem (fonction de l'api WIN32), qui elle veut un HWND (identifiant d'une fenetre/controle)
bref, donne nous le code on pourra ptet mieux t'aider
Marsh Posté le 01-04-2003 à 10:54:34
Je donne le code de la fonction qui est censée gérer les action apres l'appui sur un bouton dont l'ID est IDC_RegisterUser.
C'est un programme test, donc la boite de dialogue est simple.
Elle contient les boutons OK Annuler et Aider implantés automatiquement par Visual.
J'ai rajouté un controle de saisie (IDC_EnterUser), un bouton Enregistrer (IDC_RegisterUser) et une listbox (IDC_ListUsers).
Je voulais, pour tester, effectuer un principe simple : On rentre un nom dans le controle de saisie et en appuyant sur Enregistrer, ca colle le nom dans la listbox. Voici donc le code du bouton :
void CTestApp::OnRegisterUser()
{
// TODO: Add your control notification handler code here
//action sur le bouton "enregistrer"
CEdit * Login;
CString UserName;
Login = (CEdit *) GetDlgItem (IDC_EnterUser);
Login->GetWindowText(UserName);
if (UserName != "" )
{
CListBox * Liste;
Liste = (CListBox *) GetDlgItem(test, IDC_ListUsers);
Liste->AddString(UserName);
Login->SetWindowText("ok" );
}
}
Marsh Posté le 01-04-2003 à 10:56:44
Code :
|
avec les balises c mieux
bon la t'es dans l'app et pas dans la fenetre a proprement parler. T'as pas une autre classe se finissant par dlg par hasard ?
(c koi ta variable test ?)
Marsh Posté le 01-04-2003 à 11:02:52
la variable test, c t pour que la compilation ne donne pas d'erreurs. J'avais déclaré une variable :
HWND__ * test;
Et effectivement, j'ai un fichier se finissant par dlg. J'ai pensé que le pb venait de la. J'ai donc mis ma fonction dans ce fichier, rajouté les déclarations nécessaires, mais tout de meme, ma fonction ne devait pas faire partie de ce fichier selon visual c++.... Et, je tiens à le dire, c visual c++ qui m'a implanté cette fonction à cette endroit, moi j'ai juste rajouté le code qu'il y a au milieu.
Marsh Posté le 01-04-2003 à 11:16:42
ta CTestApp n'est pas ta boite de dialogue. Ta boite de dialogue c la classe se finissant par Dlg. C'est cette derniere qui implante GetDlgItem comme tu le souhaite.
Marsh Posté le 01-04-2003 à 11:18:15
Euh il t a implante la le code car tu ete sur l'app au moment de la creation et que rien ne t interdit de gere la fonction ds l app c pas pareil
Sinon +1
Ca marchera pas pour la bonne et simple raison que ds l'app le GetDlgItem ne se refaire a aucun CWnd* correspondant a une Dialog.
Marsh Posté le 01-04-2003 à 11:18:24
donc pour que ca marche, je transfère cette fonction dans CTestDlg (qui mon fichier se finissant par dlg...) ? Comme je te l'ai dit, ya apparement un pb de déclaration quand je fais ca... Et j'ai plutot du mal à comprendre.
Marsh Posté le 01-04-2003 à 11:20:55
Tu peuix pas la transfere
La fonction est declarer ds le .h et .cpp de ton app la MAIS tu as aussi le WM_BUTTON associe qui est necessaire.
Solution :
1 - tu fait classwizard > remove function de ton app
2 - et tj ds clsswd tu selectionne la classe DLG et tu fait add function sur le butonn correspondant, il te recrera le corps de la fct, mais avec les messages associe. plus qu a remettre ton code dedans.
Marsh Posté le 01-04-2003 à 11:23:09
je veux pas paraitre defaitiste et tetu. Mais dans le classwizard, il n'y mes boutons et mes controles que dans l'appli, pas dans le dlg. Dans le dlg, ya meme pas les controles implantes par visual. en revanche, les fonctions qui controles les boutons auto-implantés sont, elles, dans le bon fichier (*dlg)...
Marsh Posté le 01-04-2003 à 11:27:40
Les ID des boutons on les trouves ds le classwizard sur tt les classes (sauf exceptions suivant comment declares mais ca c autre chose).
C est koi pour toi les controle implementes par visual ?
Idem c est koi pour toi les fonctions qui controle les bouton auto-implementes ?
Etant donne que VC++ ne fait rien niveau bouton sans que tu lui demande ...
Marsh Posté le 01-04-2003 à 11:36:46
je lui fait creer automatiquement une boite de dialogue. D'office, ya trois boutons (OK, Cancel, Help). Les fonctions gérant ces boutons sont déclarées dans TestDlg.cpp (c'est le fameux fichier de la boite de dialogue, étant donné que mon appli s'appelle Test).
Code :
|
Ca c'est donc le fichier dlg.
Dans le fichier Test.cpp (qui est l'appli), on a :
Code :
|
voila.
Si tu veux je peux meme t'envoyer un screen shot de mon classwzd...
Marsh Posté le 01-04-2003 à 12:07:01
Ben le code ds ton App t y touche pas il ne fait qu'init la Dlg principale et apres les traitement de retour au cas ou si tu as besoin.
Dans ton CTestDlg
ClassWizard > onglet message map > selectionner ds ClasseName le CTestDlg
Dans les objects ID (ou objet tt court jsais plus) tu as la liste de tes IDC et autre > tu double click sur le ID correspondant a ton bouton et il te creera la fonction ds le CTestDlg (ou sinon tu select et Add function)
Marsh Posté le 01-04-2003 à 12:09:58
Sinon le fait de deplacer la fonction de ton app a ton dlg c est ca qui te manqeuera
Code :
|
en considerant qu'avec ton code la au dessus tu as deja OnOk, OnCancel
Marsh Posté le 01-04-2003 à 10:46:32
Je commence à peine le MFC avec visual c++ 6.0
Je suis un adepte du vb pour l'interface, et VC ne m'est pas familier en matière de graphisme.
J'ai une erreur sur la fonction GetDlgItem, qui sert théoriquement à créer un pointeur sur un controle de ma boite de dialogue.
J'utilise la syntaxe suivante : (pour un controle edit, saisie d'un texte monoligne).
(CEdit *) PtrName = (CEdit *) GetDlgItem (CtrlID);
Mais ca ne fonctionne pas.
J'ai regardé le fichier afxwin.h qui contient la déclaration de cette fonction.
La syntaxe parait correcte, mais pourtant le compilateur me dit qu'il n'y a pas qu'un seul parametre a cette fonction.
Il demand en plus un objet de type HWND__ * .. Primo, c quoi cte bete ? Sur quoi je peux faire pointer cette connerie pour que mes controles réagissent enfin à ce que je veux leur faire...
Si qqn pouvait m'aider ca serait cool....
Merci d'avance