Programmation MFC
Transcription
Programmation MFC
12/04/2006 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 IFSA 2003, Istanbul 1 12/04/2006 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 IFSA 2003, Istanbul 2 12/04/2006 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 IFSA 2003, Istanbul 3 12/04/2006 Architecture Document/Vue ! Exemple " 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 IFSA 2003, Istanbul 4 12/04/2006 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 IFSA 2003, Istanbul 5 12/04/2006 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 IFSA 2003, Istanbul 6 12/04/2006 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 IFSA 2003, Istanbul 7 12/04/2006 Modèle/Document/Vue/Fenêtre cadre Objet Application Crée Objet Modèle de document Crée Crée Objet Document 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 IFSA 2003, Istanbul 8 12/04/2006 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 IFSA 2003, Istanbul 9 12/04/2006 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 IFSA 2003, Istanbul 10 12/04/2006 Relations entre classes Les classes fondamentales d’une application SDI CObject classes MFC CCmdTarget CWinThread CWnd CWinApp CFrameWnd CMyApp CMyWnd CDocTemplate CView CDocument CSingleDocTemplate 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 IFSA 2003, Istanbul 11 12/04/2006 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 IFSA 2003, Istanbul 12 12/04/2006 Exemple d’une application SDI ! Editeur de texte 25 Exemple d’une application SDI ! Editeur de texte (Etape 1) 26 IFSA 2003, Istanbul 13 12/04/2006 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 IFSA 2003, Istanbul 14 12/04/2006 Exemple d’une application SDI ! Editeur de texte (Etape 5) 29 Exemple d’une application SDI ! Editeur de texte (Etape 6) 30 IFSA 2003, Istanbul 15 12/04/2006 Exemple d’une application SDI ! Editeur de texte (Etape 6 - Suite) 31 Exemple d’une application SDI ! La sortie produite par AppWizard Affichage des classes Affichage des fichiers 32 IFSA 2003, Istanbul 16 12/04/2006 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 public: // Operations public: // le reste de la classe … }; 34 IFSA 2003, Istanbul 17 12/04/2006 La classe application ! La classe application de notre programme est dérivée de CWinApp class CEditeurTexteApp : public CWinApp { public: CEditeurTexteApp(); // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CEditeurTexteApp) public: 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 public: // Operations public: // Overrides // ClassWizard generated virtual function overrides public: virtual BOOL OnNewDocument(); virtual void Serialize(CArchive& ar); //Implementation // le reste de la classe … }; IFSA 2003, Istanbul 36 18 12/04/2006 La classe vue class CEditeurTexteView : public CEditView { protected: // create from serialization only CEditeurTexteView(); DECLARE_DYNCREATE(CEditeurTexteView) // Attributes public: CEditeurTexteDoc* GetDocument(); // Operations public: // Overrides // ClassWizard generated virtual function overrides public: virtual void OnDraw(CDC* pDC); virtual BOOL PreCreateWindow(CREATESTRUCT& cs); // le reste de la classe … }; IFSA 2003, Istanbul 37 19