Exemple de codage C++ Programme FtpTree Rôle Permettre la connexion et la navigation à un serveur FTP. Raison - Faire comprendre les principes de base de la programmation Windows à l aide de MFC. - Montrer l avantage de la programmation orientée objet. - La conception est fort simple. - Montrer les subtilités de la programmation MFC: La gestion des événements Le découplage entre les classes MFC et les éléments de l interface graphique. Le rôle pratique des fonctions virtuelles GPA777 (Codage C++) 1 Le fonctionnement du programme Connexion: Entrer une adresse FTP puis la touche Enter ou cliquer sur Aller Connexion: Entrer le nom d utilisateur et le mot de passe ou réaliser une connexion anonyme GPA777 (Codage C++) 2
Le fonctionnement du programme Navigation: Cliquer sur le symbole +(-) ou double-cliquer sur les dossiers Utilisation: Sélectionner Ranger pour mettre le programme sous forme iconique dans le taskbar GPA777 (Codage C++) 3 Diagramme des classes FtpAuthentification CFTPTREEApp CFTPTREEDlg CMyTreeCtrl CToolTip MyInternetSession CFtpConnexion FtpAuthentification: Panneau de dialogue pour accepter nom d utilisateur, mot de passe et accès anonyme. CFTPTREEApp: Application Windows utilisant un panneau de dialogue. CMyTreeCtrl: Vue arborescente pour la présentation des répertoires et fichiers. MyInternetSession: Environnement de séance de travail FTP. CToolTip: Petits rectangles jaunes contenant un texte explicatif. CFtpConnexion: Représente une connexion particulière avec un serveur FTP. GPA777 (Codage C++) 4
1) Générer le projet. Utiliser l option «dialog based». GPA777 (Codage C++) 5 2) Créer l interface principale avec l éditeur de ressource Un bouton qui sera associé à la classe CButton Une vue arborescente qui sera associée à la classe CTreeCtrl Une zone d édition + liste déroulante qui seront associées à la classe CComboBox Note: Les classe CFTPTREEApp et CFTPTREEDlg sont générées automatiquement par AppWizard de VC++. CFTPTREEApp représente l application Windows et CFTPTREEDlg représente ce panneau de dialogue. GPA777 (Codage C++) 6
3) Créer un menu pour l interface principale à l aide de l éditeur de ressource L identificateur de ce menu est IDR_MENU_FTPTREE 4) Assigner ce menu à l interface principale GPA777 (Codage C++) 7 5) Pour pouvoir intercepter les événements de la vue arborescente (voir la navigation page 3), nous devons créer une classe dérivée de CTreeCtrl. Cette classe portera le nom de MyTreeCtrl. Elle sera dérivée de CTreeCtrl. Il y aura génération de deux fichiers. Le MyTreeCtrl.h et le MyTreeCtrl.cpp seront ajoutés automatiquement dans le projet. GPA777 (Codage C++) 8
6) Ajouter la classe CButton du bouton Aller dans la classe CFTPTREEDlg à l aide de ClassWizard onglet «Member variables». Faire de même pour le Combo box et pour la vue arborescente. Nous avons réalisé la composition des classes Cbutton, CComboBox et CMyTreeCtrl dans la classe CFTPTREEDlg!!! GPA777 (Codage C++) 9 6) Ajouter à la main dans la section protégée ou privée de CFTTREEDlg un objet pointeur de classe CFtpConnexion, un objet pointeur de classe CInternetSession et un objet pointeur de classe CToolTip. La classe CInternetSession est le point de départ d une séance de travail avec un serveur FTP. Nous avons réalisé l agrégation des classes CFTPTREEDlg!!! Voici un affichage de ToolTip. GPA777 (Codage C++) 10
7) Créer le panneau de dialogue pour la validation de la connexion FTP. 8) Associer les contrôle CButton et CEdit à ce panneau de dialogue à l aide de ClassWizrd onglet «Member variables». Les fichiers sources seront générés automatiquement dans le projet. Note: La case à cocher Connexion anonyme est également associée à un objet de la classe CButton (voir les propriétés de cet élément graphique dans l éditeur de ressource). GPA777 (Codage C++) 11 9) Initialiser les objets dans la fonction membre OnInitDialog() de la classe CFTPTREEDlg. Cette fonction membre est exécutée juste avant l affichage du panneau de dialogue principal. Donc, c est le moment propice pour initialiser les objets associés aux éléments d interface graphique et les variables membres de la classe CFTTREEDlg. 10) Établir les événements à gérer: A) ID_BROWSE_SITE quand l utilisateur clique sur le bouton Aller. B) ID_ACTION_ALLER quand l utilisateur sélectionne l option Aller du menu Action. C) ID_ACTION_QUITTER quand l utilisateur sélectionne l option Quitter du menu Action. GPA777 (Codage C++) 12
10) Établir les événements à gérer: D) ID_ACTION_RANGER quand l utilisateur clique sur l option Ranger du menu Action. E) TRAY_CALLBACK_MSG quand l utilisateur clique le bouton droit de l icône de l application rangée dans la zone de notification du taskbar. F) ID_AIDE_APROPOSDE quand l utilisateur clique sur l option A Propos du menu flottant associé à l icône de l application rangée dans la zone de notification du taskbar. G) ID_TRAYPOPUP_MAXIMISEFTPTREE quand l utilisateur clique sur Maximiser FtpTree du menu flottant associé à l icône de l application rangée dans la zone de notification du taskbar. H) ID_TRAYPOPUP_MINIMISERFTPTREE quand l utilisateur clique sur Minimiser FtpTree du menu flottant associé à l icône de l application rangée dans la zone de notification du taskbar. I) TVN_ITEMEXPANDING quand l utilisateur clique sur le symbole +(-) double-clique sur un dossier de la vue arborescente. GPA777 (Codage C++) 13 Notes de programmation Comment initié une séance de travail FTP à l aide de MFC. Dans la fonction OnInitDialog de la classe CFTPTREEDlg: CString NomApp, Msg; if (!NomApp.LoadString(IDS_APPNAME))// Le nom de l'agent est le nom de NomApp = _T("ParanoSoft"); // l application ou "ParanoSoft" // Créer une sénace Internet avec transfert asynchrone des données m_pinetsession = new MyInternetSession(NomApp, &os); m_pinetsession->enablestatuscallback(true); On crée une session Internet à l aide de la classe MyInternetSession. On utilise la fonction membre EnableStatusCallBack() pour indiquer qu il est nécessaire de rapporter les requêtes Internet à l objet de la classe. GPA777 (Codage C++) 14
Notes de programmation Comment créer une connexion FTP?. try { /* Est-ce une connexion anonyme? */ if (AuthDlg.m_AnonConnect) m_pftpconnection = m_pinetsession->getftpconnection(strservername); else m_pftpconnection = m_pinetsession->getftpconnection(strservername, AuthDlg.m_Username, AuthDlg.m_Passwd); } catch (CInternetException* pex) { // catch errors from WinINet TCHAR szerr[1024]; if (pex->geterrormessage(szerr, 1024)) { os << szerr << endl; AfxMessageBox(szErr, MB_OK); } Cette routine est réalisée à else { l intérieur de la fonction CString Msg; Msg.LoadString(IDS_EXCEPTION); membre qui gère l événement os << Msg << endl; AfxMessageBox(Msg, MB_OK); provoqué par le clique sur le } bouton Aller. pex->delete(); m_pftpconnection = NULL; 15 } // fin de catch