Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1641 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  MFC (C++)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

MFC (C++)

n°348828
banguy
Posté le 01-04-2003 à 10:46:32  profilanswer
 

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

mood
Publicité
Posté le 01-04-2003 à 10:46:32  profilanswer
 

n°348832
chrisbk
-
Posté le 01-04-2003 à 10:49:48  profilanswer
 

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

n°348836
banguy
Posté le 01-04-2003 à 10:54:34  profilanswer
 

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

n°348840
chrisbk
-
Posté le 01-04-2003 à 10:56:44  profilanswer
 

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

n°348847
banguy
Posté le 01-04-2003 à 11:02:52  profilanswer
 

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.

n°348874
chrisbk
-
Posté le 01-04-2003 à 11:16:42  profilanswer
 

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.

n°348879
VisualC++
J'va y penser ...
Posté le 01-04-2003 à 11:18:15  profilanswer
 

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.

n°348881
banguy
Posté le 01-04-2003 à 11:18:24  profilanswer
 

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.

n°348890
VisualC++
J'va y penser ...
Posté le 01-04-2003 à 11:20:55  profilanswer
 

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.

n°348893
banguy
Posté le 01-04-2003 à 11:23:09  profilanswer
 

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

mood
Publicité
Posté le 01-04-2003 à 11:23:09  profilanswer
 

n°348900
VisualC++
J'va y penser ...
Posté le 01-04-2003 à 11:27:40  profilanswer
 

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

n°348911
banguy
Posté le 01-04-2003 à 11:36:46  profilanswer
 

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

n°348962
VisualC++
J'va y penser ...
Posté le 01-04-2003 à 12:07:01  profilanswer
 

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)

n°348969
VisualC++
J'va y penser ...
Posté le 01-04-2003 à 12:09:58  profilanswer
 

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
n°349187
banguy
Posté le 01-04-2003 à 14:33:04  profilanswer
 

merci pour tout, ca marche enfin....


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  MFC (C++)

 

Sujets relatifs
[MFC] CList et class helpersou faire l'initialisation ? (MFC inside)
les evenements en MFCEvenement cliqué sur un bouton créé par programme (MFC) ?
[MFC VC6] Controle de rendu graphiqueCréation de fenêtre MFC...
MFC : les pointeurs sur Doc c'est de la m....?Visibilite des classes MFC
MFC pointeur sur CDocumentVariable globale en MFC?
Plus de sujets relatifs à : MFC (C++)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR