MFC (C++)

MFC (C++) - C++ - Programmation

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

Reply

Marsh Posté le 01-04-2003 à 10:46:32   

Reply

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

Reply

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" );
 }
}

Reply

Marsh Posté le 01-04-2003 à 10:56:44    

Code :
  1. void CTestApp: nRegisterUser() 
  2. {
  3. // TODO: Add your control notification handler code here
  4. //action sur le bouton "enregistrer"
  5. CEdit * Login;
  6. CString UserName;
  7. Login = (CEdit *) GetDlgItem (IDC_EnterUser);
  8. Login->GetWindowText(UserName);
  9. if (UserName != "" )
  10. {
  11. CListBox * Liste;
  12.     Liste = (CListBox *) GetDlgItem(test, IDC_ListUsers);
  13. Liste->AddString(UserName);
  14. Login->SetWindowText("ok" );
  15. }
  16. }


 
avec les balises c mieux :D
 
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 ? :D
(c koi ta variable test ?)

Reply

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.

Reply

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.

Reply

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 :p
 
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.

Reply

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.

Reply

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.

Reply

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)...

Reply

Marsh Posté le 01-04-2003 à 11:23:09   

Reply

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 ...

Reply

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 :
  1. void CTestDlg::OnOK()
  2. {
  3. if (CanExit())
  4.  CDialog::OnOK();
  5. }
  6. void CTestDlg::OnCancel()
  7. {
  8. if (CanExit())
  9.  CDialog::OnCancel();
  10. }
  11. BOOL CTestDlg::CanExit()
  12. {
  13. // If the proxy object is still around, then the automation
  14. //  controller is still holding on to this application.  Leave
  15. //  the dialog around, but hide its UI.
  16. if (m_pAutoProxy != NULL)
  17. {
  18.  ShowWindow(SW_HIDE);
  19.  return FALSE;
  20. }
  21. return TRUE;
  22. }
  23. void CTestDlg::OnHelp()
  24. {
  25. }


 
Ca c'est donc le fichier dlg.
Dans le fichier Test.cpp (qui est l'appli), on a :

Code :
  1. CTestDlg dlg;
  2. m_pMainWnd = &dlg;
  3. int nResponse = dlg.DoModal();
  4. if (nResponse == IDOK)
  5. {
  6.  // TODO: Place code here to handle when the dialog is
  7.  //  dismissed with OK
  8. }
  9. else if (nResponse == IDCANCEL)
  10. {
  11.  // TODO: Place code here to handle when the dialog is
  12.  //  dismissed with Cancel
  13. }
  14. // Since the dialog has been closed, return FALSE so that we exit the
  15. //  application, rather than start the application's message pump.
  16. return FALSE;
  17. }


 
voila.  
 
 
Si tu veux je peux meme t'envoyer un screen shot de mon classwzd...

Reply

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)

Reply

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 :
  1. ds le .h
  2. //{{AFX_MSG(CTestDlg)
  3. afx_msg void OnTaFonction();
  4. //}}AFX_MSG
  5. DECLARE_MESSAGE_MAP()
  6. ds le .cpp
  7. BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
  8. //{{AFX_MSG_MAP(CTestDlg)
  9. ON_BN_CLICKED(IDJESAISPASTONNOM, OnTaFonction)
  10. //}}AFX_MSG_MAP
  11. END_MESSAGE_MAP()


 
en considerant qu'avec ton code la au dessus tu as deja OnOk, OnCancel


Message édité par VisualC++ le 01-04-2003 à 12:10:12
Reply

Marsh Posté le 01-04-2003 à 14:33:04    

merci pour tout, ca marche enfin....

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed