Programmation MFC Renaud PÉTERI Dahbia SEMANI-DELMI 1 Introduction aux MFC! Programmation Windows " La fonction WinMain() " La fonction WndProc()! Appels de l API Windows (Interface de programmation d applications Windows) " Ecriture des applications parfois compliquée car - Les fonctions de l API sont très nombreuses - Plusieurs types de messages - Durée de vie des variables -> utilisation de nombreuses variables globales! Utilisation des MFC (Microsoft Foundation Classes) Développement dans un environnement de programmation Orientée Objet 2
MFC! MFC : Classes d une bibliothèque de programmation qui encapsule l API Windows " Utilisation plus facile de l API " Développement plus rapide et plus efficace! Elles automatisent de nombreuses actions! Elles masquent certaines opérations de bas niveau # " L accès direct à la boucle de gestion de message n est plus possible " Chaque message que l on souhaite traiter déclenche un callback! Les appels de l API sont remplacés par des appels aux fonctions membres (méthodes) des objets crées à partir des classes MFC 3 Les classes MFC! Plusieurs centaines de classes MFC! Utilisation directe de certaines classes MFC! Utilisation de classes dérivées de certaines classes MFC! Exemples de classes " Classe simple, CPoint : encapsule un objet point (coordonnées x,y) Addition, conversion, " Classe complexe, CWnd : encapsule les fonctionnalités d une fenêtre! Convention " Les classes MFC portent des noms qui commencent par C, comme CPoint ou CWnd " Les données membres d'une classe MFC commencent par le préfixe m_ 4
Structure d un programme MFC! Un programme MFC repose principalement sur deux classes " La classe d application : CWinApp Lancement, initialisation, exécution et fermeture de l application " La classe de fenêtre : CFrameWnd Création et gestion d une fenêtre (principale) de l application! Les objets de ces classes ont un rôle réduit au minimum! Générés le plus souvent par l assistant (Wizard) 5 Architecture Document/Vue! Les MFC sont essentiellement destinée au développement d applications disposant d interface graphique! Considérer les données brutes de l application et leur visualisation comme des «objets» différents! Besoin d avoir plusieurs visualisations ou représentations des mêmes données! Principe de l architecture Document/Vue Séparer le traitement et la manipulation des données de la représentation de celles-ci. 6
! Exemple Architecture Document/Vue " Document : données correspondant à des formules mathématiques dans un tableur " Vues Vue édition Vue résultat Vue graphique 7 Le concept Document/Vue! Encapsuler les données brutes dans un objet de la classe CDocument (ou classe dérivée de CDocument)! Encapsuler les fonctionnalités d affichage dans un objet de la classe CView (ou classe dérivée de CView)! Les méthodes de la classe CDocument manipulent les données brutes Chargement depuis un fichier, ajout/suppression des données, tri, etc.! Les méthodes de la classe CView se chargent de la visualisation des données Fonctions graphiques, mise à l échelle, couleurs, etc. 8
Documents! Un document désigne l ensemble des données d une application (données brutes)! Recouvre des données de natures diverses " du texte ou données d un tableur " données relatives à un jeu " connexion à une source de données distante (interface SQL) " etc.! Les données d un document doivent être privées et l accès se fait via des méthodes publiques 9 Interfaces de Document! Les applications SDI (Single Document Interface) " Les programmes ne peuvent ouvrir qu un seul document à la fois " Exemple d une application SDI : WordPad! Les applications MDI (Multiple Document Interface) " Les programmes peuvent ouvrir plusieurs documents à la fois " Les documents ouverts peuvent être du même type ou de types différents " Exemples d applications MDI : Microsoft Word, Microsoft Excel 10
Vues! Proposent un mécanisme permettant d afficher tout ou partie des données stockées dans un document! Définissent le mode d affichage dans une fenêtre! Définissent le mode de communication avec l utilisateur 11 Fenêtre cadre! La vue d un document s affiche dans une fenêtre cadre (Frame Window)! La fenêtre de vue occupe la zone client d une fenêtre cadre! Les fenêtres cadre qui hébergent les vues sont des objets de la classe " CFrameWnd, pour les applications SDI " CMDIChildWnd, pour les applications MDI! À un document on peut associer plusieurs vues " Plusieurs présentations possibles des mêmes données d un document! Une vue n est associée qu à un seul document 12
Documents, Vue et fenêtres cadre! Une vue affiche parfois une partie seulement des données Données Objet Vue Objet Document Objet Fenêtre cadre 13 Modèles de Document! Gèrent la coordination entre les documents, les vues et les fenêtres cadre! Un modèle pour chaque type de document! Un modèle suffit pour gérer des documents d un même type! En général " une application crée un modèle de document " qui coordonne l affichage des données d un document " dans une vue " à l intérieur d une fenêtre cadre 14
Modèle/Document/Vue/Fenêtre cadre Objet Application Crée Objet Modèle de document Crée Objet Document Crée Fenêtre cadre Crée Objet Vue Pointe sur 15 Classes de modèles de document! La classe CDocTemplate permet de définir les modèles de document! Deux classes dérivées " Applications SDI : la classe CSingleDocTemplate " Applications MDI : la classe CMultiDocTemplate 16
Sérialisation! Permet la sauvegarde et la restauration binaire d objets dans (ou à partir) d un fichier! Une classe sérialisable contient dans sa définition la fonction virtual void Serialize(CArchive& ar); " Appelée pour effectuer les opérations d entrées/sorties sur les membres données de la classe " L objet de type CArchive détermine s il s agit de l entrée ou de la sortie! La Classe CDocument contient dans sa définition les fonctionnalités de sérialisation 17 Création dynamique des objets! Programme Document/Vue en cours d exécution # création dynamique des objets document, vue et fenêtre cadre! Utilisation de macros de création dynamique dans les classes dérivée de CFrameWnd, CDocument, CView 18
Macros de création dynamique! DECLARE_DYNCREATE(Nom_classe) dans la déclaration de classe (fichier.h)! IMPLEMENT_DYNCREATE(Nom_classe, Nom_classe_base) dans le fichier.cpp! Création dynamique d un objet d une classe en cours d exécution RUNTIME_CLASS(Nom_classe)->CreateObject(); 19 Programmes Document/Vue! Une application Document/Vue contient au moins quatre classes dérivées des classes " CWinApp " CFrameWnd " CDocument " CView! Les classes sont définies dans des fichiers séparés de déclaration (.h) et d implémentation (.cpp)! Plusieurs variantes des classe de «vue» apportent des fonctionnalités prédéfinies (ex. CEditView) 20
Relations entre classes Les classes fondamentales d une application SDI classes MFC CObject CCmdTarget CWinThread CWnd CDocTemplate CDocument CWinApp CFrameWnd CView CSingleDocTemplate CMyApp CMyWnd CMyView CMyDoc classes de vos applications 21 Quelques fonctions utiles! Fonctions de dessin : la classe CDC (classes dérivées CPaintDC, CCleintDC, CWindowDC)! Fonctions : la classe CWnd (classes dérivées CFrameWnd, CView)! Les fonctions relatives aux menus : la classe CMenu! Fonctions relatives aux boites de dialogue : la classe CDialog! Les contrôles et les classes MFC correspondantes Bouton Zone de texte Zone de liste Barre de défilement CButton CEdit CListBox CScrollBar22 22
L assistant AppWizard! Crée le squelette complet d un programme Document/Vue! Définit automatiquement les classes nécessaires CWinApp, CFrameWnd, CDocument, CView! Indique l endroit où vous devez insérer le code spécifique à l application 23 L assistant ClassWizard! Permet d étendre et de personnaliser les classes de vos programmes! Permet de créer des nouvelles classes ou de dériver des classes à partir des classes MFC! Ajoute de nouveaux membres (variables ou fonctions) aux classes! Génère les squelettes de code des callbacks correspondant aux messages auxquels le programme souhaite réagir 24
Exemple d une application SDI! Editeur de texte 25 Exemple d une application SDI! Editeur de texte (Etape 1) 26
Exemple d une application SDI! Editeur de texte (Etape 2)! Editeur de texte (Etape 3) 27 Exemple d une application SDI! Editeur de texte (Etape 4) 28
Exemple d une application SDI! Editeur de texte (Etape 5) 29 Exemple d une application SDI! Editeur de texte (Etape 6) 30
Exemple d une application SDI! Editeur de texte (Etape 6 - Suite) 31 Exemple d une application SDI! La sortie produite par AppWizard Affichage des fichiers Affichage des classes 32
Exemple d une application SDI! Exécution du programme! Toutes les commandes des menus Fichier, Edition et Affichage sont parfaitement opérationnelles 33 La fenêtre cadre! La fenêtre cadre de l application du programme SDI est un objet de la classe CFrameWnd class CMainFrame : public CFrameWnd { protected: // create from serialization only CMainFrame(); DECLARE_DYNCREATE(CMainFrame) // Attributes // Operations // le reste de la classe }; 34
La classe application! La classe application de notre programme est dérivée de CWinApp class CEditeurTexteApp : public CWinApp { CEditeurTexteApp(); // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CEditeurTexteApp) virtual BOOL InitInstance(); //}}AFX_VIRTUAL // Implementation // le reste de la classe }; 35 La classe document class CEditeurTexteDoc : public CDocument { protected: // create from serialization only CEditeurTexteDoc(); DECLARE_DYNCREATE(CEditeurTexteDoc) // Attributes // Operations // Overrides // ClassWizard generated virtual function overrides virtual BOOL OnNewDocument(); virtual void Serialize(CArchive& ar); //Implementation // le reste de la classe }; 36
La classe vue class CEditeurTexteView : public CEditView { protected: // create from serialization only CEditeurTexteView(); DECLARE_DYNCREATE(CEditeurTexteView) // Attributes CEditeurTexteDoc* GetDocument(); // Operations // Overrides // ClassWizard generated virtual function overrides virtual void OnDraw(CDC* pdc); virtual BOOL PreCreateWindow(CREATESTRUCT& cs); // le reste de la classe }; 37