• Aucun résultat trouvé

Programmation par Objets en C++

N/A
N/A
Protected

Academic year: 2022

Partager "Programmation par Objets en C++"

Copied!
54
0
0

Texte intégral

(1)

Programmation par Objets en C++

Cl ´ement PERNET

L3-MI, UFR IM2AG, Universit ´e Grenoble Alpes

(2)

Plan du cours

Programmation graphique et ´ev ´enementielle (6-7)

(3)

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

(4)

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

(5)

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

(6)

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

(7)

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

(8)

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

(9)

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‘

(10)

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();

}

(11)

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;

};

(12)

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)

}

(13)

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

(14)

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);

(15)

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

(16)

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.

(17)

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 );

}

(18)

Le text statique : la classe

wxStaticText

I lorsqu’il n’y a qu’un composant sur une fen ˆetre, il est redimensionn ´e `a la taille maximale de la fen ˆetre.

(19)

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

(20)

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

(21)

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

(22)

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

(23)

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

(24)

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

(25)

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()

(26)

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()

(27)

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()

(28)

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()

(29)

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();

...

}

(30)

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

(31)

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");}

(32)

Le bouton

(33)

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

(34)

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

};

(35)

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()

(36)

Panel de disposition

(37)

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 !`

(38)

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

(39)

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

(40)

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

(41)

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

(42)

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

(43)

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

(44)

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()

};

(45)

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()

(46)

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()

(47)

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};

(48)

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};

(49)

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

(50)

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

(51)

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

(52)

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

(53)

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

(54)

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

Références

Documents relatifs

Les vecteurs x ∈ R d repr´esentent des conditions initiales que l’utilisateur peut plus ou moins contrˆoler et Ω est un espace de probabilit´es mod´elisant la mal connaissance

Par isomorphisme on peut donc dire qu’une matrice M (de l’endomorphisme) est enti` erement d´ etermin´ ee par l’image (produit par M ) des vecteurs d’une base de M n (IR). On

Pour tout entier naturel n, on note u n le nombre d’abonn´es `a son profil en l’ann´ee (2020+n), suivant cette mod´elisation1. La fonction Python nomm´ee « suite » est

Chaque participant g´en`ere sur son smartphone un ticket comportant une grille de taille 3 × 3 sur laquelle sont plac´es trois cœurs r´epartis au hasard, comme par exemple

On rappelle qu’une fonction continue sur un intervalle compact est born´ ee sur cet

Soit (a, b, c) un triplet de r´ eels strictement positifs.. Soit ABC un triangle pseudo-rectangle en A, obtus en B et dont les longueurs des cˆ ot´ es sont des nombres rationnels ;

Il n’est donc pas obligatoire de traiter syst´ ematiquement les questions dans l’ordre de l’´ enonc´ e, ` a condition d’indiquer clairement la question trait´ ee en

Le but de cet exercice est d’´ etudier les intersections d’un cube avec des plans passant par son centre, et d’encadrer l’aire des sections planes ainsi obtenues..