Retrouvez cet article dans : Linux Magazine 79
1. Présentation wxWidgets
xWidgets anciennement nommée wxWindows est une bibliothèque multiplateforme de haut-niveau. Développée au départ par Julian Smart dès 1992 à " Artificial Intelligence Applications Institute ", elle s’est enrichie de plusieurs versions passant par l’utilisation de X11, Motif ou GTK+ pour les systèmes UNIX, MS Windows ou MAC OS (liste non exhaustive). Elle est réalisée sur la licence LGPL permettant une utilisation libre ou commerciale sans avoir besoin de fournir les sources des applications. La particularité principale par rapport aux bibliothèques similaires telles Qt ou java (au sens langage+plate-forme) est d’utiliser au maximum les contrôles natifs du système sur lequel elle est installée. Une comparaison rapide par rapport aux bibliothèques existantes s’impose donc.2. Comparaison avec d’autres bibliothèques
2.1 Qt de Trolltech
Choisi pour le projet KDE, il s’agit d’un excellent choix (déjà présenté dans le magazine), multiplateforme, gratuit pour une utilisation non commerciale sur quasiment tous les systèmes, avec un support technique pour la version payante. Cependant Trolltech n’utilise pas les objets graphiques natifs (look’n’feel) des plate-formes, il utilise ses propres objets (sauf sur Mac ?) et se distingue donc des autres applications du système, avec l’avantage d’avoir le même comportement partout. De plus, sa conception est plus conforme à l’esprit objet que ne l’est wxWidgets et un environnement RAD (Rapid Application Development) de qualité (Qt designer) existe. Mais un pré compilateur spécial (moc) est nécessaire pour compiler les programmes. Site : www.trolltech.com2.2 FLTK
Il s’agit d’un projet gratuit pour utilisation commerciale, uniquement axé sur des objets graphiques non natifs (comme Qt). Il y a un concepteur d’interfaces prévu (FLUID). Le code généré est de faible taille avec une API (Application Programmable Interface) de bonne facture, mais il faut utiliser des bibliothèques annexes pour les parties autres que le graphisme (qui possèdent d’ailleurs des objets assez élaborés). Site : www.fltk.org2.3 Fox-toolkit
Il s’agit d’un projet similaire à wxWidgets mais n’utilisant que des objets graphiques non natifs. Plus élaboré que FLTK il ressemble à wxWidgets (ou Qt) en étant moins complet sur certains points, en revanche, il est a priori plus rapide que wxWidgets ou Qt. Il possède un RAD gratuit, mais il est nécessaire d’utiliser des bibliothèques annexes pour les parties autres que le graphisme. Site : www.fox-toolkit.org2.4 Ultimate++
Projet similaire à wxWidgets mais uniquement sur les systèmes Linux et MS Windows. La comparaison est assez difficile à faire et celle fournie sur le site n’est pas correcte. A tester donc. Site : http://upp.sourceforge.net2.5 Gtk+
Il s’agit d’une bibliothèque très connue écrite en C, mais dont le portage n’est pas complet sur tous les systèmes. De plus, les objets ne sont pas natifs. Une utilisation en C++ est possible grâce à Gtkmm ou VDK. Cependant, il faut recourir à des bibliothèques annexes pour les parties autres que le graphisme. Site : www.gtk.org2.6 Java
Il s’agit d’un produit (une plate-forme) gratuit de Sun permettant d’avoir un fonctionnement multiplateforme sans recompilation. Il faut en revanche que la machine virtuelle java (JVM) soit installée sur le système. Le look’n’feel n’est pas respectée (en général) et les programmes demandent des ressources plus importantes pour fonctionner avec une vitesse inférieure à celle d’un programme en C++. Cependant, la gestion mémoire n’étant plus du ressort du programmeur (plus de pointeurs), cela peut simplifier les choses, d’autant que le langage est moins complexe sur certains points que le C++.2.7 wxWidgets
Lorsque l’on cherche une bibliothèque permettant une programmation avec des objets graphiques, une utilisation du réseau, des flux... il y a 3 choix possibles : Qt, wxWidgets et java. Si on rajoute : gratuité des applications commerciales, un produit portable, une bonne documentation, un grand choix de langage (Perl, Python, Lua, C#...), un produit mature avec une grande communauté, un look’n’feel du système, alors wxWidget apparaît comme étant la seule bibliothèque à offrir ces caractéristiques. On pourra reprocher : l’utilisation de macros et non des templates en C++ (mais dans l’avenir un passage pur à la STL est prévu), ainsi qu’une programmation moins orientée objet que Qt ou java, mais est-ce vraiment un si gros défaut ? Comme il s’agit d’une sur-couche (une façade) de l’API du système, il existe des différences (minimes) entre les versions avec une légère perte des possibilités de l’API d’origine. Mais une émulation des objets graphiques est réalisée lorsqu’un objet n’existe pas. De plus, de nombreux programmes de conception d’interfaces existent, mais aucun n’offre une utilisation aussi puissante et complète qu’un Kylix ou Qt designer sous Linux (mais cet inconvénient à tendance à s’estomper si on sépare comme il se doit les données des interfaces). Cependant n’ayant pas essayé wxDesigner je ne puis le comparer à Qt designer. Il existe des environnements développés avec wxWidgets : Code::Blocks (IDE), wxFormbuilder, wxRapid, wxGlade qui laissent entrevoir à l’avenir des solutions du type RAD. Site : www.wxwidgets.org2.8 Conclusion des comparaisons
Je ne suis pas en train de dire qu’il s’agit de la meilleure bibliothèque, mais elle permet de faire de nombreux projets sans avoir besoin de rajouter d’autres bibliothèques annexes et elle conserve l’aspect natif du système pour les objets graphiques. Du fait de son âge, plus de 13 ans d’existence, il y a une forte communauté prête à répondre aux nombreuses questions des utilisateurs. Cependant, toutes les bibliothèques citées plus haut méritent qu’on s’y attarde avant de faire un choix, ce qui ne fut pas facile dans mon cas : VDK, Gtkmm, Qt, java ? La gratuité, l’utilisation par de nombreuses sociétés et les réponses rapides de la communauté wxWidgets ont fait pencher la balance. Donc merci à toute cette équipe pour ce magnifique travail.3. Installation et utilisation
3.1 Installation
La version stable actuelle est la 2.6.2 et existe en un seul exemplaire pour les différents systèmes sauf pour les systèmes UNIX où il y a 3 versions (wxX11, wxMotif et wxGTK). On notera le développement d’une version spéciale wxUniversal qui n’utilise pas les objets natifs (comme le fait Qt), mais émule les différents objets. La première étape est de télécharger sur le site le fichier : je prendrais comme exemple wxGTK avec comme fichiertar -xzf wxGTK-2.6.2.tar.gz cd wxGTK-2.6.2 mkdir wxGTK cd wxGTK .././configure make su make install ldconfigPour tester si tout fonctionne faire
3.2 Compilation des programmes
Il suffit simplement de taper :4. Premier programme
4.1 Programme permettant d’afficher une fenêtre
Classique parmi les classiques, voici une fenêtre " Hello World ", premier programme (en anglais désolé) fourni par tous les langages et toutes les bibliothèques (wxWidgets n’échappant pas à la règle). Il s’agit du programme le plus simple pour afficher une fenêtre.#include <wx/wx.h>
// l’application
class MyApp : public wxApp
{
public:
// équivalent du main ou winmain
virtual bool OnInit();
};
IMPLEMENT_APP(MyApp)
// entrée de l’application
bool MyApp::OnInit()
{ // création d’une fenêtre
wxFrame *frame = new wxFrame((wxFrame *)NULL,
-1, wxT("Hello World"),
wxPoint(50,50),wxSize(450,340) );
// on affiche la fenêtre
frame->Show(true);
// on la place en premier plan
SetTopWindow(frame);
// on indique que la boucle d’événements peut continuer
return true;
}

4.2 Améliorations du programme
4.2.1 Changer la fermeture normale de la fenêtre
On souhaiterait fermer la fenêtre sur la troisième tentative, pour cela il suffit de créer une nouvelle classe dérivée declass MyFrame : public wxFrame {
public:
MyFrame(wxWindow* f,int n,wxString t,
wxPoint p,wxSize s) :
wxFrame(f,n,t,p,s) {}
// méthode associée à la fermeture
void OnClose(wxCloseEvent& event);
// déclaration d’une table d’événements
DECLARE_EVENT_TABLE()
};
void MyFrame::OnClose(wxCloseEvent& event) {
static int n=0;
n++;
// on détruit la fenêtre (une autre solution existe)
if (n>=3) Destroy();
}
// contrôleur d’événements au-dessus de wxFrame
BEGIN_EVENT_TABLE(MyFrame,wxFrame)
EVT_CLOSE(MyFrame::OnClose)
END_EVENT_TABLE()

void MyFrame::OnClose(wxCloseEvent& event)
{
wxMessageDialog box((wxWindow*)NULL,
wxT(“Sur de quitter ?”),
wxEmptyString,wxYES_NO );
if (box.ShowModal()==wxID_YES) event.Skip();
}
Pour laisser l’événement se poursuivre, il suffit d’utiliser la méthode Skip().
4.2.2 Ajout de menus
On va ici ajouter des menus et traiter la sélection. Les événements envoyés sont du typeclass MyFrame : public wxFrame {
public:
MyFrame(wxWindow* f,int n,
wxString t,wxPoint p,wxSize s);
// Traitement de la fermeture de la fenêtre
void OnClose(wxCloseEvent& event);
// On sélectionne le menu Nouveau
void MenuNouveau(wxCommandEvent& event);
// on veut quitter par le menu
void MenuQuitter(wxCommandEvent& event);
// menu information de la fenêtre
void MenuAide(wxCommandEvent& event);
DECLARE_EVENT_TABLE()
enum {
// numéro associé à chaque menu
id_nouveau,id_quit,id_aide
};
};
// table d’événements associée
BEGIN_EVENT_TABLE(MyFrame,wxFrame)
EVT_CLOSE(MyFrame::OnClose)
EVT_MENU(id_nouveau,MyFrame::MenuNouveau)
EVT_MENU(id_quit,MyFrame::MenuQuitter)
EVT_MENU(id_aide,MyFrame::MenuAide)
END_EVENT_TABLE()

MyFrame::MyFrame(wxWindow* f,int n,
wxString t,wxPoint p,wxSize s) :
wxFrame(f,n,t,p,s,
wxSTAY_ON_TOP|wxDEFAULT_FRAME_STYLE )
{
// une barre de menu
wxMenuBar* menubar=new wxMenuBar();
// le premier menu
wxMenu* menu_1 = new wxMenu();
menu_1->Append(id_nouveau, wxT(“&Nouveau”),
wxT(“Une nouvelle fenetre”),
wxITEM_NORMAL);
menu_1->Append(id_quit, wxT(“&Quit”),
wxT(“Quitter la fenetre”), wxITEM_NORMAL);
// ajout du premier menuà la barre
menubar->Append(menu_1, wxT("&File"));
// le deuxième menu
wxMenu* menu_2 = new wxMenu();
menu_2->Append(id_aide, wxT("&A propos"),
wxT("A propos de la fenetre"),
wxITEM_NORMAL);
menubar->Append(menu_2, wxT("&Aide"));
// on affecte la barre de menu à la fenêtre
SetMenuBar(menubar);
}
La première chaîne associée est le nom du menu, la deuxième est une information pour l’utilisateur. Cependant, cette information n’est pas visible sur cette version de la fenêtre car celle-ci ne contient pas de ligne d’informations. On pourra noter que l’aide ne s’affiche pas par défaut avec des " ballons " mais dans la barre de statut.
4.2.3 Ajout d’une ligne d’information
Cette ligne permet d’afficher les informations sur les objets sélectionnés ou pouvant être sélectionnés par un passage de la souris. Pour ajouter cette ligne, il suffit de rajouter dans le constructeur de la fenêtre (donc// 1 seule zone de texte wxStatusBar* statusbar=CreateStatusBar(1); // texte dans la 1ere zone=>0 statusbar->SetStatusText( wxT(“Aide de la fenetre”),0 );

// dans le constructeur de la fenêtre.
SetToolTip(wxT("Une fenetre"));
4.2.4 Ajout d’une barre d’outils
Il est souvent plus intéressant et plus rapide d’utiliser une barre d’outils avec des images représentant les actions à effectuer telles " disquette " pour sauvegarder, " dossier " pour ouvrir un fichier... Pour cela, il convient de rajouter une barre d’outils avec les mêmes numéros associés que les menus, car les événements sont les mêmes. Le code à ajouter dans le constructeur est le suivant :// création de la barre d’outils
wxToolBar *toolbar=new wxToolBar((wxWindow*)this,-1);
toolbar->AddTool(id_nouveau, wxT("Nouveau"),
wxBitmap(wxT("nouveau.png"),
wxBITMAP_TYPE_ANY), wxNullBitmap,
wxITEM_NORMAL, wxT(“Nouvelle fenetre”),
// on ajoute un outil avecl’image associée
wxT("Ouvrir une nouvelle fenetre"));
toolbar->AddTool(id_aide, wxT("A propos"),
wxBitmap(wxT("a_propos.png"),
wxBITMAP_TYPE_ANY), wxNullBitmap,
wxITEM_NORMAL, wxT("A propos"),
wxT("Une aide"));
toolbar->AddTool(id_quit, wxT("Quit"),
wxBitmap(wxT("quit.png"),
wxBITMAP_TYPE_ANY),
wxNullBitmap, wxITEM_NORMAL,
wxT(“Au revoir”),
wxT(“Vous quittez deja ?”));
// on fixe la barre d’outils dans la fenêtre
SetToolBar(toolbar);
// on "réalise" cette barre d’outils
// pour qu’elle puisse s’afficher
toolbar->Realize();






Laissez une réponse
Vous devez avoir ouvert une session pour écrire un commentaire.