Débutant Visual C++ avec MFC, qui peut répondre à quelques questions?

Débutant Visual C++ avec MFC, qui peut répondre à quelques questions? - Programmation

Marsh Posté le 07-02-2001 à 15:51:29    

Bonjour,
Je dois pondre un petit exécutable windows en utilisant
Visual et la MFC, ce que je n'ai jamais fait avant étant
habitué à Borland C++ Builder et sa VCL.
Ca fait deux plombe que je bidouille dans Visual, j'ai réussi à faire de jolies boîtes de dialogue avec l'éditeur de ressources de Visual et j'ai même réussi à associer du code à mes boutons...
 
MAIS:
- je ne comprend rien au code généré automatiquement (impossible
  de trouver une trace quelconque des contrôles de la boîte de
  dialogue dans le fichier d'en-tête de ma classe dialogue, y'a
  des macros partout,...)
- je n'arrive même pas à savoir comment récupérer le contenu d'un
  simple Edit
- je ne vois pas non plus très bien le rapport entre les diverses
  classes de la MFC et ce que génère l'éditeur de ressources.
 
Bref, je pédale dans la semoule!
 
Quelqu'un aurait-t-il l'extême obligeance de m'expliquer brièvement?

Reply

Marsh Posté le 07-02-2001 à 15:51:29   

Reply

Marsh Posté le 07-02-2001 à 19:06:15    

ok. J'ai pas trop le temps, mais je vais essayer de t'aider.
 
Tu places tes controls (EditBox, CheckBox, etc.) sur ta fenetre. Ca, tu dois deja l'avoir fait.  
Ensuite, il faut lier ces controls a des données. Pour ca, le plus simple est de se servir du classWizard (ctrl+W).  
Tu selectionnes l'onglet MemberVariables, la classe correspondant a ta boite de dialogue et t'as la liste des IDs qui s'affiche.
Tu selectionnes un par un les Ids auquels tu veux lier une variable et tu cliques sur AddVariable.
La, en fonction du controle et de ce que tu selectionnes dans la liste "Category", il te propose une liste de classes.
Par exemple, pour un EditBox, il va te proposer (entre autres) CString, int, UINT, WORD, DWORD, , etc. si t'as selectionne value ou CEdit si t'as selectionne control.
 
Si tu selectionnes Value, tu crees une donnée qui te permettra de manipuler les valeurs. (tu pourras fixer des bornes, etc.)
Si tu selectionne control, tu crees une donnée qui te permettra de manipuler ton control (Visible, invisible, grisé et autres options graphiques).
 
Note : tu peux creer plusieurs données pour un meme control.
 
Ensuite, dans la classe CDialog t'as une fonction UpdateData qui te permet de soit de charger les valeurs que tu as dans tes données vers les controles soit de rappatrier les valeurs de la fenetre vers les données. Pour en savoir plus, tu fais une recherche sur UpdateData dans l'aide.
 
 
Dernier point, si tu veux voir un joli diagramme de classe des MFC, tu peux chercher a Hierarchy chart dans l'aide.
 
Voila, j'espere que je t'ai un peu aide.  
 
A+

Reply

Marsh Posté le 07-02-2001 à 20:28:04    

un petit truc :
 
chaque controle depend de sa fenetre parent donc si tu "colles"  une edit box (CEdit ) dans une boite de dialogue tu peux recuperer le pointeur sur ce controle a partir du parent grace a la fonction CWnd::GetDlgItem(DWORD nID).
 
ex lorsque tu appuies sur un bouton , tu voudrais récupérer le texte dans l'edit box que t'as mis a coté. 2 solutions ;  
   - la premiere c'est celle mentionné dans le post du dessus.
   - le deuxieme :  
 
void CMyDialog::OnButtonCLick() {
  // recuperer le pointeur sur edit box d'id IDC_EDITBOX1
   CEdit *pEdit = (CEdit *)GetDlgItem(IDC_EDITBOX1);
   CString tmp;
   pEdit->GetWindowText(tmp);
 
   // dans tmp il y aura le texte qu'il y avait dans l'edit box
}
 
 
 
Autre chose en ce qui concerne les classes générées automatiquement par classwizard.
 
En fait du fait de l'architecture objet de MFC, tu crees un controle systematiquement en derivant une classe et en créant un "template" dans l'éditeur de ressources.
 
ex : lorsque tu crees une nouvelle boite de dialogue avec l'editeur de ressources, cela rajoute dans un fichier nom_appli.rc un "template" qui decrit comment est la boite de dialogue : sa taille,sa position ,ses propriétés de départ ..., et son ID (numéro unique à l'application)
IL faut aussi créer une classe qui dérive de CDialog et à laquelle tu passe l'ID de la boite de dialogue et c'est en créant une instance de cette classe que tu affichera la boite de dialogue ( Utiliser DoModal() pour une boite de dialogue modale cad la fonction rend la main lorsqu'on quitte la boite de dialogue, et utiliser Create pour une boite non modale )
 
 
J'espère que je t'ai un peu éclairé et sinon n'hésite pas à reposer des questions

Reply

Marsh Posté le 08-02-2001 à 10:32:42    

Merci beaucoup à tous les deux pour avoir éclairé ma lanterne!
J'ai essayé et je pense que je devrais pouvoir me dépatouiller
avec ça.
Ceci dit, puisque tu le proposes si gentiment Xilebo, j'en pofite
pour poser une autre question...
 
Comment peut-on associer un bitmap à un contrôle?
J'ai vu par exemple que pour les boutons on pouvait remplacer le
style "Default Button" par bitmap. J'ai cherché dans l'aide et
apparemment il faut créer une sorte de table de correspondance
entre les contrôles et les bitmaps... Mais comment faire?
 
Note: cette question est facultative, n'y répondez que si vous
n'avez rien de mieux à faire!

Reply

Marsh Posté le 10-02-2001 à 15:36:29    

Well, pour les images sur les boutons, c'est pas compliqué :
 
tout d'abord,  
- avec l'éditeur de resource (le truc pour dessiner les boites de dialogue), crée un bouton (on lui assigne dans l'example l'ID ID_MYBUTTON), dans ses propriétés, choisi Bitmap
- ajoute dans tes resources, une image bitmap (de préférence 256 couleurs), pour ça clique avec le bouton droit de la souris sur les resources de ton programme (dans l'onglet ResourceView de la fenetre Workspace) et choisi 'insert' puis 'bitmap'. On lui assigne ici l'ID ID_MYBITMAP.
- associe avec class wizard, un control à ton bouton, on l'appellera myButton (donc de type CButton)
- il faut ensuite implémenter le code. Le meilleur endroit pour le placer est dans la fonction CDialog::OnInitDialog. Tu peux la générer automatiquement avec classwizard.
 
ajoute ce code
 
myButton.SetBitmap( ::LoadBitmap(NULL, MAKEINTRESOURCE(ID_MYBITMAP)) ); // c'est tout
 
 
bref, le code tient sur une ligne. Merci les MFC (quand ca ne plante pas!)
 
Ok ?
si tu veux un programe d'example, dis le moi je peux te l'envoyer par mail.
 
A+

Reply

Marsh Posté le 12-02-2001 à 12:37:52    

Merci bien Dge!
Je viens d'essayer, ça ne marche pas mais ce doit être à cause d'une petite connerie...  
Je vois très bien le principe, je devrais pouvoir m'en sortir!
Merci encore!

Reply

Sujets relatifs:

Leave a Replay

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