La librairie wxWidgets (anciennement wxWindows) est une librairie multi-plateformes permettant de créer des interfaces utilisateurs. À la différence d'autres boîtes à outils qui tentent de restituer une interface utilisateur identique sur toutes les plateformes, wxWindows restitue des abstractions similaires, mais avec l'apparence native de chacun sous-jacent, ce qui est moins dépaysant pour les utilisateurs finaux.
Avant de commencer, quelques rappels sur les commandes qui pourront être utiles :
Notre premier programme va simplement nous permettre de voir comment faire pour utiliser la librairie et créer une simple fenêtre. Nous allons placer l'intégralité du code dans un même fichier.
#include <wx/wx.h>
class HelloApp : public wxApp
{
virtual bool OnInit();
};
IMPLEMENT_APP(HelloApp)
class HelloFrame : public wxFrame
{
public:
HelloFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
};
enum
{
ID_Quit = 1,
ID_About
};
On commence par inclure le fichier de déclaration de la librairie : wx/wx.h. On déclare ensuite une classe pour notre application qui dérive de la classe wxApp, et l'on utilise la macro IMPLEMENT_APP pour définir quelques fonctions utiles concernant notre application. En pratique, cette macro s'étend en :
wxApp wxCreateApp() { return new HelloApp; }
wxAppInitializer wxTheAppInitializer((wxAppInitializerFunction) wxCreateApp);
HelloApp& wxGetApp() { return (HelloApp)wxTheApp; }
Les deux premières fonctions sont utiles à la librairie. La troisième nous sera très utile quand nous voudrons accéder à notre application. On déclare ensuite une classe représentant notre fenêtre principale, et qui réagira aux évènements "A propos" et "Quitter", pour lesquels nous définissons ensuite des identifiants par une énumération.
Passons maintenant à l'implémentation des fonctions définies ci-dessus :
bool HelloApp::OnInit()
{
HelloFrame *frame = new HelloFrame("Hello World", wxPoint(50, 50), wxSize(450,350));
frame->Connect(ID_Quit, wxEVT_COMMAND_MENU_SELECTED, (wxObjectEventFunction)& HelloFrame::OnQuit);
frame->Connect(ID_About, wxEVT_COMMAND_MENU_SELECTED, (wxObjectEventFunction)& HelloFrame::OnAbout);
frame->Show(true);
SetTopWindow(frame);
return true;
}
HelloFrame::HelloFrame(const wxString& title, const wxPoint& pos, const wxSize& size) : wxFrame((wxFrame*)NULL, -1, title, pos, size)
{
wxMenuBar *menuBar = new wxMenuBar;
wxMenu *menuFile = new wxMenu;
menuFile->Append(ID_About, "&About...");
menuFile->AppendSeparator();
menuFile->Append(ID_Quit, "E&xit");
menuBar->Append(menuFile, "&File");
SetMenuBar(menuBar);
CreateStatusBar();
SetStatusText("Demonstration pour wxWidgets");
}
void HelloFrame::OnQuit(wxCommandEvent&)
{
Close(true);
}
void HelloFrame::OnAbout(wxCommandEvent&)
{
wxMessageBox("Exemple de Hello World avec wxWidgets\n-=(the3fold)=-\nhttp://the3fold.free.fr", "A propos d'Hello World", wxOK | wxICON_INFORMATION, this);
}
La fonction OnInit de la classe application est appelée automatiquement lors du démarrage du programme. On utilise cette fonction pour créer notre fenêtre principale, et connecter les évenements ID_Quit et ID_About aux fonctions correspondantes. Dans le constructeur de la fenêtre principale, on crée le menu qui permettra de déclencher ces évenements. On implémente ensuite ces fonctions.
C'est tout pour cet exemple qui nous aura permis de faire nos premiers pas avec wxWidgets.