I. Introduction▲
Dans le chapitre précédent, nous avions abordé la construction d'une fenêtre et la gestion d'événements à l'aide de la bibliothèque wxWidgets. Dans celui-ci nous allons reconstruire la même application, mais les événements seront déclenchés par l'intermédiaire de menus.

II. Explication▲
La construction de la fenêtre sera identique à celle du précédent chapitre, nous ne reviendrons donc pas dessus. Pour la construction de notre menu, nous utiliserons comme pour les boutons du chapitre précédent des constantes pour identifier les options de menu. Dans cet exemple elles seront les éléments d'une énumération :
2.
3.
4.
5.
enum
{
App_Quit =
1
,
Chgt_Titre
}
;
Nous aurions pu utiliser là aussi des constantes symboliques.
Une table d'événements est là aussi élaborée de manière semblable :
2.
3.
4.
BEGIN_EVENT_TABLE(TMyFrame, wxFrame)
EVT_MENU(App_Quit, TMyFrame::
OnQuit)
EVT_MENU(Chgt_Titre, TMyFrame::
OnChgTitre)
END_EVENT_TABLE()
Venons-en à l'essentiel, la construction du menu. Pour cela nous déclarons un pointeur sur un menu 'menuFichier' et un pointeur sur une barre de menu 'menuBarre' dans le prototype de la classe TMyFrame :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class
TMyFrame : public
wxFrame
{
public
:
TMyFrame(const
wxString&
title, const
wxPoint&
pos, const
wxSize&
size,
long
style =
wxDEFAULT_FRAME_STYLE);
void
OnQuit(wxCommandEvent&
event);
void
OnChgTitre(wxCommandEvent&
event);
private
:
wxMenu *
menuFichier;
wxMenuBar *
menuBarre;
DECLARE_EVENT_TABLE()
}
;
La construction du menu se fera dans le constructeur de TMyFrame :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
TMyFrame::
TMyFrame(const
wxString&
title, const
wxPoint&
pos, const
wxSize&
size,
long
style) : wxFrame(NULL
, -
1
, title, pos, size, style)
{
menuFichier =
new
wxMenu;
menuFichier->
Append(Chgt_Titre,"Changer le titre."
);
menuFichier->
AppendSeparator();
menuFichier->
Append(App_Quit,"Quitter l'application."
);
menuBarre =
new
wxMenuBar();
menuBarre->
Append(menuFichier,("&Fichier"
));
SetMenuBar(menuBarre);
}
Ceci en créant tout d'abord le menu par un new, puis nous lui ajoutons à l'aide de sa méthode Append les options de menu avec comme paramètres leur constante d'identification puis leur texte. Les séparateurs étant ajoutés par la méthode AppendSeparator. Comme vous avez pu le remarquer, les options de menu n'ont pas besoin d'être créées par un new.
Ensuite nous créons la barre de menu 'menuBarre' puis nous lui ajoutons le menu créé précédemment avec sa méthode Append dont le premier paramètre est le pointeur de menu précédemment créé.
Pour terminer, nous ajoutons le menu à la fenêtre à l'aide de sa méthode SetMenuBar qui reçoit comme paramètre le pointeur de la barre de menu.
La destruction des menus est effectuée par l'application comme pour les boutons du chapitre précédent.
III. Code source complet▲
III-A. wxwin1.h▲
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
#ifndef wxWin1H
#define wxWin1H
//------------------------------------------------------------------------------
class
TMyApp : public
wxApp
{
public
:
virtual
bool
OnInit();
}
;
//------------------------------------------------------------------------------
class
TMyFrame : public
wxFrame
{
public
:
TMyFrame(const
wxString&
title, const
wxPoint&
pos, const
wxSize&
size,
long
style =
wxDEFAULT_FRAME_STYLE);
void
OnQuit(wxCommandEvent&
event);
void
OnChgTitre(wxCommandEvent&
event);
private
:
wxMenu *
menuFichier;
wxMenuBar *
menuBarre;
DECLARE_EVENT_TABLE()
}
;
enum
{
App_Quit =
1
,
Chgt_Titre
}
;
//------------------------------------------------------------------------------
#endif
//wxWin1H
III-B. wxwin1.cpp▲
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
#include
"wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include
"wx/wx.h"
#endif
//------------------------------------------------------------------------------
#include
"wxWin1.h"
BEGIN_EVENT_TABLE(TMyFrame, wxFrame)
EVT_MENU(App_Quit, TMyFrame::
OnQuit)
EVT_MENU(Chgt_Titre, TMyFrame::
OnChgTitre)
END_EVENT_TABLE()
IMPLEMENT_APP(TMyApp)
//------------------------------------------------------------------------------
bool
TMyApp::
OnInit()
{
TMyFrame *
frame =
new
TMyFrame("Ma première application"
,
wxPoint(150
, 150
), wxSize(480
, 360
));
frame->
Show(true
);
return
true
;
}
//------------------------------------------------------------------------------
TMyFrame::
TMyFrame(const
wxString&
title, const
wxPoint&
pos, const
wxSize&
size,
long
style) : wxFrame(NULL
, -
1
, title, pos, size, style)
{
SetIcon(wxICON(monicone));
SetBackgroundColour(wxSystemSettings::
GetColour(wxSYS_COLOUR_BTNFACE));
menuFichier =
new
wxMenu;
menuFichier->
Append(Chgt_Titre,"Changer le titre."
);
menuFichier->
AppendSeparator();
menuFichier->
Append(App_Quit,"Quitter l'application."
);
menuBarre =
new
wxMenuBar();
menuBarre->
Append(menuFichier,("&Fichier"
));
SetMenuBar(menuBarre);
}
//------------------------------------------------------------------------------
void
TMyFrame::
OnQuit(wxCommandEvent&
WXUNUSED(event))
{
Close(true
);
}
//------------------------------------------------------------------------------
void
TMyFrame::
OnChgTitre(wxCommandEvent&
WXUNUSED(event))
{
SetTitle("Nouveau Titre"
);
}
//------------------------------------------------------------------------------
IV. Remarques sur ce document▲
Ce document relate la réalisation d'une application simple. J'ai réalisé les compilations dans l'EDI de C++ Builder, wxWidgets étant installé comme vu dans l'article : « Installation de wxWidgets dans l'EDI de C++ Builder ».
Pour les autres compilateurs, veuillez vous référer à leur documentation respective ainsi qu'à la documentation de wxWindows.
À bientôt,
Avec la contribution d'Alacazam pour la relecture.