2. Cours semaine 2 jour 3 Cours C++ 2
Plan du jour
Approfondissement sur les templates
MFC, STL et ATL
3. Cours semaine 2 jour 3 Cours C++ 3
MFC
Les MFC offrent deux types de classes
Les classes Windows, que nous avons vu
brièvement hier
Elles permettent de greffer une application dans le
framework Windows qui gère les fenêtres et les
évènements qui leurs seront envoyés
Les classes de soutien, qui correspondent à une
collection de types à connotation beaucoup plus
algorithmique
4. Cours semaine 2 jour 3 Cours C++ 4
MFC (2)
Nous avons vu un programme minimaliste
hier
Création d’une application utilisant les MFC
Création d’une fenêtre où rien n’est possible car
il n’y a pas de message handlers
Nous allons aujourd’hui créer un
programme possédant des message handlers
La fenêtre réagira enfin
23. Cours semaine 2 jour 3 Cours C++ 23
MFC (21)
Arrivé à ce stade, vous avez une application
fonctionnelle
Vous pouvez compiler
Si vous l’osez, vous pouvez même lancer
une exécution
38. Cours semaine 2 jour 3 Cours C++ 38
MFC (36)
Compilez
Exécutez
Quittez sans le Task Manager…
39. Cours semaine 2 jour 3 Cours C++ 39
MFC (37)
Nous venons de créer un message handler
permettant de quittez le programme losrque
le bouton droit de la souris est relaché
Le message est envoyé à la fin du clic souris
Relancer le programme et gardez le doigt
appuyé sur le bouton droit pour vérifier !
40. Cours semaine 2 jour 3 Cours C++ 40
MFC de soutien
Les classes MFC pour la gestion des
fenêtres sont très nombreuses
Elles sont accessibles par l’intermédiaire
des assistants qui automatisent également
beaucoup la création des handlers par
rapport à ces fenêtres
41. Cours semaine 2 jour 3 Cours C++ 41
MFC de soutien (2)
Les classes de soutien MFC sont constituées
de plusieurs éléments
Les classes de collection, qui permettent de
gérer des collections d’objets
Tableaux (Array), listes (List) et tables (Map)
Les classes de gestion de coordonnées
Les classes de gestion du temps
La classe de manipulation de chaînes de
caractères
42. Cours semaine 2 jour 3 Cours C++ 42
MFC de soutien (3)
Les classes de gestion des tableaux
(collection) sont typées
Elles n’utilisent pas la programmation
générique
Bien que nous soyons en C++, il y a encore
quelques réminiscences de C…
Cependant, comme nous sommes tout de
même en C++, il y a la possibilité d’utiliser
des fonctions exotiques
43. Cours semaine 2 jour 3 Cours C++ 43
MFC de soutien (4)
CByteArray BYTE – valeurs entières non signées 8 bits
CWordArray WORD – valeurs entières non signées 16 bits
CUIntArray UINT – valeurs entières non signées 32 bits
CDWordArray DWORD – valeurs entières non signées 32 bits
CStringArray CString – chaînes de carcatères
CObArray CObject – tout dérivé de CObject
44. Cours semaine 2 jour 3 Cours C++ 44
MFC de soutien (5)
CStringArray tableauDeChaine;
tableauDeChaine.add( "titi" );
tableauDeChaine.add( "toto" );
tableauDeChaine.add( "tata" );
CWordArray tableauDeMots;
tableauDeMots.SetSize( 20 );
tableauDeMots.SetAt( 0, 2000 );
tableauDeMots[ 5 ] = 2002;
TRACE( "une valeur dans tableauDeMots %d", tableauDeMots.GetAt( 5 ) );
45. Cours semaine 2 jour 3 Cours C++ 45
MFC de soutien (6)
Les classes de gestion de listes (collection)
suivent le même principe que les classes de
gestion des tableaux
Une classe par type de base supporté
Il existe également des objets annexes qui
permettent de conserver certaines
informations
Classe POSITION
46. Cours semaine 2 jour 3 Cours C++ 46
MFC de soutien (7)
CObList CObject – tout dérivé de CObject
CStringList CString – chaînes de carcatères
CPtrList void* - pointeurs indéfinis
47. Cours semaine 2 jour 3 Cours C++ 47
MFC de soutien (8)
CStringList ListeDeChaines;
CString str;
POSITION pos;
pos = listeDeChaines.AddHead( "tete" );
listeDeChaines.AddTail( "pied" );
listeDeChaines.InsertBefore( pos, "cheveux" );
listeDeChaines.AddTail( "ongles" );
pos = listeDeChaines.GetHeadPosition();
pos = listeDeChaines. GetTailPosition();
str = listeDeChaines.GetNext( pos );
str = listeDeChaines.GetPrev( pos );
POSITION posCourante = listeDeChaines.GetHeadPosition();
while( posCourante )
TRACE( "%s", listeDeChaines.GetNext( posCourante );
48. Cours semaine 2 jour 3 Cours C++ 48
MFC de soutien (9)
Les classes de gestion des tables
(collection) suivent également les principes
des tableaux et des listes
Classes typées
Ici aussi, il existe des classes d’aide
POSITION
49. Cours semaine 2 jour 3 Cours C++ 49
MFC de soutien (10)
CMapWordToOb clé WORD – élément CObject
CMapWordToPtr clé WORD – élément void*
CMapPtrToPtr clé void* – élément void*
CMapPtrToWord clé void* – élément WORD
CMapStringToOb clé CString – élément CObject
CMapStringToPtr clé CString – élément void*
CMapStringToString clé CString – élément CString
51. Cours semaine 2 jour 3 Cours C++ 51
MFC de soutien (12)
Tous ces types sont prédéfinis et prétypés
Cela apporte normalement plus de rapidité
Cela apporte aussi moins de flexibilité
Il est cependant possible de définir des
classes de collection à partir de ses propres
objets
Au bout d’un certains temps, Microsoft a quand
même permis d’utiliser les templates…
52. Cours semaine 2 jour 3 Cours C++ 52
MFC de soutien (13)
CArray, CList et CMap sont des templates
permettant de définir des classes de
collection à partir de classes définies par
l’utilisateur
Les « modèles » sont fournis dans afxtempl.h
Les templates permettent en fait d’obtenir
des possibilités qui n’existent pas avec les
classes de base
53. Cours semaine 2 jour 3 Cours C++ 53
MFC de soutien (14)
CArray< CClassPerso1*, CClassPerso2* >
CClassPerso1 : type de pointeur d’objet
retourné par le tableau, lors de GetAt() par
exemple
CClassPerso2 : type qui doit être utilisé pour les
arguments en entrée, lors de SetAt() ou Add()
Il s’agit bien d’un template !
Idem pour CList
54. Cours semaine 2 jour 3 Cours C++ 54
MFC de soutien (15)
CMap< MonType, MonTypeArg,
CClassPerso, CClassPersoArg >
MonType donne le format de la clé en interne :
int, WORD, DWORD, double, float ou CString
MonTypeArg : type de l’argument à fournir
pour la clé
CClassPerso indique la classe de stockage
interne des éléments
CClassPersoArg indique le type des arguments
qui seront fournis comme éléments
55. Cours semaine 2 jour 3 Cours C++ 55
MFC de soutien (16)
CMap< CString, LPCSTR, CDetailsPlanete*, CDetailsPlanete* > tabPlanete;
// LPCSTR permet la comparaison sur les valeurs de chaînes,
// pas sur les valeurs des pointeurs ;-)
// c’est un tableau de caractères
// la suite comme tout à l’heure sauf pour le « Lookup »
tabPlanete.setAt( "Mercure", CDetailsPlanete( 4878, 0.054 ) );
tabPlanete.setAt( "Venus", CDetailsPlanete( 12100, 0.815 ) );
tabPlanete[ "Terre" ] = CDetailsPlanete( 6762, 0.107 ) );
POSITION pos = tableDetailsPlanete.GetStartPosition();
CDetailsPlanete* pPlanete = NULL;
if( tabPlanete.Lookup( "Terre", pPlanete ) )
TRACE( "%f", pPlanete->champs2 );
56. Cours semaine 2 jour 3 Cours C++ 56
MFC de soutien (17)
Les classes de gestion de coordonnées sont
importantes pour la gestion de
l’environnement fenêtré
Classes CPoint, CRect et CSize
Elles ont une correspondance certaines avec les
types internes de Windows
57. Cours semaine 2 jour 3 Cours C++ 57
MFC de soutien (18)
CPoint()
CPoint( POINT pInit )
Copie à partir d’une structure
POINT ou d’un objet CPoint
CPoint( int x, int y )
CPoint( DWORD dwInit ) 16 bits de poids faible pour x
CPoint( SIZE sizeInit )
Copie à partir d’une structure
SIZE ou d’un objet CSize
58. Cours semaine 2 jour 3 Cours C++ 58
MFC de soutien (19)
CRect()
CRect( RECT& rcInit ) structure RECT ou objet CRect
CRect( LPCRECT lprcInit ) pointeur sur RECT ou CRect
CRect( int g, int s, int d, int i )
CRect( POINT point, SIZE size )
structure POINT ou objet CPoint et
structure SIZE ou objet CSize
CRect( POINT ptSG, POINT ptID ) structure POINT ou objet CPoint
59. Cours semaine 2 jour 3 Cours C++ 59
MFC de soutien (20)
CSize()
CSize( SIZE sizeInit ) structure SIZE ou objet CSize
CSize( int initCX, int initCy )
CSize( POINT ptInit ) structure POINT ou objet CPoint
CSize( DWORD dwSize ) 16 bits de poids faible pour cx
60. Cours semaine 2 jour 3 Cours C++ 60
MFC de soutien (21)
Il est aisé de remarquer dans les slides
précédents la présence de types définis en
majuscules à côté des types à l’allure un peu
plus C++
Il s’agit des types internes de Windows
MFC ne fournit donc qu’une interface à ces
types internes
61. Cours semaine 2 jour 3 Cours C++ 61
MFC de soutien (22)
Type Windows Type C++ (MFC)
POINT CPoint
SIZE CSize
RECT CRect
HWND CWnd
HDLG CDialog
HMENU CMenu
HWND CEdit
HWND CListBox
HSZ CString
62. Cours semaine 2 jour 3 Cours C++ 62
MFC de soutien (23)
Il existe deux classes de gestion du temps
dans MFC
COleDateTime
Représente une date et une heure valide
De nombreux constructeurs car la classe est reliée à
OLE qui possède de nombreuses représentations
COleDateTimeSpan
Représente un écart entre deux DateTime, en jours
et heures
63. Cours semaine 2 jour 3 Cours C++ 63
MFC de soutien (24)
MFC fournit également une classe
permettant de traiter des chaînes de
caractères, la classe CString
Cette classe possède également un ensemble
de méthodes permettant :
La manipulation ( Left(), Mid(), Right() )
la recherche ( Find(), FindOneOf() )
Le formatage de l’affichage ( Format() )
64. Cours semaine 2 jour 3 Cours C++ 64
MFC de soutien (25)
CString()
CString( CString strSrc )
CString( LPCSTR lpsz ) tableau de caractères
CString( unsigned char* psz )
CString(LPCSTR lpch, int nLength )
CString( TCHAR ch, int nRepeat )
CString( LPCWSTR lpsz ) tableau de caractères UNICODE
65. Cours semaine 2 jour 3 Cours C++ 65
MFC de soutien (26)
La fonction Format de la classe CString
permet d’utiliser des notations pour les
emplacements d’éléments
Cette notation est celle utilisée dès le départ
en C sur Unix
66. Cours semaine 2 jour 3 Cours C++ 66
MFC de soutien (27)
%c int un caractère
%d int un entier signé
%u int un entier non signé
%o int un entier non signé, format octal
%x int un entier non signé, format hexadécimal minuscule
%X int un entier non signé, format hexadécimal majuscule
%f double un nombre à virgule flottante
%s string une chaîne de caractères (char*)
%% - le signe %
67. Cours semaine 2 jour 3 Cours C++ 67
STL
Microsoft a défini ses MFC assez
rapidement pendant que d’autres
constructeurs se regroupaient pour définir
une librairie standard
STL, Standard Template Library, est un
standard reconnu par tous les compilateurs
qui implémentent l’ANSI C++
Cela garantit une certaine portabilité du code
source (mais pas de l’exécutable !)
68. Cours semaine 2 jour 3 Cours C++ 68
STL (2)
La STL est supportée par Microsoft Visual
C++ et le code source d’autres plate-formes
pourrait ainsi être recompilé
À condition bien sûr que ce code ne comporte
pas d’appel à des classes d’interface graphique
comme X-Windows ou Athena sur Unix
L’opération est envisageable pour des sources à
caractère purement algorithmique ou
scientifique
69. Cours semaine 2 jour 3 Cours C++ 69
STL (3)
La STL regroupe un ensemble de classes
d’utilité générale
En fait, comme le nom l’indique fort bien, il
s’agit en partie de templates
La STL offre principalement des classes
d’algorithmique générale
70. Cours semaine 2 jour 3 Cours C++ 70
STL (4)
La STL contient, entre autre
Une classe string
Un template vector
Des templates list et deque
Des templates set, multiset, map et multimap
Un algorithme de tri, sort
Un algorithme de recherche, find
Des classes d’itérateurs dans les collections, iterator,
pour input, ouput, forward, random, bidirectional
71. Cours semaine 2 jour 3 Cours C++ 71
STL (5)
#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
using namespace std;
void main() {
vector<string> v;
string tmp;
for( int i = 0; i < 10 ; i++ ) {
cout << "un mot : ";
getline( cin, tmp );
v.push_back( tmp );
}
sort( v.begin(), v.end() );
copy( v.begin(), v.end(), ostream_iterator<string>( cout, "n" ) );
}
72. Cours semaine 2 jour 3 Cours C++ 72
STL (6)
STL contient des éléments qui sont classés
différemment de ceux de Windows
Le point de vue utilisé ici est un peu plus
académique, pour ne pas dire scientifique
La STL a été développé dans des laboratoires
de recherche, dont celui de HP qui est le
détenteur officiel de la version officielle de la
STL
73. Cours semaine 2 jour 3 Cours C++ 73
STL (7)
Containers
Containers de séquences
vector : vecteur
deque : file à double entrée, possibilité d’insérer en
début et en fin
List : liste
Containers associatifs
set et multiset : gestion d’un ensemble d’éléments,
possibilité de dupliquer des éléments (multi)
Map et multimap : gestion des tables d’association,
possibilité de dupliquer des éléments (multi)
74. Cours semaine 2 jour 3 Cours C++ 74
STL (8)
Algorithmes
find : algorithme générique de recherche
merge : algorithme générique de fusion, marche
pour les listes, les vecteurs, les tableaux, les
types pouvant être mélangés et le résultat
récupéré dans un type différent !
sort : algorithme de tri générique
etc
75. Cours semaine 2 jour 3 Cours C++ 75
STL (9)
Itérateurs
Permettent le parcours des ensembles (au sens
très général du terme)
Efficaces et puissants
Objets fonction
Avec STL, certains objets sont des fonctions :
ce sont des versions abstraites des algorithmes
76. Cours semaine 2 jour 3 Cours C++ 76
STL (10)
Adaptateurs
Composants qui permettent de modifier
l’interface d’autres composants
Permettent par exemple de modifier un deque
en liste LIFO (i.e. du bon usage des langages
OO pour faire des ADT)
Allocateurs
En charge de l’allocation de la mémoire
77. Cours semaine 2 jour 3 Cours C++ 77
STL (11)
STL est une très bonne librairie objet
Parfois difficile à apprendre mais le jeu en
vaut la chandelle
Devrait être privilégiée autant que faire se
peut par rapport aux MFC
78. Cours semaine 2 jour 3 Cours C++ 78
ATL
ATL est l’acronyme d’Active Template
Library
Cette librarie est propre au monde
Microsoft
Il ne s’agit pas d’un complément des MFC
Il s’agit d’un remplaçant !
79. Cours semaine 2 jour 3 Cours C++ 79
ATL (2)
Problèmes des MFC
Très gros, très lourd
Oblige à travailler avec l’ « Application
Framework Architecture »
Utilise des notions de document et document
template qui disparaîtront peut être bientôt tels
qu’ils existent aujourd’hui
Et la compatibilité ne sera peut être pas parfaitement
assurée…
80. Cours semaine 2 jour 3 Cours C++ 80
ATL (3)
Avantages de l’ATL
Travaille avec le modèle COM de Microsoft,
Component Object Model
COM est l’ancêtre de DCOM, qui est l’ancêtre
d’ActiveX
Active Template Library…
ATL est beaucoup plus petit que MFC
L’apprentissage en est donc facilité
ATL est plus petit et donc plus rapide !
C’est une petite usine à gaz !
81. Cours semaine 2 jour 3 Cours C++ 81
ATL (4)
ATL est fait pour supporter COM, qui n’est
pas spécifiquement graphique
Mais des objets COM ou des ActiveX peuvent
avoir des fenêtres
ATL possède cependant des classes
permettant d’ouvrir et de gérer des fenêtres
ATL en offre plusieurs types, utilisables en
fonction des contextes
82. Cours semaine 2 jour 3 Cours C++ 82
ATL (5)
CWindow est un wrapper (sorte d’adaptateur) qui
permet de disposer d’un objet fenêtre qui peut être
fourni à n’importe quelle fonction en ayant besoin
CWindowImpl permet de créer une fenêtre à partir
de la définition d’une autre classe
CContainedWindow est une fenêtre qui effectue le
routage des messages aux autres classes. Le
traitement des messages peut ainsi être centralisé
en une seule classe de l’application
83. Cours semaine 2 jour 3 Cours C++ 83
ATL (6)
CAxWindow est une fenêtre qui peut
« embarquer » un contrôle ActiveX
CSimpleDialog permet de créer un dialogue
modal simple
CDialogImpl permet de créer des fenêtres
de dialogue modal ou non modal
CAxDialogImpl est un CDialogImpl qui
supporte les contrôles ActiveX
84. Cours semaine 2 jour 3 Cours C++ 84
ATL (7)
CWndClassInfo gère les informations
relatives aux objets fenêtre
CWinTraits gère les informations d’aspect
des fenêtres
85. Cours semaine 2 jour 3 Cours C++ 85
ATL (8)
Pour gérer les messages dans un CWindowImpl, il
existe un CMessageMap qui fait le lien entre les
message et les message handlers
Il existe trois groupes de messages handlers
Les messages handlers pour « tous » les messages
Les command handlers pour les messages
WM_COMMAND
Les notification handlers pour les messages
WM_NOTIFY
86. Cours semaine 2 jour 3 Cours C++ 86
ATL (9)
Une message map ressemble à ceci :
BEGIN_MSG_MAP( CMyDialog )
MESSAGE_HANDLER( WM_INITDIALOG, OnInitDialog )
COMMAND_HANDLER( IDC_EDIT1,
EN_CHANGE,
OnChangeEdit1)
COMMAND_ID_HANDLER( IDOK, OnOK )
COMMAND_CODE_HANDLER( EN_ERRSPACE, OnErrEdits )
NOTIFY_HANDLER( IDC_LIST1, NM_CLICK, OnClickList1 )
NOTIFY_ID_HANDLER( IDC_LIST2, OnSomethingList2 )
NOTIFY_CODE_HANDLER( NM_DBLCLK, OnDblClkLists )
END_MSG_MAP()
87. Cours semaine 2 jour 3 Cours C++ 87
WTL
Il existe enfin, de manière assez
périphérique, une WTL, Windows Template
Library, actuellement en version 3.1
Cette librairie est une extension de la
librairie ATL
Elle est livrée avec un assistant permettant
la création assistée de fenêtres…
88. Cours semaine 2 jour 3 Cours C++ 88
WTL (2)
La WTL permet d’avoir des classes prédéfinies
pour :
Les message loops
Les contrôles,
Les fenêtres de dialogue,
Les frame windows,
Les objets DC et GDI (le contexte graphique de
l’application et l’interface du périphérique graphique)
Les portages ATL de CPoint, CRect, CSize, CString et
d’autres type MFC de soutien
89. Cours semaine 2 jour 3 Cours C++ 89
WTL (3)
Problèmes avec la WTL
Elle n’est pas officiellement supportée par
Microsoft, juste livrée telle quelle
Si Microsoft décide de tout changer demain, les
applications pourraient être impossibles à porter
et il faudrait revenir aux MFC !