Université du Québec École de technologie supérieure Département de génie de la production automatisée Introduction à la programmation MFC Professeur: Tony Wong, Ph.D., ing. Chapitre 3 1 Introduction Le cadre de travail MFC (Microsoft Foundation Classes) sert à faciliter le développement des applications Windows L étude de MFC: Bien connaître l apport de ce cadre de travail; Faciliter la construction des interfaces graphiques; Saisir la puissance de l approche orientée objet; Exemples concrets de réalisation orientée objet. 2 ÉTS - GPA, (C) Tony Wong, Ph.D., ing. 1
Philosophie de base Gestionnaires d'événement Événements Actions Traitement du clavier Entrées du clavier Logique et contrôle du programme Traitement de la souris (bouton gauche) Traitement de la souris (bouton droit) Traitement pour le déplacement de la souris Système Windows Bouton gauche de la souris activé Bouton droit de la souris activé Déplacement de la souris Autres traitements... Autres actions... Application Windows 3 Expédition et routage des messages (1) L utilisateur du programme déclenche des événements par des actions: L utilisateur clique sur un bouton. L utilisateur modifie la taille d une fenêtre. Etc. Le programme lui-même peut également déclencher des événements: L activation d une alarme Windows. Événements envoyés par la logique du programme. Etc. 4 ÉTS - GPA, (C) Tony Wong, Ph.D., ing. 2
Expédition et routage des messages (2) Les événements Windows sont traduits en messages par le MFC. Noter bien, dans la littérature de MFC, les événements reliés aux éléments de l interface graphique sont appelés des notifications. Une grande partie du travail d un programme Windows consiste à traiter les messages et les notifications. On appelle aussi le modèle de Windows la programmation événementielle. 5 Expédition et routage des messages (2) Dans le MFC, le routage des messages est centralisé à l aide des cartes de messages (Message Maps). Chaque composant d un programme MFC qui disposant d une queue de messages peut avoir une carte de message. Cela signifie que les cartes de messages sont associées à des classes dérivées de MFC. Les cartes de messages sont normalement instaurées par le AppWizard à l aide de macros. 6 ÉTS - GPA, (C) Tony Wong, Ph.D., ing. 3
Expédition et routage des messages (3) La syntaxe de ces macros: DECLARE_MESSAGE_MAP Placée dans la déclaration d une classe dérivée de MFC dans le fichier.h BEGIN_MESSAGE_MAP(CXtractCommGUIDlg, CDialog) //{{AFX_MSG_MAP(CXtractCommGUIDlg) ON_WM_PAINT() : : : ON_BN_CLICKED(ID_ACTION, OnAction) //}}AFX_MSG_MAP END_MESSAGE_MAP() Gestionnaires des événements Placée dans la définition d une classe dérivée de MFC dans le fichier.cpp 7 Expédition et routage des messages (4) Il existe un nombre élevé de macros pour la gestion des événements! C est pour cette raison que l on utilise le ClassWziard. Le ClassWizard présente les événements possibles des éléments graphiques d un projet de programmation. Ainsi, on n a pas à se souvenir le nom de ces macros. On active le ClassWizard 8 par ctrl-c. ÉTS - GPA, (C) Tony Wong, Ph.D., ing. 4
Quelques classes de MFC (1) Le MFC comprend: Classes représentant les éléments de l interface graphique. Fenêtres, boutons, listes déroulantes, combo box, etc. Classes utilitaires facilitant la programmation orientée objet. Point (coordonnées de la souris, dimension des fenêtres, etc.) Collections (semblables à STL mais moins riche) Date, fichiers, etc. Enveloppes (wrappers) des fonctions systèmes Win32. 9 Quelques classes de MFC (2) Classe CObject: Classe de base abstraite utilisée pour la dérivation des autres classes de MFC. Elle est l ancêtre de la plupart des classes de MFC. Elle réalise le concept de sérialisation (persistance des objets). Elle entrepose les informations nécessaires pour la détermination des classes (runtime classe information). Elle permet le diagnostic des objets (object dumps). 10 ÉTS - GPA, (C) Tony Wong, Ph.D., ing. 5
Quelques classes de MFC (3) Classe CWinApp: Elle représente une application Windows. Le AppWizard génère une classe dérivée de CWinApp pour chaque programme. Puisqu elle représente une application Windows, elle dispose aussi d une queue de messages. Puisqu elle dispose d une queue de messages, le AppWizard générera également les macros DECLARE_MESSAGE_MAP et BEGIN_MESSAGE_MAP(,) 11 Quelques classes de MFC (4) class CAmusantApp : public CWinApp { public: CAmusantApp(); // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAmusantApp) public: virtual BOOL InitInstance(); //}}AFX_VIRTUAL // Implementation //{{AFX_MSG(CAmusantApp) // NOTE - the ClassWizard will add and remove member functions here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG DECLARE_MESSAGE_MAP() 12 }; ÉTS - GPA, (C) Tony Wong, Ph.D., ing. 6
Quelques classes de MFC (5) Il existe une fonction membre très importante dans la classe CWinApp: Il s agit de InitInstance(). C est dans cette fonction membre que l on règle les paramètres de l application: Indiquer le type de bibliothèque MFC à utiliser. Enregistrer/créer les clés appropriées dans le registre de Windows. Enregistrer le patron document/vue. Charger l icône de l application, etc. 13 Quelques classes de MFC (6) Lorsqu il s agit d une application basée sur un panneau de dialogue: Créer le panneau de dialogue. Donnant ainsi l aspect visuel du programme. Donc, CWinApp n a pas de représentation graphique! Il s agit plutôt d une classe de gestion (house keeping) nécessaire à tous les programmes MFC. 14 ÉTS - GPA, (C) Tony Wong, Ph.D., ing. 7
Quelques classes de MFC (7) BOOL CAmusantApp::InitInstance() { #ifdef _AFXDLL Enable3dControls(); #else Enable3dControlsStatic(); #endif // Call this when using MFC in a shared DLL // Call this when linking to MFC statically CAmusantDlg dlg; m_pmainwnd = &dlg; int nresponse = dlg.domodal(); if (nresponse == IDOK) { // TODO: Place code here to handle when the dialog is dismissed with OK } else if (nresponse == IDCANCEL) { // TODO: Place code here to handle when the dialog is dismissed with Cancel } // Since the dialog has been closed, return FALSE so that we exit the // application, rather than start the application's message pump. 15 return FALSE; Quelques classes de MFC (8) Classe CWnd: Classe abstraite représentant une fenêtre. En effet, dans le MFC, tous les contrôles (éléments d interface graphique) sont des fenêtres! Donc, CWnd est la classe de base de tous les contrôles. Cette classe dispose d un ensemble de fonctions membres pour réaliser la gestion et la manipulation d une fenêtre. Évidemment, CWnd est dérivée de CObject. 16 ÉTS - GPA, (C) Tony Wong, Ph.D., ing. 8
Quelques classes de MFC (9) Classe CDialog: Elle est dérivée de CWnd. Classe représentant un panneau de dialogue. Elle possède donc une représentation graphique. De plus, elle possède la capacité de gérer le traçage des contrôles déposés. C est pour cette raison les applications basées sur un panneau de dialogue sont les plus simples à réaliser. 17 Application MDI (1) MDI? Multiple Document Interface Ce genre d application utilise le concept de DOC/VIEW. DOC? VIEW? Entrepôt de données. Méthode de présentation des données. Donc, dans une application MDI, on peut avoir: Plusieurs entrepôt de données Type de données différentes (son, image, texte, etc.) Plusieurs façons de présenter les données Visionneur, graphisme, éditeur, etc. 18 ÉTS - GPA, (C) Tony Wong, Ph.D., ing. 9
Application MDI (2) Fenêtres enfants Cadre principal Menu dans le cadre principal 19 Application MDI (3) Le cadre principal est créé par CMainFrame Le menu et les barres d'outils sont créés par CMainFrame Les fenêtres enfants sont créées par CMDIChildWnd Les classes principales d une application MDI: CMainFrame CMDIChildWnd CMenu CToolBar Normalement, on crée nos propres classes MDI par dérivation. 20 ÉTS - GPA, (C) Tony Wong, Ph.D., ing. 10
Application MDI (4) Dans une application MDI de MFC, la gestion des fenêtres est réalisée automatiquement. Autrement dit, les options de ce menu sont normalement réalisées par le code généré par le AppWizard. 21 Application MDI (5) Les relations qui existent dans le DOC/VIEW: Objet Application Pointeur Document template Pointeur Fenêtre enfant Pointeur Créer pointer vers Objet Document Pointeur Objet Vue Pointeur 22 ÉTS - GPA, (C) Tony Wong, Ph.D., ing. 11
Hiérarchie partielle des classes MDI CObjet Classe abstraite de base Contrôle d'exécution CWinThread CWinApp Classe Application CMDIChildWnd Fenêtre enfant MDI Cadre principal CFrameWnd CCmdTarget Routage des messages DOC/VIEW CWnd Fenêtre de base CDocument CView DOC/VIEW CMDIFrameWnd Cadre principal MDI CDocTemplate CMDIDocTemplate CScrollView Vue avec barres défilement Document template de base Document template MDI 23 Affichage graphique (1) Tous les affichages sont réalisés de manière graphique. On ne peut dessiner directement à l écran. L affichage est réalisé par le biais d un objet de classe CDC. CDC Classe pour Device Context de base CClientDC CWindowDC CPaintDC CMetaFileDC Traçage dans l'espace réservé d'une fenêtre Traçage dans toute l'espace d'une fenêtre Traçage en réponse au message WM_PAINT Traçage dans un fichier de type Metafile 24 ÉTS - GPA, (C) Tony Wong, Ph.D., ing. 12
Affichage graphique (2) L événement correspondant à la mise jour des éléments graphiques d une application: WM_PAINT La macro normalement associée à cet événement est: ON_WM_PAINT() La fonction membre représentée par cette macro est: OnPaint() 25 Affichage graphique (3) Voici à quoi ressemble l affichage graphique dans une application MFC: // 1) construire un client DC du panneau // de dialogue (CDialog est dérivé de CWnd) CClientDC DlgDC(this); // 2) créer un dessin sur le bureau! for (int x=0; x<150; x++) for (int y=0; y<150; y++) // Mettre des pixels en couleur DlgDC.SetPixel(x, y, x * y); // 3) libérer le DC // Pas besoin pour les classes dérivées // de CDC! 26 ÉTS - GPA, (C) Tony Wong, Ph.D., ing. 13
Affichage graphique (4) Affichage dans l espace réservé d une fenêtre (dans ce cas un panneau de dialogue): Le DC (Device Contexte) à utiliser est CClientDC. 27 Affichage graphique (5) Affichage partout sur le bureau: Le DC (Device Contexte) à utiliser est CDC. 28 ÉTS - GPA, (C) Tony Wong, Ph.D., ing. 14
Fin du chapitre 3 Lire les notes de cours du chapitre 3. Continuer la lecture des autres chapitres. Étudier les programmes exemples (disponibles sur la page web de GPA789). N oubliez pas: C++ est bien plus que du C. 29 ÉTS - GPA, (C) Tony Wong, Ph.D., ing. 15