Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
FORUM C++ FAQs C++ TUTORIELS C++ LIVRES C++ COMPILATEURS C++ SOURCES C++ Qt


wxWidgets

4 - Sizers, Timers ...

ParCGi

Le 25 mai 2004





Introduction :

Dans le premier chapitre, nous avions placés nos boutons par leur position, mais dans la majorité des cas, ils sont inclus dans des sizers. Les sizers permettent l'ancrage par rapport aux quatre cotés de la fenêtre. Nous aborderons aussi dans cet article les timers, la traditionnelle boîte de message, et aussi la jauge.
Nous nous aiderons ici aussi d'un exemple dont vous pouvez voir le résultat sur la copie d'écran ci-dessous.




Les sizers :

La librairie wxWidgets possède plusieurs types de sizers, nous allons les aborder avec un sizer simple le wxBoxSizer. Un sizer se crée comme un objet fenêtré à l'aide de l'opérateur new et sa destruction est du ressort de l'application. Dans l'exemple nous créons d'abord un objet wxBoxSizer Mysizer. Son constructeur reçoit comme argument un entier indiquant comment seront alignés les éléments qu'il contient, deux possibilités wxVERTICAL pour les aligner les uns sous les autres ou wxHORIZONTAL pour les aligner les uns à coté des autres. Dans l'exemple ils seront tous les deux d'orientation verticale. Puis nous lui ajoutons les deux boutons à l'aide de sa méthode add.

  wxBoxSizer *Mysizer = new wxBoxSizer( wxVERTICAL );
  MonBouton1 = new wxButton(this,Id_ClickBt1,"Stop");
  Mysizer->Add(MonBouton1);
  MonBouton2 = new wxButton(this,Id_ClickBt2,"Start");
  Mysizer->Add(MonBouton2);

Puis nous créons le deuxième sizer auquel nous ajoutons dans cet ordre : le sizer précédemment créé puis la jauge.

  wxBoxSizer *Psizer = new wxBoxSizer( wxVERTICAL );
  Psizer->Add(Mysizer,1,wxALIGN_RIGHT);
  Psizer->Add(MaGauge = new wxGauge(this,-1,100, wxDefaultPosition,
                                                     wxDefaultSize),0,wxEXPAND);

Vous remarquez que les méthodes add utilisées ici ont des paramètres supplémentaires. Le premier est toujours un pointeur sur l'objet à inclure dans le sizer. Le deuxième et un entier indiquant la proportion que doit prendre l'élément dans le sizer. Une valeur nulle indique que l'élément garde ses dimensions d'origine, c'est le cas de la jauge. Le sizer Mysizer prend donc tout le reste de la place diponible. Le troisième paramètre indique la position des éléments dans le sizer. Le sizer MySizer est aligné à droite et la jauge est étendue sur toute la largeur. Il n'y a plus qu'à affecter le sizer principal Psizer à la fenêtre à l'aide de sa méthode SetSizer, ce qui la rendra aussi responsable de la destruction du sizer.

    SetSizer(Psizer);


Le timer :

Sous wxWidgets les timers sont simples à utiliser. Dans l'exemple nous le créons par valeur dans la déclaration de la classe. Dans le constructeur de TMyFrame nous l'initialisons à l'aide de sa méthode SetOwner qui reçoit comme paramètre un propriétaire ici c'est la fenêtre principale et un identificateur d'événement. Puis nous lançons le timer à l'aide de sa méthode Start qui reçoit en paramètre une durée en milliseconde.

    MonTimer.SetOwner(this,Id_Timer);
    MonTimer.Start(500);

L'identificateur d'événement est utilisée sur le même principe que pour les boutons ou les menus des chapitres précédents à l'aide de la macro EVT_TIMER qui le lie à la méthode OnTimer dans la table d'événements.

BEGIN_EVENT_TABLE(TMyFrame, wxFrame)
    EVT_TIMER(Id_Timer,  TMyFrame::OnTimer)
END_EVENT_TABLE()

Le déclenchement de cet événement appellera donc la méthode OnTimer de TMyFrame toutes les 500 ms.
Dans cette méthode nous changerons la valeur de la jauge à l'aide de sa méthode SetValue et nous la remettons à zéro quand sa valeur maximale est atteinte. Valeur renvoyé par sa méthode GetRange.

void TMyFrame::OnTimer(wxCommandEvent& event)
{
    int x = MaGauge->GetValue();
    x += 5;
    MaGauge->SetValue(x);
    if (x > MaGauge->GetRange()) MaGauge->SetValue(0);
}


Les MessageBox :

Pour ne pas laisser nos deux boutons sans rien faire, nous en utiliserons un pour arrêter le timer et l'autre pour le démarrer. Et nous appellerons une MessageBox pour nous signifier l'action que nous venons d'effectuer.

void TMyFrame::OnClickBouton1(wxCommandEvent& WXUNUSED(event))
{
    if(MonTimer.IsRunning())
      {
        MonTimer.Stop();
        wxMessageDialog MsgDlg(this,"Vous avez stopé le timer");
        MsgDlg.ShowModal();
      }
}
//------------------------------------------------------------------------------
void TMyFrame::OnClickBouton2(wxCommandEvent& WXUNUSED(event))
{
    if(!MonTimer.IsRunning())
      {
        MonTimer.Start(500);
        wxMessageDialog MsgDlg(this,"Vous avez relancé le timer","Action");
        MsgDlg.ShowModal();
      }
}

Les MessageBox sont créées par valeur leur constructeur reçoit comme paramètres la fenêtre parent puis le texte du message puis éventuellement le titre.



Code source complet :

wxwin1.h :


#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 OnClickBouton1(wxCommandEvent& WXUNUSED(event));
    void OnClickBouton2(wxCommandEvent& WXUNUSED(event));
    void OnTimer(wxCommandEvent& event);
private:
    wxGauge *MaGauge;
    wxButton *MonBouton1 ;
    wxButton *MonBouton2 ;
    wxTimer MonTimer;

DECLARE_EVENT_TABLE()
};
enum
{
    Id_ClickBt1,
    Id_ClickBt2,
    Id_Timer
};
//------------------------------------------------------------------------------
#endif //wxWin1H

wxwin1.cpp :


#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_BUTTON(Id_ClickBt1,  TMyFrame::OnClickBouton1)
    EVT_BUTTON(Id_ClickBt2,  TMyFrame::OnClickBouton2)
    EVT_TIMER(Id_Timer,  TMyFrame::OnTimer)
END_EVENT_TABLE()

IMPLEMENT_APP(TMyApp)
//------------------------------------------------------------------------------
bool TMyApp::OnInit()
{
    TMyFrame *frame = new TMyFrame("Ma première application", wxPoint(150, 150),
                   wxSize(400, 140),wxSYSTEM_MENU | wxCAPTION | wxRESIZE_BORDER |
                                                              wxTAB_TRAVERSAL);
    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));

  // Création et lancement du Timer
  MonTimer.SetOwner(this,Id_Timer);
  MonTimer.Start(500);

  // Création du 1er sizer
  wxBoxSizer *Mysizer = new wxBoxSizer( wxVERTICAL );
  MonBouton1 = new wxButton(this,Id_ClickBt1,"Stop");
  Mysizer->Add(MonBouton1);
  MonBouton2 = new wxButton(this,Id_ClickBt2,"Start");
  Mysizer->Add(MonBouton2);

  // Création du sizer principal
  wxBoxSizer *Psizer = new wxBoxSizer( wxVERTICAL );
  Psizer->Add(Mysizer,1,wxALIGN_RIGHT);
  Psizer->Add(MaGauge = new wxGauge(this,-1,100, wxDefaultPosition,
                                                     wxDefaultSize),0,wxEXPAND);
  MaGauge->SetForegroundColour("RED");
  SetSizer(Psizer);
}
//------------------------------------------------------------------------------
void TMyFrame::OnClickBouton1(wxCommandEvent& WXUNUSED(event))
{
    if(MonTimer.IsRunning())
      {
        MonTimer.Stop();
        wxMessageDialog MsgDlg(this,"Vous avez stopé le timer");
        MsgDlg.ShowModal();
      }
}
//------------------------------------------------------------------------------
void TMyFrame::OnClickBouton2(wxCommandEvent& WXUNUSED(event))
{
    if(!MonTimer.IsRunning())
      {
        MonTimer.Start(500);
        wxMessageDialog MsgDlg(this,"Vous avez relancé le timer","Action");
        MsgDlg.ShowModal();
      }
}
//------------------------------------------------------------------------------
void TMyFrame::OnTimer(wxCommandEvent& event)
{
    int x = MaGauge->GetValue();
    x += 5;
    MaGauge->SetValue(x);
    if (x > MaGauge->GetRange()) MaGauge->SetValue(0);
}
//------------------------------------------------------------------------------

Dans le code de cet exemple, nous avons ajouté le style "wxTAB_TRAVERSAL" à la fenêtre principale (TMyFrame) dans l'appel de son constructeur. Il sert à activer le changement de focus des contrôles par la touche 'TAB' dans les fenêtres qui ne sont pas du type boîte de dialogue.


Remarques sur ce document :

Ce document ne présente qu'une initiation aux sizers, il y a plusieurs type de sizers voir la documentation de wxWidgets pour plus de renseignements à ce sujet. 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.


A bientôt,

CGi

Avec la contribution d'Alacazam pour la relecture.

Sommaire



C/C++

  Les pointeurs du C/C++.   Les listes chaînées.             Liste simple.             Liste triée.             Liste double.   Le C orienté objets ?

API Windows

  1 - La fenêtre principale.   2 - Contrôles et messages.   3 - Les commandes.   4 - Dialogue std.   5 - Contexte de périph.   6 - Dessiner.   7 - Les ressources.   8 - Dialogue perso.   9 - Dialogue comm.   10 - Les accélérateurs.

C++ BUILDER

  Trucs et astuces.   Composant.   TRichEdit.   TDrawGrid.   Application MDI.   TThread.   wxWidgets.   Style Win XP.

wxWidgets

  Première application.   Construire un menu.   Dessiner.   Sisers, Timers...   Dialogues standards.   Dialogues perso.

DotNet

  Composant C# Builder.   Contrôle WinForm.   Application MDI.

Java

  Applet java.





Copyright 2002-2007 CGi - Tous droits réservés CGi. Toutes reproduction, utilisation ou diffusion de ce document par quelque moyen que ce soit autre que pour un usage personnel doit faire l'objet d'une autorisation écrite de la part de l'auteur, propriétaire des droits intellectuels.
Les codes sources de ce document sont fournis en l'état. L'utilisateur les utilise à ses risques et périls, sans garantie d'aucune sorte de la part de l'auteur. L'auteur n'est responsable d'aucun dommage subi par l'utilisateur pouvant résulter de l'utilisation ou de la distribution des codes sources de ce document.
De la même façon, l'auteur n'est en aucun cas responsable d'une quelconque perte de revenus ou de profits, ou de données, ou de tous dommages directs ou indirects, susceptibles de survenir du fait de l'utilisation des codes sources de ce document, quand bien même l'auteur aurait été averti de la possibilité de tels dommages. L'utilisation des codes sources de ce document vaut acceptation par l'utilisateur des termes de la licence ci-dessus.

Responsable bénévole de la rubrique C++ : hiko-seijuro - Contacter par EMail :
Vos questions techniques : forum d'entraide C++ - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.