III. wxWidgets et Visual C++ Express▲
wxWidgets propose deux moyens pour compiler avec Visual C++ :
soit en ligne de commande soit avec des projets Visual.
Nous allons nous intéresser à la compilation avec les
projets Visual déjà définis.
Ouvrer le fichier "\wxWidgets-2.8.10\build\msw\wx.dsw".
Les fichiers projets datent de la version Visual Studio 6. La
version Visual Express 2008 propose de convertir les fichiers
au nouveau format Visual C++ :

Répondez 'Oui pour tout'.
Visual convertit et charge tous les projets associés. Vous
obtenez la solution complète :
Les fichiers relatifs aux nouveaux projets sont créés dans le répertoire "\wxWidgets-2.8.10\build\msw\" : l'ensemble des fichiers .vcproj pour chacun des projets ainsi que le .sln pour la solution.
III-A. Paramétrer la compilation▲
Différentes configurations sont déjà définies pour les compilations. Elles suivent le schéma suivant :
[DLL] [Universal] [Unicode] [Debug|Release]
La présence de 'DLL' indique la version SHARED, son absence la
version STATIC.
'Universal' choisit le rendu wxWidgets. Sans cela, le rendu MSW
est produit.
'Unicode' pilote la version UNICODE.
'Debug' permet la compilation de la version DEBUG et 'Release'
la version RELEASE.
Nous avons choisi de générer les versions DEBUG et RELEASE
des bibliothèques STATIC avec UNICODE, le port MSW et en
plusieurs bibliothèques. Nous sommes donc intéressés par
les configurations :
Unicode Debug
Unicode Release
Le choix de la configuration s'opère directement dans la liste déroulante de la barre d'outils en haut de l'environnement de développement :

La configuration peut aussi être positionnée en choisissant l'item 'Gestionnaire de configurations...' du menu 'Générer' :

Une boîte de dialogue apparaît avec la liste de tous les projets. La configuration est choisie dans la liste déroulante 'Configuration de la solution active :'
La modification de la configuration active dans cette liste déroulante modifie automatiquement la configuration de chaque projet. Ne modifier en aucun cas individuellement la configuration d'un des projets. La case à cocher indique si le projet doit être généré (case cochée) ou non (case non cochée). Laissez toutes les cases cochées.
Une fois notre configuration choisie, nous devons également intervenir sur le fichier
"\wxWidgets-2.8.10\include\wx\msw\setup.h".
En l'occurrence, nous allons modifier les directives suivantes :
- #define wxUSE_UNICODE 1 : car nous voulons compiler avec UNICODE
- #define wxUSE_GLCANVAS 1 : car nous voulons compiler avec OpenGL
- #define wxUSE_ODBC 1 : car nous voulons compiler avec OBDC
A cela, nous modifions les directives suivantes :
- #define wxUSE_STL 1 : wxWidgets définit ses propres classes pour les listes (wxList) et les tableaux (wxArray). En positionnant cette directive à 1, ces deux classes vont dériver de std::list et std::vector tirant ainsi profit de la STL.
- #define wxUSE_STD_IOSTREAM 1 : grâce à cette directive, nous indiquons que nous souhaitons utiliser les flux de la bibliothèque standard quand cela est possible à la place des flux définis dans wxWidgets.
III-B. Compiler▲
Après avoir choisi la configuration 'Unicode Debug', la compilation se lance tout simplement avec l'item de menu 'Générer la solution' du menu 'Générer' :

Les fichiers intermédiaires de la compilation (les .obj) sont générés dans "\wxWidgets-2.8.10\build\msw\vc_mswud\XXX", où XXX est le projet correspondant. Le nom du répertoire intermédiaire est composé à partir de :
- le compilateur : 'vc' ;
- la plateforme : 'msw' ;
- le mode DEBUG/RELEASE : 'd' pour debug, rien pour release ;
- le mode UNICODE : 'u' pour UNICODE.
Si nous avions choisi le mode non UNICODE, le répertoire aurait eu la forme "vc_mswd". Et comme nous allons le voir, la compilation en mode RELEASE crée le répertoire "vc_mswu".
La compilation a aussi ajouté un autre répertoire : "\wxWidgets-2.8.10\lib\vc_lib". Le schéma suivi pour le nom du répertoire ne prend en compte que le nom du compilateur utilisé. Toutes les versions des bibliothèques compilées avec un même compilateur (DEBUG, RELEASE, UNICODE, ANSI) sont mises dans ce même répertoire ce qui facilite le paramétrage de Visual. Ce répertoire contient à sa base l'ensemble des bibliothèques générées : les fichiers .lib et les fichiers pdb (information de debug) et idb (pour la recompilation minimale). Les bibliothèques générées sont :
- wxbase28ud.lib
- wxbase28ud_net.lib
- wxbase28ud_odbc.lib
- wxbase28ud_xml.lib
- wxexpatd.lib
- wxjpegd.lib
- wxmsw28ud_adv.lib
- wxmsw28ud_aui.lib
- wxmsw28ud_core.lib
- wxmsw28ud_dbgrid.lib
- wxmsw28ud_gl.lib
- wxmsw28ud_html.lib
- wxmsw28ud_media.lib
- wxmsw28ud_qa.lib
- wxmsw28ud_richtext.lib
- wxmsw28ud_xrc.lib
- wxpngd.lib
- wxregexud.lib
- wxtiffd.lib
- wxzlibd.lib
Chaque bibliothèque porte un nom suivant le schéma :
[nom]ud.lib
Certaines n'ont pas le suffixe 'u' dès lors qu'elles ne
dépendent pas du critère UNICODE.
Toujours dans "\wxWidgets-2.8.10\lib\vc_lib"
un répertoire a été créé avec les bibliothèques :
"\wxWidgets-2.8.10\lib\vc_lib\mswud\wx" avec en son
sein un fichier "setup.h". Il s'agit du fichier d'en-tête
correspondant à la compilation. Nous verrons plus loin
qu'il est important de bien configurer Visual de façon
à ce que chaque ligne #include <wx/setup.h>
corresponde à l'inclusion de ce fichier d'en-tête et non
pas à celui dans "\wxWidgets-2.8.10\include\wx\msw\setup.h".
De façon identique, la compilation en RELEASE s'obtient en choisissant la configuration 'Unicode Release' et en demandant la génération de la solution.
Les fichiers intermédiaires sont produits dans le répertoire
"wxWidgets-2.8.10\build\msw\vc_mswu".
Les bibliothèques générées dans
"\wxWidgets-2.8.10\lib\vc_lib" sont les mêmes que
précédemment mais sans le suffixe 'd' pour DEBUG :
- wxbase28u.lib
- wxbase28u_net.lib
- wxbase28u_odbc.lib
- wxbase28u_xml.lib
- wxexpat.lib
- wxjpeg.lib
- wxmsw28u_adv.lib
- wxmsw28u_aui.lib
- wxmsw28u_core.lib
- wxmsw28u_dbgrid.lib
- wxmsw28u_gl.lib
- wxmsw28u_html.lib
- wxmsw28u_media.lib
- wxmsw28u_qa.lib
- wxmsw28u_richtext.lib
- wxmsw28u_xrc.lib
- wxpng.lib
- wxregexu.lib
- wxtiff.lib
- wxzlib.lib
Le répertoire "\wxWidgets-2.8.10\lib\vc_lib\mswu" contient le répertoire "wx" avec son fichier "setup.h".
III-C. Paramétrer Visual C++▲
Commençons par créer un projet. Pour cela, nous choisissons l'item de menu 'Projet' du sous-menu 'Nouveau' du menu 'Fichier' :
La boîte de dialogue suivante nous permet de saisir le type de projet (Projet Win32 parmi les modèles Win32), le nom du projet, son emplacement, la solution générée :
L'assistant de création de projet apparaît :
Après avoir cliqué sur suivant, nous positionnons les paramètres de notre projet 'Application Windows' et choisissons un projet vide :
Pour notre fichier source, nous choisissons l'item de menu 'Ajouter un nouvel élément...' du menu 'Projet' :
Dans la boîte de dialogue, optons pour un 'Fichier C++' et donnons-lui son nom 'main.cpp' :
Copions le code suivant et sauvegardons le fichier sous main.cpp :
#include
"wx/wx.h"
// Classe application :
class
MyApp : public
wxApp
{
public
:
// Méthode virtuelle de démarrage de l'application :
virtual
bool
OnInit();
}
;
// Notre fenêtre minimale :
class
MyFrame : public
wxFrame
{
public
:
// Constructeur :
MyFrame(const
wxString&
title);
// 2 handler d'évènements
void
OnQuit(wxCommandEvent&
event);
void
OnAbout(wxCommandEvent&
event);
private
:
// la table des évènements
DECLARE_EVENT_TABLE()
}
;
IMPLEMENT_APP(MyApp)
// Notre 'main' :
bool
MyApp::
OnInit()
{
if
( !
wxApp::
OnInit() )
return
false
;
MyFrame *
frame =
new
MyFrame(_T("Minimal wxWidgets App"
));
frame->
Show(true
);
return
true
;
}
// IDs pour nos menus et contrôles :
enum
{
Minimal_Quit =
wxID_EXIT,
Minimal_About =
wxID_ABOUT
}
;
// La table des évènements de notre fenêtre :
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(Minimal_Quit, MyFrame::
OnQuit)
EVT_MENU(Minimal_About, MyFrame::
OnAbout)
END_EVENT_TABLE()
// Le constructeur de notre classe de fenêtre :
MyFrame::
MyFrame(const
wxString&
title)
:
wxFrame(NULL
, wxID_ANY, title)
{
// Ajoutons nos menus :
wxMenu *
fileMenu =
new
wxMenu;
fileMenu->
Append(Minimal_Quit, _T("&Quitter
\t
Alt-Q"
), _T("Sortir du programme"
));
wxMenu *
helpMenu =
new
wxMenu;
helpMenu->
Append(Minimal_About, _T("&A propos...
\t
F1"
), _T("Affiche la boîte à propos"
));
// dans une barre de menu :
wxMenuBar *
menuBar =
new
wxMenuBar();
menuBar->
Append(fileMenu, _T("&Fichier"
));
menuBar->
Append(helpMenu, _T("&Aide"
));
SetMenuBar(menuBar);
// Une barre de statut :
CreateStatusBar(2
);
SetStatusText(_T("Bienvenu sur notre premier projet wxWidgets avec MinGW !"
));
}
// La gestion des évènements :
void
MyFrame::
OnQuit(wxCommandEvent&
WXUNUSED(event))
{
Close(true
);
}
void
MyFrame::
OnAbout(wxCommandEvent&
WXUNUSED(event))
{
wxMessageBox(wxString::
Format(
_T("Bienvenu avec %s!
\n
"
)
_T("
\n
"
)
_T("Ceci est notre application minimale
\n
"
)
_T("s'exécutant sous %s."
),
wxVERSION_STRING,
wxGetOsDescription().c_str()
),
_T("A propos..."
),
wxOK |
wxICON_INFORMATION,
this
);
}
Pour cette application minimale, nous nous sommes contentés de reprendre l'exemple proposé par wxWidgets : "\wxWidgets-2.8.10\samples\minimal\minimal.cpp" que nous avons un peu simplifié pour le rendre plus lisible.
Il faut maintenant configurer correctement notre nouveau projet. La configuration d'un projet avec Visual C++ se modifie en allant chercher l'item 'Propriétés de wxProjet' du menu Projet :

Dans l'arbre de gauche, nous nous positionnons sur 'Propriétés de configuration', 'C/C++' et éditons la première ligne dans le tableau de droite 'Autres répertoires Include' :
En cliquant sur le bouton avec les trois points '...', nous accédons à une boîte de dialogue où nous pouvons ajouter nos répertoires :
Attention à maintenir l'ordre d'inclusion : d'abord le
répertoire de génération puis le répertoire de wxWidgets.
Pour le mode DEBUG, nous ajoutons la directive de compilation
__WXDEBUG__ :
Il faut aussi configurer les options de liens. Nous retournons dans l'arbre de gauche et choisissons l'entrée 'Propriétés de configuration', 'Editeur de liens', 'Général'. Dans le tableau de droite, l'entrée à modifier est 'Répertoires de bibliothèques supplémentaires' dans lequel nous ajoutons le répertoire où se trouve notre génération :
Enfin, dernier paramètre, les bibliothèques avec lesquelles nous souhaitons lier l'application. Ceci est précisé en choisissant 'Entrée' dans l'arbre de gauche et en modifiant la première ligne du tableau de droite 'Dépendances supplémentaires' où nous pouvons ajouter les deux seules bibliothèques dont nous avons besoin (wxmsw28ud_core.lib et wxbase28ud.lib). Attention à rajouter les deux bibliothèques Microsoft (comctl32.lib et rpcrt4.lib) nécessaires à notre projet :
Nous pouvons demander la génération de la solution et lancer l'exécution de notre application. C'est avec plaisir que nous obtenons alors :
Vous pouvez trouver les sources de ce projet dans l'archive suivante : ProjetProjet
III-D. Compiler les fichiers exemples▲
Le répertoire "\wxWidgets-2.8.10\samples\" regroupe des projets
d'exemples illustrant différentes classes de wxWidgets.
Chaque répertoire suit le même principe. Il contient le ou les
fichiers sources ainsi que le fichier de définition du projet .dsp. Générer des
exemples devient chose facile.
Placez-vous dans le répertoire '\wxWidgets-2.8.10\samples\access',
ouvrez 'access.dsp', acceptez la conversion, choisissez
la configuration 'Unicode Debug' et demandez la génération.
La compilation d'un fichier exemple entraîne la création
d'un répertoire vc_mswud contenant l'exécutable généré.
Il est possible de générer tous les exemples en une seule
fois. Il suffit de se positionner sur le répertoire
"\wxWidgets-2.8.10\samples". Celui-ci contient un
projet 'samples.dsw' pilotant la construction de tous les exemples.
Le lecteur est maintenant familier de la démarche à suivre :
accepter les conversions, choisir la configuration
'Unicode Debug' et demander la génération.
La version express n'étant pas disponible avec les
MFCs, le projet 'mfctest' ne peut être généré.
III-E. Pour les lecteurs pressés : résumé▲
- Télécharger wxWidgetsTéléchargement de wxWidgets
- Désarchiver wxWidgets (répertoire destination sans espace)
- Ouvrez le fichier "\wxWidgets-2.8.10\build\msw\wx.dsw" et acceptez toutes les conversions vers le nouveau format de projet
-
Modifier le setup :
"\wxWidgets-2.8.10\include\wx\msw\setup.h" :
Sélectionnez
#define wxUSE_UNICODE 1 #define wxUSE_GLCANVAS 1 #define wxUSE_ODBC 1 #define wxUSE_STL 1 #define wxUSE_STD_IOSTREAM 1
- Choisissez la configuration active 'Unicode Debug' et Lancez la génération
-
Paramétrer Visual C++
- 'Projet'/'Propriétés de wxProjet...' - Arbre de gauche : 'Propriétés de configuration', 'C/C++' - tableau de droite 'Autres répertoires Include' Ajout de "\wxWidgets-2.8.10\lib\vc_lib\mswud" et "\wxWidgets-2.8.10\include" dans cet ordre
- 'Projet'/'Propriétés de wxProjet...' - Arbre de gauche : 'Propriétés de configuration', 'C/C++', 'Préprocesseur' - tableau de droite 'Définitions du préprocesseur', ajoute '__WXDEBUG__'
- 'Projet'/'Propriétés de wxProjet...' - Arbre de gauche : 'Propriétés de configuration', 'Editeur de liens', 'Général' - tableau de droite 'Répertoire des bibliothèques supplémentaires' Ajout de "\wxWidgets-2.8.10\lib\vc_lib"
- 'Projet'/'Propriétés de wxProjet...' - Arbre de gauche : 'Propriétés de configuration', 'Editeur de liens', 'Entrée' - tableau de droite 'Dépendances supplémentaires' Ajout de wxmsw28ud_core.lib, wxbase28ud.lib, comctl32.lib et rpcrt4.lib
III-F. Et avec les autres versions ?▲
Normalement, cette démarche doit fonctionner avec les dernières versions payantes de Visual C++ 2008. Cependant, je n'ai pas testé cette compilation avec ces produits, donc je ne peux vous garantir à 100% qu'il n'y a pas nécessité de quelques ajustements.