Programmation par Objets en C++
Cl ´ement PERNET
L3-MI, UFR IM2AG, Universit ´e Grenoble Alpes
Plan du cours
Programmation graphique et ´ev ´enementielle (6-7)
Plan
Programmation graphique et ´ev ´enementielle (6-7) G ´en ´eralit ´es
La GUI wxWidget
Premiers composants : textes Gestion des ´Evennements Organisation en panels Composants usuels
Plan
Programmation graphique et ´ev ´enementielle (6-7) G ´en ´eralit ´es
La GUI wxWidget
Premiers composants : textes Gestion des ´Evennements Organisation en panels Composants usuels
Programmation graphique et ´ev ´enementielle
Programme `a interface console
I l’utilisateur se laisse guider par le programme I dialogues ´equentiel
I En mode texte
Programme `a interface graphique
GUI : Graphical User Interface
I aspect graphique des contr ˆoles (boutons, fen ˆetre, boˆıtes, menus d ´eroulants, ...)
I l’utilisateur donne des ordres (clics sur menus, boutons, ...) I comportement ´ev ´enementieldu programme et non plus
s ´equentiel
Programmation graphique et ´ev ´enementielle
Programme `a interface console
I l’utilisateur se laisse guider par le programme I dialogues ´equentiel
I En mode texte
Programme `a interface graphique
GUI : Graphical User Interface
I aspect graphique des contr ˆoles (boutons, fen ˆetre, boˆıtes, menus d ´eroulants, ...)
I l’utilisateur donne des ordres (clics sur menus, boutons, ...) I comportement ´ev ´enementieldu programme et non plus
s ´equentiel
Quelques biblioth `eques C++ de GUI (les + connues)
Depuis Syst Desktop env.
Utilis ´e par license
wxWidget 1992 Win, Linux, Mac, iOS
Dropbox, aMule, Audacity, fileZilla, hugin, ...
wxWidget Licence
≈LGPL
Qt 1995 Win,
Linux, Mac, iOS, android, ...
KDE, blackberry, Telsa in-car UI
VLC, Adobe, Telegram, OBS, Mathematica, ...
GPL, LGPL, commerciale
GTK+ 1996 Win, Linux, Mac
Gnome, Cinnamon
Chromium, GIMP, inkscape, ...
GPL, LGPL, commerciale
Plan
Programmation graphique et ´ev ´enementielle (6-7) G ´en ´eralit ´es
La GUI wxWidget
Premiers composants : textes Gestion des ´Evennements Organisation en panels Composants usuels
Installation de wxWidget
https://www.wxwidgets.org/
Installation sous Linux Ubuntu
$> sudo apt install build-essential
$> sudo apt install libwxgtk3.0-gtk3-dev
$> cd /usr/include
$> sudo ln -sf wx-3.0/wx wx
Dans le Makefile :
CXXFLAGS=‘wx-config --cxxflags‘
LDLIBS=‘wx-config --libs‘
Fonctionnement : une premi `ere fen ˆetre
I Une f ˆenetre est un objet d ´eriv ´e dewxFrame fenetre.h
#include <wx/wx.h>
class Fenetre : public wxFrame{
public:
Fenetre(const wxString& title);
};
fenetre.cpp
#include <fenetre.h>
Fenetre::Fenetre(const wxString& title)
: wxFrame (NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150)) {
Centre();
}
Fonctionnement : une premi `ere fen ˆetre
I Toute application xwWidget repose sur un objet d’une classe d ´eriv ´ee dewxApp.
Initialisation : la m ´ethode virtuelleOnInitdoit ˆetre red ´efinie
class MyApp : public wxApp { public:
bool OnInit() override;
};
Fonctionnement : une premi `ere fen ˆetre
I Toute application xwWidget repose sur un objet d’une classe d ´eriv ´ee dewxApp.
Initialisation : la m ´ethode virtuelleOnInitdoit ˆetre red ´efinie
I pour cr ´eer la fen ˆetre principale I est la rendre visible
class MyApp : public wxApp { public:
bool OnInit() override;
};
bool MyApp::OnInit() {
Fenetre *fenetre = new Fenetre(wxT("Ma Fenetre"));
fenetre->Show(true);
return true;
}
IMPLEMENT_APP(MyApp)
}
Instanciation et lancement automatique
IMPLEMENT_APP(MyApp)etDECLARE_APPg ´en `erent automatiquement :
I lemain
I qui instancie un objet deMyApp
I et appelle sonOnInit. Sifalseest retourn ´e : arr ˆet de l’application
I cr ´e ´e la fonction globalewxGetApp()renvoyant une ref ´erence vers cet objet
Une premi `ere fen ˆetre (r ´esum ´e)
fenetre.h
#include <wx/wx.h>
class Fenetre : public wxFrame{
public:
Fenetre(const wxString& title);
};
fenetre.cpp
#include <fenetre.h>
Fenetre::Fenetre(const wxString&
title)
: wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150)) { Centre(); // pour centrer la
fenˆetre au milieu de l’´e cran
}
main.h
#include <wx/wx.h>
class MyApp : public wxApp { public:
bool OnInit() override;
};
main.cpp
#include "main.h"
#include "fenetre.h"
bool MyApp::OnInit() {
Fenetre *fenetre = new Fenetre (wxT("Ma Fenetre"));
fenetre->Show(true);
return true;
}
IMPLEMENT_APP(MyApp);
Plan
Programmation graphique et ´ev ´enementielle (6-7) G ´en ´eralit ´es
La GUI wxWidget
Premiers composants : textes Gestion des ´Evennements Organisation en panels Composants usuels
Ajout de composants `a une fen ˆetre
I comme attributs (pointeurs)
I construits explicitement (new) dans le constructeur de la fen ˆetre
I connaˆıt sa fen ˆetre car pass ´ee (parthis) `a son constructeur
I associ ´e `a un identifiant (simpleintd’unenum)
I puis ´evetuellement cr ´eation d’´ev ´enementsliant l’objet (ID)
`a une m ´ethode d ´ecrivant l’action `a faire.
Le texte statique : la classe
wxStaticText fenetre.h
#include <wx/wx.h>
class Fenetre : public wxFrame{
public:
Fenetre(const wxString& title);
wxStaticText * monTxT;
};
enum {STATICTXT_monTxT = 101 }; // ID du composant
fenetre.cpp
#include <fenetre.h>
Fenetre::Fenetre(const wxString& title)
:wxFrame(NULL,wxID_ANY,title,wxDefaultPosition,wxSize(280,160)){
monTxt = new wxStaticText (this, // passage de la fenetre STATICTXT_monTxT, // ID
_T("Un texte"), // texte wxDefaultPosition,// position wxDefaultSize // taille );
}
Le text statique : la classe
wxStaticTextI lorsqu’il n’y a qu’un composant sur une fen ˆetre, il est redimensionn ´e `a la taille maximale de la fen ˆetre.
La barre d’ ´etat
Dans le constructeur de la fen ˆetre :CreateStatusBar(n) pour cr ´eernzones
Fenetre(...) : wxFrame(...){
...
CreateStatusBar (2); // avec 2 zones de texte SetStatusText(wxT("Bonjour zone 0"),0);
SetStatusText(wxT("Bonjour zone 1"),1);
}
Syst `eme de pile de messages :
getStatusBar(): retourne 1 ptr vers la StatusBar de la fen. pushStatusText("txt", i): empile ”txt” dans la zonei popStatusText(i): d ´epile le texte de la zonei
La barre d’ ´etat
Dans le constructeur de la fen ˆetre :CreateStatusBar(n) pour cr ´eernzones
Fenetre(...) : wxFrame(...){
...
CreateStatusBar (2); // avec 2 zones de texte SetStatusText(wxT("Bonjour zone 0"),0);
SetStatusText(wxT("Bonjour zone 1"),1);
}
Syst `eme de pile de messages :
getStatusBar(): retourne 1 ptr vers la StatusBar de la fen.
pushStatusText("txt", i): empile ”txt” dans la zonei popStatusText(i): d ´epile le texte de la zonei
Plan
Programmation graphique et ´ev ´enementielle (6-7) G ´en ´eralit ´es
La GUI wxWidget
Premiers composants : textes Gestion des ´Evennements Organisation en panels Composants usuels
Gestion des ´evennements
Prog. ´ev ´enementielle :les actions sont d ´eclench ´ees par des
´ev ´enements provenant :
de l’utilisateur : clic souris sur un bouton, un menu, saisie de texte, survol d’une zone par la souris, touche press ´ee,
ou autre : timer ´ecoul ´e, activit ´e r ´eseau, etc
Un ´ev ´enement est d ´ecrit par :
un type : valeur du typewxEventType, ID unique de la nature de l’ ´ev ´enement
une classe : objet d’une classe d ´eriv ´ee dewxEventcontenant les informations li ´ees `a l’evt : plusieurs types partagent la m ˆeme classe (ex :wxCommandEvent pour boutons et s ´election de list-box)
une source : l’objet ayant g ´en ´er ´e l’ayant g ´en ´er ´e
Gestion des ´evennements
Prog. ´ev ´enementielle :les actions sont d ´eclench ´ees par des
´ev ´enements provenant :
de l’utilisateur : clic souris sur un bouton, un menu, saisie de texte, survol d’une zone par la souris, touche press ´ee,
ou autre : timer ´ecoul ´e, activit ´e r ´eseau, etc Un ´ev ´enement est d ´ecrit par :
un type : valeur du typewxEventType, ID unique de la nature de l’ ´ev ´enement
une classe : objet d’une classe d ´eriv ´ee dewxEventcontenant les informations li ´ees `a l’evt : plusieurs types partagent la m ˆeme classe (ex :wxCommandEvent pour boutons et s ´election de list-box)
une source : l’objet ayant g ´en ´er ´e l’ayant g ´en ´er ´e
Gestion des ´ev ´enements
Deux modes :
statique : La table des ´ev ´enements (par macros) fix ´ee `a la compilation
ne peut g ´erer que les ´ev ´enements de l’objet o `u elle est d ´efinie
dynamique : La table des ´ev ´enementsBind
lie n’importe quel ´ev ´enement `a n’importe quelle fonction
modifiable `a l’ ´ex ´ecution
Gestion des ´ev ´enements
La table des ´ev ´enements
I Gestion localis ´ee `a une classe d ´eriv ´ee de
wxEventHandler. C’est le cas dewxWindow, wxFrame en g ´en ´eral g ´er ´e dans la fen ˆetre portant les composants
I wxDECLARE_EVENT_TABLE()dans la d ´eclaration de la classe
I une/des m ´ethodes gestionnaire d’ ´ev ´enement : void monGest (EvtType& ev);
o `uEvtTypeest d ´eriv ´ee dewxEvent
I D ´efinition (dans le cpp de d ´efinition de la classe)
wxBEGIN_EVENT_TABLE(MaFenetre, wxFrame) EVT_BUTTON(BUTTON_id, MyFrame::MonGest) EVT_MENU(MENU_about, MyFrame::GestAbout) EVT_SIZE(MyFrame::GestSize)
wxEND_EVENT_TABLE()
Gestion des ´ev ´enements
La table des ´ev ´enements
I Gestion localis ´ee `a une classe d ´eriv ´ee de
wxEventHandler. C’est le cas dewxWindow, wxFrame en g ´en ´eral g ´er ´e dans la fen ˆetre portant les composants I wxDECLARE_EVENT_TABLE()dans la d ´eclaration de la
classe
I une/des m ´ethodes gestionnaire d’ ´ev ´enement : void monGest (EvtType& ev);
o `uEvtTypeest d ´eriv ´ee dewxEvent
I D ´efinition (dans le cpp de d ´efinition de la classe)
wxBEGIN_EVENT_TABLE(MaFenetre, wxFrame) EVT_BUTTON(BUTTON_id, MyFrame::MonGest) EVT_MENU(MENU_about, MyFrame::GestAbout) EVT_SIZE(MyFrame::GestSize)
wxEND_EVENT_TABLE()
Gestion des ´ev ´enements
La table des ´ev ´enements
I Gestion localis ´ee `a une classe d ´eriv ´ee de
wxEventHandler. C’est le cas dewxWindow, wxFrame en g ´en ´eral g ´er ´e dans la fen ˆetre portant les composants I wxDECLARE_EVENT_TABLE()dans la d ´eclaration de la
classe
I une/des m ´ethodes gestionnaire d’ ´ev ´enement : void monGest (EvtType& ev);
o `uEvtTypeest d ´eriv ´ee dewxEvent
I D ´efinition (dans le cpp de d ´efinition de la classe)
wxBEGIN_EVENT_TABLE(MaFenetre, wxFrame) EVT_BUTTON(BUTTON_id, MyFrame::MonGest) EVT_MENU(MENU_about, MyFrame::GestAbout) EVT_SIZE(MyFrame::GestSize)
wxEND_EVENT_TABLE()
Gestion des ´ev ´enements
La table des ´ev ´enements
I Gestion localis ´ee `a une classe d ´eriv ´ee de
wxEventHandler. C’est le cas dewxWindow, wxFrame en g ´en ´eral g ´er ´e dans la fen ˆetre portant les composants I wxDECLARE_EVENT_TABLE()dans la d ´eclaration de la
classe
I une/des m ´ethodes gestionnaire d’ ´ev ´enement : void monGest (EvtType& ev);
o `uEvtTypeest d ´eriv ´ee dewxEvent
I D ´efinition (dans le cpp de d ´efinition de la classe)
wxBEGIN_EVENT_TABLE(MaFenetre, wxFrame) EVT_BUTTON(BUTTON_id, MyFrame::MonGest) EVT_MENU(MENU_about, MyFrame::GestAbout) EVT_SIZE(MyFrame::GestSize)
wxEND_EVENT_TABLE()
Gestion des ´ev ´enements
I Un boucle infinie attend l’apparition d’un ´ev ´ennement I Lorsqu’il y en a un, il passe au crible de la table
I S’il y a correspondance, le gestionnaire indiqu ´e est lanc ´e callback: le programmeur r ´eprend la main
L’argument pass ´e au gestionnaire v ´ehicule les informations sp ´ecifiques `a l’ ´ev ´enement :
void MaFenetre::GestQuit (wxCommandEvent& ev){
Close(true);
}
void MaFenetre::GestSize(wxSizeEvent& event){
wxSize size = event.GetSize();
...
}
Un exemple : le bouton
La classewxButton
fenetre.h
#include <wx/wx.h>
class Fenetre : public wxFrame{
public:
Fenetre(const wxString& title);
wxButton * monBtnQuit;
wxButton * monBtnChgTxt;
// m´ethodes callback: ex´ecut´ees lorsque le bouton est appuy´e void SiQuit (wxCommandEvent& event );
void SiChgTxt (wxCommandEvent& event );
DECLARE_EVENT_TABLE() // d´eclaration de la table d’´ev´enements
};
enum {BUTTON_quit = 101, BUTTON_chgtxt = 102 };// ID des boutons
Le bouton
fenetre.cpp
#include <fenetre.h>
Fenetre::Fenetre(const wxString& title)
: wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize (250, 150)) {
// construction des boutons
monBtnQuit = new wxButton (this, // passage de la fenetre BUTTON_quit, // ID
_T("Quit"), // texte wxPosition(20,20),// position wxDefaultSize // taille );
monBtnChgTxt = new wxButton (this, BUTTON_chgtxt, _T("Change Txt"),
wxPosition(20,60),wxDefaultSize);
}
BEGIN_EVENT_TABLE(Fenetre,wxFrame )//Indique qu’il faut ex´ecuter EVT_BUTTON ( BUTTON_quit, Fenetre::SiQuit ) // SiQuit EVT_BUTTON ( BUTTON_chgtxt, Fenetre::SiTitre ) // SiTitre END_EVENT_TABLE() // quand le bouton est press´e
void Fenetre::SiQuit (wxCommandEvent& ev){Close(TRUE);}
void Fenetre::SiTitre(wxCommandEvent& ev){SetTitle("Nv titre");}
Le bouton
Plan
Programmation graphique et ´ev ´enementielle (6-7) G ´en ´eralit ´es
La GUI wxWidget
Premiers composants : textes Gestion des ´Evennements Organisation en panels Composants usuels
Panel de disposition
Pour structurer les composants au sein d’une fen ˆetre, on les dispose dans desPanels
fenetre.h
class Fenetre : public wxFrame{
public:
Fenetre(const wxString& title);
wxButton * monBtnQuit;
wxButton * monBtnTitre;
wxStaticText * monTxt;
wxPanel * monPanelG; // Panel Gauche wxPanel * monPanelD; // Panel Droite void SiQuit (wxCommandEvent& ev);
void SiBonsoir (wxCommandEvent& ev);
DECLARE_EVENT_TABLE() };
enum {BUTTON_Quit = 101, BUTTON_Bonsoir = 102, STATICTXT_txt = 103
};
Panel de disposition
fenetre.cpp
#include <fenetre.h>
Fenetre::Fenetre(const wxString& title):wxFrame(...) { monPanelG = new wxPanel (this,wxID_ANY,
wxPoint(1,1),wxSize(120,120));
monPanelD = new wxPanel (this,wxID_ANY,
wxPoint(140,1),wxSize(120,120));
monBtnQuit = new wxButton (monPanelG, BUTTON_Quit, wxT("Quit") ,
wxPoint(20,20));
monBtnTitre = new wxButton (monPanelG, BUTTON_Bonsoir, wxT("Bonsoir"), wxPoint(20,60));
monTxt = new wxStaticText (monPanelD, STATICTXT_txt,
wxT("Bonjour"), wxPoint(20,20));
}
void Fenetre::SiQuit (wxCommandEvent& ev){Close(TRUE);}
void Fenetre::SiBonsoir (wxCommandEvent& ev){
monTxt->SetLabel("Bonsoir");
}
BEGIN_EVENT_TABLE(Fenetre,wxFrame )
EVT_BUTTON ( BUTTON_Quit, Fenetre::SiQuit ) EVT_BUTTON ( BUTTON_Bonsoir, Fenetre::SiBonsoir ) END_EVENT_TABLE()
Panel de disposition
Disposition semi-automatis ´ee : les sizer
wsSizer
Gestionnaires de positionnement : I Permettent de :
I d ´ecrire le positionnement de composants graphiques de fac¸on haut-niveau
I g ´erer les modifications lors d’un redimensionnement I De plusieurs types :
wxBoxSizer wxGridSizer wxFlexGridSizer
...
A approfondir vous-m ˆeme si besoin !`
Plan
Programmation graphique et ´ev ´enementielle (6-7) G ´en ´eralit ´es
La GUI wxWidget
Premiers composants : textes Gestion des ´Evennements Organisation en panels Composants usuels
Zone de saisie de texte
wxTextCtrl: affiche un texte ´editable
I Construction :
wxTextCtrl * t = new wxTextCtrl(this, ID, wxT("Un texte"),wxPosition,wxSize);
I int GetNumberOfLines()
I int GetLineLength(int LineNb) I wsString GetLineText(int LineNb) I Surcharge de l’op ´erateur<<avecwsStringet
std::streambuf I Ev ´enements :´
I EVT_TEXT: quand le texte est chang ´e
I EVT_TEXT_ENTER: quand la toucheENTREEa ´et ´e press ´ee
Zone de saisie de texte
wxTextCtrl: affiche un texte ´editable
I Construction :
wxTextCtrl * t = new wxTextCtrl(this, ID, wxT("Un texte"),wxPosition,wxSize);
I int GetNumberOfLines()
I int GetLineLength(int LineNb) I wsString GetLineText(int LineNb) I Surcharge de l’op ´erateur<<avecwsStringet
std::streambuf I Ev ´enements :´
I EVT_TEXT: quand le texte est chang ´e
I EVT_TEXT_ENTER: quand la toucheENTREEa ´et ´e press ´ee
Zone de saisie de texte
wxTextCtrl: affiche un texte ´editable
I Construction :
wxTextCtrl * t = new wxTextCtrl(this, ID, wxT("Un texte"),wxPosition,wxSize);
I int GetNumberOfLines()
I int GetLineLength(int LineNb) I wsString GetLineText(int LineNb) I Surcharge de l’op ´erateur<<avecwsStringet
std::streambuf
I Ev ´enements :´
I EVT_TEXT: quand le texte est chang ´e
I EVT_TEXT_ENTER: quand la toucheENTREEa ´et ´e press ´ee
Zone de saisie de texte
wxTextCtrl: affiche un texte ´editable
I Construction :
wxTextCtrl * t = new wxTextCtrl(this, ID, wxT("Un texte"),wxPosition,wxSize);
I int GetNumberOfLines()
I int GetLineLength(int LineNb) I wsString GetLineText(int LineNb) I Surcharge de l’op ´erateur<<avecwsStringet
std::streambuf I Ev ´enements :´
I EVT_TEXT: quand le texte est chang ´e
I EVT_TEXT_ENTER: quand la toucheENTREEa ´et ´e press ´ee
Composant de dessin graphique
wxPaintDC
I outil pour dessiner sur la zone client de la fen ˆetre, via un
´ev ´enemmentwxPaintEvent
I Un ´ev ´enementwxPaintEventest g ´en ´er ´e `a la cr ´eation de la f ´en ˆetre et `a chaque redimensionnement
I D’autres Device Contexts (DC) sont disponibles : I wxPostScriptDC: dans un fichier PS I wxPrinter: sur une imprimante I wxScreen: n’importe o `u sur l’ ´ecran I wxMemory: dans un bitmap en m ´emoire
Composant de dessin graphique : dessin d’une ligne
fenetre.h
#include <wx/wx.h>
class Fenetre : public wxFrame{
public:
Fenetre(const wxString& title);
void OnPaint(wxPaintEvent& event);
DECLARE_EVENT_TABLE()
};
Composant de dessin graphique : dessin d’une ligne
fenetre.cpp
#include <fenetre.h>
Fenetre::Fenetre(const wxString& title): wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(280, 160)) {}
void Fenetre::OnPaint(wxPaintEvent& ev){
wxPaintDC dc(this); // constr. du wxPaint `a chaque appel wxCoord x1 = 50, y1 = 60, x2 = 190, y2 = 60;
dc.DrawLine(x1, y1, x2, y2); // tracer de la ligne }
BEGIN_EVENT_TABLE(Fenetre,wxFrame)
EVT_PAINT (Fenetre::OnPaint ) // call back de OnPaint END_EVENT_TABLE()
Composant de dessin graphique : dessin de formes
fenetre.cpp
void Fenetre::OnPaint(wxPaintEvent& ev){
wxPaintDC dc(this); // constr. du wxPaint `a chaque appel dc.DrawText(wxT("Voici quelques formes"), 10, 10); // un txt dc.DrawPoint(130,10); dc.DrawPoint(132,12); // 2 points wxColour green; green.Set(wxT("#619e1b")); // couleur RGB dc.SetPen(wxPen(*wxRED, 1, wxSOLID)); // crayon rouge
dc.SetBrush(*wxBLUE_BRUSH); // brosse bleue pr´ed´efinie dc.DrawRectangle(10, 50, 50, 50); // un rectangle
dc.SetPen(wxPen(green,5,wxSOLID)); // crayon ´epais vert dc.DrawEllipse(80, 50, 50, 60); // une ellipse }
BEGIN_EVENT_TABLE(Fenetre,wxFrame)
EVT_PAINT (Fenetre::OnPaint ) // call back de OnPaint END_EVENT_TABLE()
Les horloges wxTimer
I Cr ´ee une horloge
I un callback `a chaque tic d’horloge (rend la main de fac¸on r ´eguili `ere) : ´ev ´ennementEVT_TIMER
I intervalle des tics, donn ´e en argument (millisecondes) `a wxTimer::Start
fenetre.h
#include <wx/wx.h>
class Fenetre : public wxFrame{ int val;
static const int interval = 1000; // 1000 ms public:
Fenetre(const wxString& title); wxStaticText * txt;
wxTimer * timer;
void OnTimer(wxTimerEvent& event); DECLARE_EVENT_TABLE()
};
enum{myTIMER_ID = 101,myTXT_ID = 102};
Les horloges wxTimer
I Cr ´ee une horloge
I un callback `a chaque tic d’horloge (rend la main de fac¸on r ´eguili `ere) : ´ev ´ennementEVT_TIMER
I intervalle des tics, donn ´e en argument (millisecondes) `a wxTimer::Start
fenetre.h
#include <wx/wx.h>
class Fenetre : public wxFrame{
int val;
static const int interval = 1000; // 1000 ms public:
Fenetre(const wxString& title);
wxStaticText * txt;
wxTimer * timer;
void OnTimer(wxTimerEvent& event);
DECLARE_EVENT_TABLE() };
enum{myTIMER_ID = 101,myTXT_ID = 102};
Les horloges wxTimer
fenetre.cpp
#include <fenetre.h>
Fenetre::Fenetre(const wxString& title)
:wxFrame(NULL,wxID_ANY,title,wxDefaultPosition,wxSize(200,140)), val(0) {
txt = new wxStaticText (this, myTXT_ID, wxString("0"), wxPoint(20,20), wxSize(20,100));
timer = new wxTimer(this, myTIMER_ID);
timer->Start(interval);
}
void Fenetre::OnTimer(wxTimerEvent& ev){
val++;
txt->SetLabel(wxString::Format(wxT("%i"),val));
}
BEGIN_EVENT_TABLE(Fenetre,wxFrame )//Indique qu’il faut ex´ecuter EVT_TIMER (myTIMER_ID,Fenetre::OnTimer)
END_EVENT_TABLE() // quand le bouton est press´e
Les horloges wxTimer
fenetre.cpp
#include <fenetre.h>
Fenetre::Fenetre(const wxString& title)
:wxFrame(NULL,wxID_ANY,title,wxDefaultPosition,wxSize(200,140)), val(0) {
txt = new wxStaticText (this, myTXT_ID, wxString("0"), wxPoint(20,20), wxSize(20,100));
timer = new wxTimer(this, myTIMER_ID);
timer->Start(interval);
}
void Fenetre::OnTimer(wxTimerEvent& ev){
val++;
txt->SetLabel(wxString::Format(wxT("%i"),val));
}
BEGIN_EVENT_TABLE(Fenetre,wxFrame )//Indique qu’il faut ex´ecuter EVT_TIMER (myTIMER_ID,Fenetre::OnTimer)
END_EVENT_TABLE() // quand le bouton est press´e
Les horloges wxTimer
fenetre.cpp
#include <fenetre.h>
Fenetre::Fenetre(const wxString& title)
:wxFrame(NULL,wxID_ANY,title,wxDefaultPosition,wxSize(200,140)), val(0) {
txt = new wxStaticText (this, myTXT_ID, wxString("0"), wxPoint(20,20), wxSize(20,100));
timer = new wxTimer(this, myTIMER_ID);
timer->Start(interval);
}
void Fenetre::OnTimer(wxTimerEvent& ev){
val++;
txt->SetLabel(wxString::Format(wxT("%i"),val));
}
BEGIN_EVENT_TABLE(Fenetre,wxFrame )//Indique qu’il faut ex´ecuter EVT_TIMER (myTIMER_ID,Fenetre::OnTimer)
END_EVENT_TABLE() // quand le bouton est press´e
Les horloges wxTimer
fenetre.cpp
#include <fenetre.h>
Fenetre::Fenetre(const wxString& title)
:wxFrame(NULL,wxID_ANY,title,wxDefaultPosition,wxSize(200,140)), val(0) {
txt = new wxStaticText (this, myTXT_ID, wxString("0"), wxPoint(20,20), wxSize(20,100));
timer = new wxTimer(this, myTIMER_ID);
timer->Start(interval);
}
void Fenetre::OnTimer(wxTimerEvent& ev){
val++;
txt->SetLabel(wxString::Format(wxT("%i"),val));
}
BEGIN_EVENT_TABLE(Fenetre,wxFrame )//Indique qu’il faut ex´ecuter EVT_TIMER (myTIMER_ID,Fenetre::OnTimer)
END_EVENT_TABLE() // quand le bouton est press´e
Les horloges wxTimer
fenetre.cpp
#include <fenetre.h>
Fenetre::Fenetre(const wxString& title)
:wxFrame(NULL,wxID_ANY,title,wxDefaultPosition,wxSize(200,140)), val(0) {
txt = new wxStaticText (this, myTXT_ID, wxString("0"), wxPoint(20,20), wxSize(20,100));
timer = new wxTimer(this, myTIMER_ID);
timer->Start(interval);
}
void Fenetre::OnTimer(wxTimerEvent& ev){
val++;
txt->SetLabel(wxString::Format(wxT("%i"),val));
}
BEGIN_EVENT_TABLE(Fenetre,wxFrame )//Indique qu’il faut ex´ecuter EVT_TIMER (myTIMER_ID,Fenetre::OnTimer)
END_EVENT_TABLE() // quand le bouton est press´e
Les horloges wxTimer
fenetre.cpp
#include <fenetre.h>
Fenetre::Fenetre(const wxString& title)
:wxFrame(NULL,wxID_ANY,title,wxDefaultPosition,wxSize(200,140)), val(0) {
txt = new wxStaticText (this, myTXT_ID, wxString("0"), wxPoint(20,20), wxSize(20,100));
timer = new wxTimer(this, myTIMER_ID);
timer->Start(interval);
}
void Fenetre::OnTimer(wxTimerEvent& ev){
val++;
txt->SetLabel(wxString::Format(wxT("%i"),val));
}
BEGIN_EVENT_TABLE(Fenetre,wxFrame )//Indique qu’il faut ex´ecuter EVT_TIMER (myTIMER_ID,Fenetre::OnTimer)
END_EVENT_TABLE() // quand le bouton est press´e