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