Contents Up Previous Next

Exemple Hello World wxWidgets

Comme de nombreuses personnes ont demandé qu'un mini-exemple soit publié ici, afin de pouvoir faire une rapide analyse concernant la syntaxe et les principes de base, vous pouvez désormais jeter un coup d'oeil au "Hello World" wxWidgets:

Vous devez inclure les fichiers en-tête wxWidgets, bien entendu. Cela peut-être fait fichier par fichier (comme #include "wx/window.h") ou en utilisant un fichier global (#include "wx/wx.h"). Cela est également utile sur les plateformes supportant les headers précompilés tels que tous les compilateurs principaux sur les plateformes Windows.

//
// file name: hworld.cpp
//
//   purpose: wxWidgets "Hello world"
//

// Pour les compilateurs supportant la précompilation, inclue "wx/wx.h".
#include "wx/wxprec.h"

#ifdef __BORLANDC__
    #pragma hdrstop
#endif

#ifndef WX_PRECOMP
    #include "wx/wx.h"
#endif
Quasiment toutes les applications devraient définir une nouvelle classe dérivée de wxApp. Le programme peut être initialisé en surchargeant la méthode OnInit() de wxApp, par exemple, pour créer une nouvelle fenêtre principale.

class MyApp: public wxApp
{
    virtual bool OnInit();
};
La fenêtre principale est créée en dérivant une classe depuis wxFrame et en lui donnant un menu et une barre d'état dans son constructeur. De même, toute classe voulant répondre à n'importe quel "événement" (tel que clic de souris, messages depuis un bouton ou un menu) doit déclarer une table d'événements en utilisant la macro ci-dessous. Finalement, la façon de réagir à de tels événements doit être faite dans des "gestionnaires". Dans notre exemple, nous réagissons à deux éléments de menus, un pout "Quitter" et un pour afficher la fenêtre "A propos de". Ces gestionnaires ne doivent pas être virtuels.

class MyFrame: public wxFrame
{
public:
    MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);

    void OnQuit(wxCommandEvent& event);
    void OnAbout(wxCommandEvent& event);

private:
    DECLARE_EVENT_TABLE()
};
Afin d'être capable de réagir à une commande de menu, il doit lui être donné un identifiant unique, tel qu'une constante ou un "enum".

enum
{
    ID_Quit = 1,
    ID_About,
};
Ensuite, nous implémentons simplement une table d'événements dans laquelle les événements sont routés vers les fonctions de leurs gestionnaires respectifs dans la classe wxFrame. Il y a des macros prédéfinies pour router tous les événemnets communs, allant de la sélection d'une entrée dans une zone de liste, à un événement de redimensionnement quand un utilisateur redimensionne une fenêtre à l'écran. Si -1 est donné comme identifiant, le gestionnaire donné va être invoqué pour tous les événements du type spécifié, ainsi vous n'aurez qu'une entrée à ajouter dans la table des événements pour toutes les commandes de menu, ou toutes les commandes par bouton, etc. L'origine d'un événement peut être retrouvée dans le gestionnaire d'événements car le (seul) paramètre d'un gestionnaire d'événement est une référence vers un objet wxEvent, qui contient des informations au sujet de l'événement (telles que l'identifiant et le pointeur vers la classe qui a émis l'événement).

BEGIN_EVENT_TABLE(MyFrame, wxFrame)
    EVT_MENU(ID_Quit,  MyFrame::OnQuit)
    EVT_MENU(ID_About, MyFrame::OnAbout)
END_EVENT_TABLE()
Comme dans tout programmes, il doit y avoir une fonction "main". Sous wxWidgets, la fonction "main" est implémentée en utilisant cette macro, qui crée une instance de l'application et démarre le programme.

IMPLEMENT_APP(MyApp)
Comme mentionné précédement, wxApp::OnInit() est appelée au démarrage et doit être utilisée pour initialiser le programme, par exemple en affichant un "splash screen" et en créant la fenêtre principale (ou plusieurs). La frame doit obtenir une texte de barre de titre ("Hello World") et une position et taille de démarrage. Une frame peut également être déclarée pour être la fenêtre de plus haut niveau. Retourner true indique une initialisation correcte.

bool MyApp::OnInit()
{
    MyFrame *frame = new MyFrame( "Hello World", wxPoint(50,50), wxSize(450,340) );
    frame->Show( true );
    SetTopWindow( frame );
    return true;
}
Dans le constructeur de la fenêtre princopale (ou plus tard) nous créons un menu avec deux éléments de menu ainsi qu'une barre d'outils à afficher en bas de la fenêtre principale. Les deux doivent être "annoncés" à la frame avec les appels respectifs.

MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
       : wxFrame((wxFrame *)NULL, -1, title, pos, size)
{
    wxMenu *menuFile = new wxMenu;

    menuFile->Append( ID_About, "&A propos de..." );
    menuFile->AppendSeparator();
    menuFile->Append( ID_Quit, "&Quitter" );

    wxMenuBar *menuBar = new wxMenuBar;
    menuBar->Append( menuFile, "&Fichier" );

    SetMenuBar( menuBar );

    CreateStatusBar();
    SetStatusText( "Bienvenue sous wxWidgets!" );
}
Voici les gestionnaires d'événements actuels. MyFrame::OnQuit() ferme la fenêtre principale en appelant Close(). Le paramètre true indique que les autres fennêtres n'ont aucun pouvoir de veto comme après avoir demandé "Voulez-vous vraiment fermer ?". S'il n'y a pas d'autre fenêtre principale restante, l'application se terminera.

void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
    Close( true );
}
MyFrame::OnAbout() va afficher une petite fenêtre avec un peu de texte dedans; dans ce cas, une fenêtre "A propos de" typique avec une information sur le programme.

void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
{
    wxMessageBox( "Ceci est un exemple 'Hello World' wxWidgets",
                  "A propos de Hello World", wxOK | wxICON_INFORMATION );
}