1
Plan - IHM
Etude du développement d’applications avec une interface graphique (de type Windows) et en Visual C++
Etude approfondie des MFC (Microsoft Fondation Classes)
Développement d’applications à l’aide de l’assistant
Génération automatique de squelettes d’applications
2
Introduction Le modèle WIMP
Les interfaces utilisateur graphiques ou (GUI) sont aussi appelées : Look and Feel que l'on peut traduire par présentation et comportement.
Elles servent à permettre le dialogue entre l'Homme et la Machine (IHM).
Les conditions de ce dialogue définissent l'ergonomie de l'application.
Les GUI sont basées sur le concept de métaphore c'est-à-dire un ensemble d'agrégats qui permettent de faire le lien entre le bureau et l'écran
Cet ensemble est appelé le WIMP (Windows, Icons, Menus, Pointer).
Les fenêtres, icônes, menus et souris sont appelés objets graphiques :
les icônes sont des fonctionnalités disponibles pour l'utilisateur,
la souris est une métaphore de la main,
le menu permet de passer des commandes.
3
Introduction
Le succès de Windows …
L’ “engouement” pour la programmation Windows s’explique par plusieurs raisons :
L’importance de développer des interfaces utilisateur graphiques conviviales.
Windows fournit un “quasi-standard” d’interface graphique et permet donc à un utilisateur de “prendre en main” très rapidement une application et son environnement.
Notons l’importance mais aussi la complexité du développement d’interfaces graphiques.
Windows est une interface complexe et touffue qui propose selon le mode de comptage entre 750 et 1250 appels de fonctions possibles (API natif de Windows (API = Application Programming Interface));
La programmation d’application Windows directement avec les fonctions de l’API natif est une tâche ardue, aussi les concepteurs d’environnement de programmation ont développé différents outils (bibliothèques, ...) qui permettent de simplifier ce travail.
La bibliothèque MFC (Microsoft Foundation Classes) de Visual C++ est une bibliothèque de classes d’objets qui encapsule dans des objets de plus haut niveau les fonctionnalités de l’API natif.
4
Introduction
Les points « forts » de Windows
La programmation pilotée par message
Programmation évènementielle
Un évènement est une action réalisée par l’utilisateur sur l’interface
Windows doit être capable de récupérer les informations liées à l’évènement
Transmettre cette information à l’application concernée pour déclencher le traitement de cet évènement
5
Introduction
Les points « forts » de Windows
Les sorties graphiques
Tous les objets créés par Windows sont graphiques
Les droites, les cercles, les boîtes sont traités comme des objets graphiques et sont créés à l'aide de l'interface graphique (GDI : Graphic Device Interface).
Æ indépendance des traitements vis-à-vis des périphériques
GDI reconnaît quatre types de systèmes d’affichage : l’écran, les périphériques de recopie d’écran
(imprimantes, traceurs), les bitmaps et les métafichiers.
Ces 2 derniers sont vus comme des pseudo-périphériques (stockage d’image en mémoire ou sur disque, partage d’images).
Æl’homogénéité des sorties graphiques est un point fort de Windows
6
Introduction
Les points « forts » de Windows
Les objets graphiques
Windows supporte un certain nombre d'objets consacrés au support de l'interface utilisateur :
fenêtres, icônes, boîtes de dialogue, ...
Possibilité pour une application d'utiliser ces objets et de les personnaliser
Æ diminution du coût de développement
7
Principe de programmation Windows
Eléments d’une fenêtre
Barre de titre Barre de menus Barre à outils Bouton de réduction Bouton d’agrandissement Bouton de fermeture
Barre d’état
Fenêtre parent Fenêtre enfant
Poignée de redimensionnement Zone client de la
fenêtre enfant
8
Principe de programmation Windows Structure d’un programme Windows
Sous sa forme la plus réduite un programme Windows, écrit uniquement avec l’API Windows comporte, 2 fonctions :
La fonction WinMain() qui est l’équivalent de la fonction main() d’un programme console.
La fonction WinProc() que Windows appelle pour traiter les messages destinés à l’application
Ces deux fonctions composent un programme complet mais elles ne sont pas directement liées. C’est Windows qui gère les appels à ces deux fonctions.
WINDOWS API Windows
WinMain() WinProc()
Début du programme Messages
Programme
9
Principe de programmation Windows Structure d’un programme Windows
La fonction WinMain()
La boucle de messages
while (Getmessage(&msg, NULL, 0,0)) { TanslateMessage( &msg);
DispatchMessage(&msg);
}
Cette boucle fonctionne tant que les messages reçus ne sont pas un message de terminaison de l'application.
GetMessage extrait un message de la file d’attente,
TranslateMessage convertit le message extrait, si nécessaire
DispatchMessage demande à Windows d’appeler la fonction WinProc() dans l’application pour traiter le message
10
Principe de programmation Windows Structure d’un programme Windows
Taxonomie des messages
Il existe environ 250 types de messages prédéfinis dans Windows. On peut distinguer 8 catégories principales de messages dont
les messages hardware : entrées d’informations avec le clavier ou la souris
messages de la souris
WM_LBUTTONDOWN, WM_LBUTTONUP, …
messages du clavier
WM_CHAR, WM_KEYDOWN
messages de maintenance des fenêtres :
notification, demande d’action (WM_CLOSE, WM_PAINT, ...)
les messages de maintenance de l’interface utilisateur concernant les menus
WM_COMMAND,WM_INITMENU, …
les messages de terminaison (WM_QUIT, ...)
les messages privés (pour fenêtres spécifiques : boîtes à liste, bouton, ...)
les messages de notification concernant les ressources système (WM_TIMECHANGE,...)
Principe de programmation Windows Structure d’un programme Windows
Fonctions de traitement des messages
Le décodage des messages est effectué à l’aide d’un instruction conditionnelle multiple dans la fonction WinProc()
Exemple
switch (message)
{ case WM_LBUTTONUP : …….; break;
case WM_PAINT : ……….; break;
………..
default : …….
}
Principe de programmation Windows Structure d’un programme Windows
Bilan
Principe de fonctionnement d’un programme Windows uniquement avec l’API natif
Tâche ardue et complexe
API Windows comporte plus d’un millier de fonctions qui permettent d’assurer les services et la communication nécessaires à la création d’une application Windows.
l’API Windows et Visual C++
L’API n’est pas spécialement conçue pour le C++ (antérieure à C++ et l’approche objet)
Les MFC (Microsoft Foundation Classes) constituent un
ensemble de classes qui intègrent l’API Windows.
13
Principe de programmation Windows Architecture de Windows
Windows repose sur trois bibliothèques :
KERNEL, USER, GDI
KERNEL gère le support à bas niveau
des fichiers d'entrées/sorties,
de la mémoire,
du chargement des programmes,
des opérations classiques d'un OS (Operating System)
USER et GDI font appel aux services de KERNEL
USER s'occupe de la création et de la gestion des objets d'interface utilisateur :
fenêtres, menus, boîtes de dialogues, curseurs, icônes
Æ
l'objet primordial est la fenêtre
14
Principe de programmation Windows Architecture de Windows
GDI : Graphical Device Interface
assure l'indépendance vis-à-vis des périphériques
gère les dessins de fenêtres, les menus, les boîtes de dialogue, etc ...
USER utilise les services de GDI pour les tracés de ses objets Modules
Mémoire
Fichiers
Pointeurs Curseurs
Fenêtre
Icônes Menus
palette
plume pinceau DC région
police
bitmap
KERNEL USER GDI
15
Aperçu de la hiérarchie des classes MFC
CObject
CCmdTarget
CWinThread
CWinApp
CWnd
CFrameWnd
CMDIChidWnd
CMDIFrameWnd
CView
CDialog
CDocument
CDocTemplate
CMultiDocTemplate
CSingleTemplate
CGdiObject
CDC
CClientDC
CPaintDC
16
Aperçu de la hiérarchie des classes MFC
La classe CWnd représente les fenêtres
CFrameWnd les fenêtres « cadre » : fenêtres principales des applications.
CDialog concerne les fenêtres des boîtes de dialogue.
CView concerne les fenêtres de « présentation » d’un document
La classe CWinApp comporte toutes les fonctionnalités pour l'écriture d'une application :
initialisation de l'application, création de la fenêtre principale, traitement de la boucle de message, fin de l'application, nettoyage à la sortie de l'application.
La classe CDocument contient des fonctionnalités simplifiant la sauvegarde des donnée (manipulation d’un document).
La classe CGdiObject contient tous les objets de dessin comme le pinceau, le crayon, les fontes de dessin
La classe CDC concerne le contexte de périphérique avec les classes CClientDC et CPaintDC.
17
Relations entre les MFC et l’API Windows
1 . C la s se s d e s M F C
T W in T h re a d C W in A p p
C W n d
C F ra m e W n d C D ia lo g C C o n tro lB a r
C G d iO b je c t C D C
2 . O b je ts s ys tè m e W in A P I M o d u le s
M é m o ire F ic h ie rs
P o in te u rs C u rse u rs F e n ê tre Ic ô n e s M e n u s
p a le tte
p lu m e p in c e a u D C ré g io n p o lic e b itm a p
K E R N E L U S E R G D I
C O b je c t
18
Création d’une application avec l’assistant
L'assistant de Visual C++ permet le création de squelettes de programmes
qui peuvent ensuite être complétés par le programmeur pour ajouter des fonctionnalités.
A la création d'un nouveau projet, on peut par exemple choisir entre plusieurs types de projets et notamment, un type MFC :
Avec différents modèles comme
Application MFC
MFC DLL
Contrôle Active X MFC
En fonction de l'option choisie, le squelette de programme fournit une trame plus ou moins riche
Ce squelette doit être complété pour développer une application personnalisée.
19
Création d’une application avec l’assistant Le concept de document/vue
La structure d’un programme MFC peut intègrer deux entités : le document et la vue.
Le document comporte l’ensemble des données de l’application.
Un document est représenté par un objet d’une classe dérivée de la classe CDocument
qui a été enrichie avec les données propres de l’application.
MFC propose alors un ensemble de fonctionnalités
qui permettent de gérer facilement le document : enregistrement sur disque et chargement.
20
Création d’une application avec l’assistant Le concept de document/vue
Interfaces de document
Un programme peut traiter un seul ou plusieurs documents à la fois.
MFC propose deux types d’interface
L’interface pour la gestion d’un seul document
Single Document Interface (SDI)
L’interface pour la gestion de plusieurs documents
Multiple Document Interface (MDI)
21
Création d’une application avec l’assistant Le concept de document/vue
La vue concerne toujours un document particulier.
Elle permet de visualiser tout ou partie des données stockées dans un document.
La vue occupe la zone client d’une fenêtre cadre.
Plusieurs vues peuvent être associées à un document.
Séparation des données et de la «présentation » des données
22
Création d’une application avec l’assistant Le concept de document/vue
Liens les objets d’une application MFC
Objet Application SDI
Objet Modèle de Document
Fenêtre cadre Objet Document
Objet Vue
pointe sur création
Création d’une application avec l’assistant Création d’une application avec l’assistant
1
èreétape
25
Création d’une application avec l’assistant 2
èmeétape
26
Création d’une application avec l’assistant 3
èmeétape
27
Création d’une application avec l’assistant 4
èmeétape
28
Création d’une application avec l’assistant 5
èmeétape
29
Création d’une application avec l’assistant 6
èmeétape
30
Création d’une application avec AppWizard Récapitulatif classesgénérées
Classes
CMainFrame
CIHMApp
CIHMDoc
CIHMView
31
Création d’une application avec l’assistant Exécution du programme généré
Menu par défaut
Barre à outils
Barre d’état
Caractéristiques classiques des fenêtres
Boutons fermeture, agrandissement, réduction
32
Création d’une application avec AppWizard Classes générées par AppWizard
IHM.h IHM.cpp CDialog
CAboutDlg Fenêtre de
dialogue
IHMVw.h IHMVw.cpp CView
CIHMView Vue
IHMDoc.h IHMDoc.cpp CDocument
CIHMDoc Document
MainFrm.h MainFrm.cpp CFrameWnd
CMainFrame Fenêtre cadre
Caché dans les
fichiers source MFC
CDocTemplate CSingleDoc
Template Modèle de
Document
IHM.h IHM.cpp CWinApp
CIHMApp Application
Fichiers Classe de base MFC Classe
Objet
33
Le squelette de l’application – L’objet Application
Détail de la classe CIHMApp (IHM.h)
class CIHMApp : public CWinApp {
public:
/* constructeur */
CIHMApp();
/* surcharge de la méthode InitInstance */
virtual BOOL InitInstance();
/* méthode d'affichage d'un message pour l'option Aide, A propos de IHM du menu */
afx_msg void OnAppAbout();
/* déclaration d'une table de message */
DECLARE_MESSAGE_MAP() };
34
Le squelette de l’application – L’objet Application
Le constructeur
CIHMApp::CIHMApp() {
}
Par défaut, le constructeur ne contient aucun code, il peut être complété par le programmeur.
Le squelette de l’application – L’objet Application
La méthode InitInstance
BOOL CIHMApp::InitInstance()
{ SetRegistryKey(_T("Applications locales générées par AppWizard"));
LoadStdProfileSettings(4);
/* Création du Document Template qui va avec la création de la fenêtre cadre, d'un document et d'une vue surle document. */
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME, RUNTIME_CLASS(CIHMDoc), RUNTIME_CLASS(CMainFrame RUNTIME_CLASS(CIHMView));
/* IDR_MAINFRAME est un ID pour les ressources de l'application */
/*RUNTIME_CLASS est une macro instruction utilisée pour créer l'objet spécifié en paramètre */
AddDocTemplate(pDocTemplate);
/* stocke un pointeur sur le document template dans l'objet application */
/* affichage de la fenêtre et envoi de son premier message WW_PAINT */
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}
Le squelette de l’application
Le squelette d'application généré par AppWizard propose dans le menu principal les options Fichier, Edition, Affichage et Aide (?).
Le menu Fichier dispose d'un sous-menu classique :
Nouveau, Ouvrir, Enregistrer, Enregistrer sous,
Imprimer, Aperçu avant Impression, Configuration de l'impression.
Le menu Edition comporte Annuler, Couper, Copier et Coller.
Le menu Affichage propose l'affichage ou non par coche de la barre à outils et de la barre d'état.
L'Aide propose un sous menu « A propos de IHM » qui affiche une boîte de dialogue avec un message.
Lorsque l'utilisateur sélectionne une des options des menus, un message de type WM_COMMAND indiquant la commande activée.
La commande activée est identifiée grâce à un numéro.
La table des messages est chargée de faire le lien entre la commande activée (avec son identifiant) et le gestionnaire (la méthode) à exécuter.
37
Le squelette de l’application La table des messages
BEGIN_MESSAGE_MAP(CIHMApp, CWinApp)
ON_COMMAND(ID_APP_ABOUT, &CIHMApp::OnAppAbout) // Commandes de fichier standard
ON_COMMAND(ID_FILE_NEW, &CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, &CWinApp::OnFileOpen) // Commande standard de configuration de l'impression
ON_COMMAND(ID_FILE_PRINT_SETUP, &CWinApp::OnFilePrintSetup) END_MESSAGE_MAP()
Les messages spécifiés dans cette table sont :
l'option Aide, A propos de IHM avec la commande OnAppAbout qui est une méthode spécifiée dans la classe.
l'option Fichier, Nouveauavec la méthode standard héritée de CWinApp qui est OnFileNew.
l'option Fichier, Ouvriravec la méthode standard héritée de CWinApp qui est OnFileOpen.
l'option Fichier, Configurationde l'impression avec la méthode standard héritée de CWinApp qui est OnFilePrintSetUp.
38
Le squelette de l’application Le routage des messages
Lorsque l’utilisateur active l'option Aide, A propos de , Windows envoie un message WM_COMMAND spécifiant la commande activée ici ID_APP_ABOUT.
La boucle de message récupère ce message et le traite.
Un message WM_COMMAND peut en réalité être traité soit dans le document, la vue ou l’application.
Le gestionnaire de message consulte la table des messages pour savoir si un gestionnaire de ce message a été défini.
Si c'est le cas la méthode correspondante est invoquée.
39
Le squelette de l’application
La déclaration de l’objet application
// The one and only CIHMApp object
CIHMApp theApp;
La méthode OnAppAbout est la suivante :
void CIHMApp::OnAppAbout() {
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}
Elle déclare un objet de type CAboutDlg et lance son exécution dans une fenêtre de dialogue de type modal.
La classe CAboutDlg est définie dans le fichier IHM.cpp.
40
Le squelette de l’application L’objet Fenêtre Cadre
La classe CMainFrame (MainFrm.h)
class CMainFrame : public CFrameWnd
{protected:
/* attributs pour la barre d'état et la barre à outils */
CStatusBar m_wndStatusBar;
CToolBar m_wndToolBar;
/* constructeur */
CMainFrame();
/*méthode de réponse au message WM_CREATE */
int OnCreate(LPCREATESTRUCT lpCreateStruct);
/* table des messages de la fenêtre cadre */
DECLARE_MESSAGE_MAP()
41
Le squelette de l’application L’objet Fenêtre Cadre
La classe CMainFrame (MainFrm.h) suite public:
/* permet de modifier les styles de la fenêtre cadre */
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
/* destructeur */
virtual ~CMainFrame();
};
42
Le squelette de l’application L’objet Fenêtre Cadre
Table des message de la classe CMainFrame
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_CREATE()
END_MESSAGE_MAP()
Ici la macro fonction ON_WM_CREATE
réfère au message correspondant WM_CREATE
et au gestionnaire de message associé
OnCreate (automatiquement).
43
Le squelette de l’application L’objet Fenêtre Cadre
La méthode OnCreate de la classe CMainFrame
La barre à outils et la barre d'état sont déclarées comme données membre de la classe CMainFrame.
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
/* Appel de la méthode héritée OnCreate de la classe mère CFrameWnd */
if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;
44
Le squelette de l’application L’objet Fenêtre Cadre
La méthode OnCreate de la classe CMainFrame (suite)
/* Création de la barre à outils en paramétrant son style, avec la méthode CreateEx de la classe CToolBar */
/* Chargement de cette barre dans la fenêtre cadre avec la méthode LoadToolBar avec en paramètre l'identifiant de la fenêtre cadre */
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD
| WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS
| CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("Failed to create toolbar\n");
return -1; // fail to create }
45
Le squelette de l’application L’objet Fenêtre Cadre
La création de la barre d'état est faite par un appel à la fonction Create de la classe CToolBar et à la méthode SetIndicators
Les indicateurs souhaités sont décrits dans la le fichier MainFrm.cpp
sous forme d'un tableau : static UINT indicators[] = {
ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS,
ID_INDICATOR_NUM, ID_INDICATOR_SCRL, };
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) {
TRACE0("Failed to create status bar\n");
return -1; // fail to create }
*/ Les indicateurs sont de petites zones sur la barre d'état */
return 0;
} 46
Le squelette de l’application L’objet Document
La classe CIHMDoc (CIHMDoc.h) class CIHMDoc : public CDocument {
protected:
/* Constructeur par défaut */
CIHMDoc();
/* Macro fonction qui permet la création dynamique d'un objet de type CIHMDoc */
DECLARE_DYNCREATE(CIHMDoc)
Le squelette de l’application L’objet Document
La classe CIHMDoc (CIHMDoc.h) public:
/* Destructeur */
virtual ~CIHMDoc();
/* Cette méthode permet l'insertion de code pour la ré- initialisation du document SDI */
virtual BOOL OnNewDocument();
/* MFC fait appel à Serialize pour lire ou écrire des données dans un fichier et recréer un document */
virtual void Serialize(CArchive& ar);
protected:
DECLARE_MESSAGE_MAP() };
Le squelette de l’application L’objet Document
L'implémentation de la classe CIHMDoc (CIHMDoc.cpp) /* à utiliser conjointement avec la déclaration
DECLARE_DYNCREATE(CIHMDoc) */
IMPLEMENT_DYNCREATE(CIHMDoc, CDocument) /* Table des messages, vide ici */
BEGIN_MESSAGE_MAP(CIHMDoc, CDocument) END_MESSAGE_MAP()
CIHMDoc::CIHMDoc()
{ // TODO: add one-time construction code here }
49
Le squelette de l’application L’objet Document
L'implémentation de la classe CIHMDoc (CIHMDoc.cpp)
BOOL CIHMDoc::OnNewDocument() { if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here // (SDI documents will reuse this document) return TRUE;
}
void CIHMDoc::Serialize(CArchive& ar) { if (ar.IsStoring())
{ // TODO: add storing code here } else
{ // TODO: add loading code here }
} 50
Le squelette de l’application L’objet Vue
La classe CIHMView (CIHMView.h)
class CIHMView : public CView {protected:
CIHMView();
DECLARE_DYNCREATE(CIHMView) public:
CIHMDoc* GetDocument();
virtual void OnDraw(CDC* pDC);
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
DECLARE_MESSAGE_MAP() };
51
Le squelette de l’application L’objet Vue
La table des messages de la classe CIHMView
Les messages traités ici concernent les messages émis lors du choix dans le menu des options d'impression (imprimer, aperçu avant impression)
les méthodes de la classe mère sont utilisées
(OnFilePrint, OnFilePrintPreview).
BEGIN_MESSAGE_MAP(CIHMView, CView)
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/* Implémentation correspondant à la déclaration DECLARE_DYNCREATE */
IMPLEMENT_DYNCREATE(CIHMView, CView)
52
Le squelette de l’application L’objet Vue
Les méthodes de la classe CIHMView (CIHMView.cpp) CIHMView::CIHMView() //constructeur
{ }
CIHMView::~CIHMView() // destructeur { }
BOOL CIHMView::PreCreateWindow(CREATESTRUCT& cs)
{
/* Permet de modifier le style de la fenêtre en modifiant la structure CREATESTRUCT cs */
return CView::PreCreateWindow(cs);
}
53
Le squelette de l’application L’objet Vue
Les méthodes de la classe CIHMView (CIHMView.cpp)
BOOL CIHMView::OnPreparePrinting(CPrintInfo* pInfo) { // Préparation par défautreturn DoPreparePrinting(pInfo);
}
void CIHMView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo) { // Ajout d‘actions spécifiques avant l'impression
}
void CIHMView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo) { // Ajout d'actions spécifiques après l'impression
}
54
Le squelette de l’application L’objet Vue
La méthode OnDraw
La méthode OnDraw de la classe CIHMView se contente d'obtenir un pointeur sur le document de type CIHMDoc et de s'assurer de sa validité.
La méthode OnDraw a en paramètre un pointeur sur un contexte de périphérique pour permettre le tracé de la vue.
void CIHMView::OnDraw(CDC* pDC) { CIHMDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
}
55
Le squelette de l’application L’objet Vue
La méthode OnDraw ne répond pas directement à un message .
L'objet vue CView a un gestionnaire de message OnPaint qui est prédirigé pour toute classe dérivée de CView.
Le gestionnaire OnPaint effectue principalement deux tâches :
créer un objet de type CPaintDC pour avoir un contexte de périphérique,
appeler la méthode OnDraw.
CPaintDC dc(this);
OnPrepareDC(&dc);
OnDraw(&dc);
La méthode OnPaint répond au message WM_PAINT. Ce message est émis lors du 1er affichage d'une fenêtre (UpdateWindow) ou lorsqu'une fenêtre a été endommagée.
56
Le squelette de l’application L’objet Vue
La méthode OnDraw
CIHMDoc* CIHMView::GetDocument() {
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CIHMDoc)));
return (CIHMDoc*) m_pDocument;
}
La classe CIHMView possède un attribut (hérité de CView) qui est m_pDocument.
La macro ASSERT permet de s'assurer que m_pDocument est bien de type CIHMDoc.
La fonction GetDocument renvoie un pointeur sur le document.
57
Le squelette de l’application - WinMain
La fonction WinMain
La fonction principale WinMain est définie dans les MFC.
Lorsque l'utilisateur démarre une application, la première étape est la construction de l'objet application : theApp pour lequel de l'espace est alloué avec un appel du constructeur.
Windows appelle la fonction WinMain.
WinMain appelle InitInstance, la fonction Run et termine à la réception du message WM_QUIT (avec la méthode ExitInstance)
58
Le squelette de l’application - WinMain
Code source de WinMain
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {
ASSERT(hPrevInstance == NULL);
int nReturnCode = -1;
CWinThread* pThread = AfxGetThread();
CWinApp* pApp = AfxGetApp();
if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow)) goto InitFailure;
// App global initializations (rare)
if (pApp != NULL && !pApp->InitApplication()) goto InitFailure;
Le squelette de l’application - WinMain
// Perform specific initializations if (!pThread->InitInstance()) {
if (pThread->m_pMainWnd != NULL) {
TRACE0("Warning: Destroying non-NULL m_pMainWnd\n");
pThread->m_pMainWnd->DestroyWindow();
}
nReturnCode = pThread->ExitInstance();
goto InitFailure;
}
nReturnCode = pThread->Run();
InitFailure:
// Traitement des erreurs
…
return nReturnCode;
}
Application (SDI) Crée
Démarre la séquence de création
Initialise App Run() InitInstance()
Active la boucle de messages
Distribue les messages aux autres objets ExitInstance()
Nettoyage au niveau App
Document Template
Document Template Document Frame Window View
61 possède
Document Template
DeleteContents() Nettoie après Document Document
OnNewDocument() Initialise Document
OnOpenDocument() Initialise Document
Serialize() Sauvegarde Document
View
62 Contient
View
Constructeur Initialise la vue
OnDraw()
Dessine les données dans la vue
Destructeur() Nettoie après la vue Frame Window