Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Newsletter | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Dév. Web PHP ASP XML XMLRAD Python Assembleur Autres Windows Linux
Accueil Java DotNET & C# Visual Basic C & C++ Delphi Pascal Access SQL & SGBD Oracle UML
FORUMS C/C++ F.A.Q C F.A.Q C++ F.A.Q VC++ F.A.Q BCB TUTORIELS C/C++ LIVRES C/C++ COMPILATEURS

Tutoriel wxWidgets

de David BEECH traduction française par Patrick VALERI

(Original en anglais)

20/11/2003

(Retour au sommaire)

Cet article a pour but de vous présenter les bibliothèques wxWidgets (www.wxwidgets.org). Elles sont intégrées depuis peu à Borland C++ Builder X : www.tt-solutions.com

Programmez avec wxWidgets

Etape suivante Dernière étape Glossaire A propos de

 

Nous allons maintenant découvrir une autre et plus sympathique façon de construire un programme Windows qui utilise des librairies de classes nommées wxWidgets.

A proprement parler, wxWidgets est mieux que des librairies, c'est une méthode de travail (ou framework ) ce qui signifie qu'elles fournissent des classes pour le développement complet d'applications. Le bénéfice de son utilisation ne s'arrête pas là, ce sont aussi des librairies multi-plateformes.

    Les mots des auteurs de wxWidgets:

    wxWidgets, c'est quoi? wxWidgets vous apporte une API simple et facile d'utilisation pour écrire des applications avec interface graphique (GUI) sur de multiples plates-formes. Liée avec les librairies appropriées à votre plates-forme (Windows/Unix/Mac) et compilée (la plupart des compilateurs C++), votre application adoptera l'apparence et le fonctionnement adaptés à cette plate-forme. En plus, sur la grande majorité des fonctionnalités GUI, wxWidgets vous fournira une aide en ligne, la programmation réseau, les flux( streams ), l'ancrage et le glisser-déposer, le multitâche, le chargement et la sauvegarde d'images dans une large gamme de formats, le support des bases de données, les cadres HTML avec les impressions, et bien plus encore.

wxWidgets est un bel exemple de travail de très haute qualité, en effet, certains utilise le terme de "qualité commerciale " dans la description de wxWidgets signifiant que c'est bien assez pour être rémunéré. C'est sûrement vrai mais s'il y a une critique que je puisse faire sur wxWidgets, c'est que, pour un débutant, il peut être difficile de démarrer la prise en main: le processus d'apprentissage initial est un peu complexe. La meilleure réponse qu'on puisse faire à cette critique est tout d'abord que le programmeur ait une bonne compréhension de l'architecture wxWidgets, de ses classes, fonctions et techniques : écrire des applications intéressantes est un développement bénéfique et relativement simple. Cela peut être bénéfique financièrement aussi, wxWidgets a une structure tellement riche que presque tous les domaines d'applications peuvent être abordés.

Vous avez probablement déjà deviné, en lisant ceci, que je suis un grand amateur avisé de wxWidgets. C'est vrai et j'aimerais vous communiquer mon enthousiasme pour wxWidgets à travers ces pages.

Mon plan est d'expliquer l'architecture de wxWidgets et ses classes à travers une série d'exemple de programmes de base, essentiel pour débuter. Quand vous aurez fini, vous devriez avoir une bonne pratique de wxWidgets. Avant de commencer, quelques avertissements:

Je ne pense pas particulièrement être bon programmeur et pas non plus être particulièrement expert de wxWidgets. Mais j'ai une pratique du vocabulaire et je suis confiant quant à l'exposition claire de sujets complexes.

    • Vous aurez besoin d'avoir compris le C et le C++ mais pas nécessairement en détail. Vos capacités en C et C++ seront largement étendues quant vous apprendrez wxWidgets. Si vous avez travaillé sur la plupart des chapitres du C++ de ce site web, et les avez compris, je pense que vous n'aurez pas de problèmes ( Commentaire_0)
    • Vous aurez besoin d'avoir assimiler les classes et la programmation orientée objet. Sinon, la plupart des thèmes de ce site web vous y aideront.
    • Dés le début, le travail a été effectué sur des plate-formes Windows : Win95, Win98 et Win2K ont toutes été utilisées. MingW paramétré avec wxWidgets fournit l'environnement de développement.

Ces pages peuvent être d'une grande aide pour vous si vous êtes débutant en programmation C++ mais vous voulez entrer à grand pas dans le vrai-monde du développement rapide de programme GUI utilisant wxWidgets ( Commentaire_0-a). Venez suivre cette expérience!

C'est le point de départ et j'ai volontairement abordé les choses tout à fait simplement. La première idée avec wxWidgets est de garder la vue la plus simple de sa structure Commentaire_0-b. Quand nous développerons plus loin, nous regardons plus en détail sa structure.

    Un programme GUI wxWidgets consiste en:

    • Un objet application - une instance de classe wxApp.
    • Un objet cadre ( Commentaire_1)- une instance de classe wxFrame. Un cadre peut avoir des objets comme une barre de menu, une barre d'état, une icône, etc.
    • Le cadre peut contenir beaucoup d'autres objets comme un contrôle de texte, des boutons, des fenêtres scindées ou «  splitters  » et ainsi de suite.

Dans le plus simple programme, nous aurons juste un cadre vide et c'est le premier exemple de base que nous allons regarder. Il est raisonnable de se demander quelle utilisation concrète cela peut avoir. C'est instructif et rien d'autre et c'est la première raison que nous allons examiner. Vous allez voir que cela montre le comportement habituel d'une application fenêtré. Elle a un menu système, elle peut être déplacée, redimensionner et réduite.

    wxWindows most basic application - the empty frame

Je sais qu'il n'a pas un bel aspect mais c'est le nôtre. Il nous montre aussi quelle apparence prend un programme GUI natif. Dans notre cas c'est Windows 98 mais rappelez-vous wxWidgets est une structure multiple plate-forme et pourrait être utilisée pour développer des applications pour les autres plate-formes comme Linux, OS2, Mac etc.

Le code source pour le premier exemple est détaillé ci-dessous

#ifndef BASIC_H

#define BASIC_H

class BasicApplication : public wxApp

{

public:

virtual bool OnInit();

};

class BasicFrame : public wxFrame

{

public:

BasicFrame( const wxChar *title,

int xpos, int ypos,

int width, int height);

~BasicFrame();

};

#endif

C'est le fichier d'en-têtes. Dans cette application Basic nous déclarons deux classes:

BasicApplication qui hérite de la classe wxApp et

BasicFrame qui hérite de la classe wxFrame

Nous déclarons un constructeur et destructeur pour BasicFrame mais la seule chose que nous avons faite pour l'application BASIC est de surcharger la méthode OnInit() . Noter : depuis que nous la surchargeons, nous déclarons la méthode virtuelle.

#include <wx/wx.h>

#include "basic.h"

IMPLEMENT_APP(BasicApplication)

bool BasicApplication::OnInit()

{

BasicFrame *frame = new BasicFrame("Basic", 50, 50, 450,300);

frame->Show(TRUE);

SetTopWindow(frame);

return TRUE;

}

BasicFrame::BasicFrame

(const wxChar *title,

int xpos, int ypos,

int width, int height)

: wxFrame

( (wxFrame *) NULL,

-1,

title,

wxPoint(xpos, ypos),

wxSize(width, height)

)

{

}

BasicFrame::~BasicFrame()

{

}

#include "wx/msw/wx.rc"

C'est l'implémentation, la définition des classes déclarées dans basic.h .

La première chose à indiquer est la macro :
IMPLEMENT_APP(BasicApplication)
qui, depuis notre point de vue, construit les objets de l'application BasicApplication et fournit l'entrée principale ou le point « main entry » pour notre application. Cela remplace virtuellement tout le travail que nous avons fait dans la leçon précédente dans la fonction int WINAPI WinMain( ... )

La méthode OnInit() crée une instance de BasicFrame avec x et y par défaut, les valeurs de largeur et hauteur et un titre. Puis, elle appelle la méthode Show() pour montrer le cadre de fenêtre. Si vous regardez la classe wxFrame vous ne trouverez pas la méthode, wxFrame hérite de wxWindow et Show() est une fonction membre de wxWindow. Comme un débutant, vous devez nécessairement garder cela à l'esprit – Puisque beaucoup de classes sont dérivées d'autres classes ne négliger pas les méthodes qui sont possibles dans les classes parents.

OnInit() appelle aussi SetTopWindow() qui est un membre de wxApp.

Le constructeur et le destructeur n'ajoutent aucun nouveau comportement à notre classe BasicFrame.

Le dernier fichier pertinent est le fichier de ressource. Dans cet exemple simple, nous n'avons ajouté aucune ressources propres mais nous utilisons un fichier de ressource qui contient en dernier la ligne:

#include "wx/msw/wx.rc"

Dans les derniers exemples nous ajoutons nos propres ressources.

 

Tout ce que vous avez à retenir est comment construire et exécuter le programme .

Construire des programmes wxWidgets avec MingW

La distribution de wxWindows contient beaucoup d'exemples et pour tous ces exemples il y a des fichiers MakeFile pour les différentes plate-formes que wxWidgets supportent. Bien que ce soit une façon judicieuse de produire des programmes dés lors que l'utilisateur n'a pas à être préoccupé par les détails qui déterminent quel genre de programme cible(*.exe,*.bin )sera produit, je dois admettre que j'ai trouvé cela un peu déroutant. Il y avait aussi l'inconvénient, comme je l'ai perçu en tout cas, que le processus de compilation nécessite de spécifier où les fichiers d'en-têtes ( include ) et les bibliothèques ( library ) sont situées. J'ai trouvé que de conserver les fichiers d'en-têtes wxWidgets à l'emplacement des fichiers d'en-têtes standard (voir image)et les bibliothèques wxWidgets à l'emplacement des bibliothèques standards facilite les choses. Après avoir installer puis compiler les librairies, je les ai déplacées ainsi que les fichiers d'en-têtes aux emplacements standards. Sur mon système Windows il s'agit de l'arborescence MingW, sur mon système Linux c'est soit dans le répertoire /usr soit /usr/local (usr/lib, /usr/include ou /usr/local/lib, /usr/local/include).

L'avantage fondamental de délocaliser les fichiers d'en-têtes et les bibliothèques est qu'il enlève un niveau d'obscurcissement qui peut confondre le débutant.

Cela fait et pour construire les exemples,  je peux utiliser maintenant ce MakeFile:

PROGRAM = basic

OBJECTS = ${PROGRAM}.o ${PROGRAM}_resources.o

RC = windres.exe

CC = g++

INCLUDES =

CCSW1 = --pipe -fvtable-thunks -c -D_X86_=1 -DWIN32 -D_WIN32 -DWINVER=0x0400 -D__WIN95__ \

-D__GNUWIN32__ -D__WIN32__ -DSTRICT -D__WXMSW__ -D__WINDOWS__\

-Wall -fno-pcc-struct-return -O2 -fno-rtti -fno-exceptions

CCSW2 = --pipe -fvtable-thunks -Wl,--subsystem,windows -mwindows

LIBS = -lwx -lxpm -lcomctl32 -ladvapi32 -lwsock32 -lole32 -loleaut32 -luuid

RESSW = --include-dir c:/gcc-2.95.2-1/i386-mingw32msvc/include \

--define __WIN32__ --define __WIN95__ --define __GNUWIN32__

.SUFFIXES: .o .cpp

all: ${OBJECTS}

$(CC) -o $(PROGRAM) ${OBJECTS} ${CCSW2} ${LIBS}

.cpp.o:

$(CC) ${CCSW1} ${INCLUDES} -c -o $@ $<

${PROGRAM}_resources.o:

$(RC) ${RESSW} ${PROGRAM}.rc $@

.PHONY : clean

clean:

echo cleaning up

rm $(OBJECTS)

rm *.$$$$$$

rm ${PROGRAM}.exe

Pour construire le programme:

  1. Créer les fichiers sources dans un simple répertoire
    • basic.h
    • basic.cpp
    • basic_resources.rc
    • MakeFile
  2. Exécuter make dans le répertoire où les fichiers sources sont placés
  3. Exécuter le programme « basic » 


Les classes wxWidgets que nous utilisons

Nous n'utilisons que deux classes:

  • wxApp, et
  • wxFrame

depuis lesquelles nous allons dériver les classes BasicApplication et BasicFrame. Je vais développer les détails de ces deux classes mais vous pouvez lire aussi la description plus complète dans la documentation wxWidgets.

wxApp

La classe wxApp contient plus de 30 membres tous accessibles mais à ce stade nous n'avons pas besoin de regarder wxApp dans tous ses détails. Plus tard quand nous aurons réalisé quelques programmes avec le système de gestion des événements wxWidgets nous pourrons poursuivre wxApp.

wxFrame

Constructeur wxFrame

wxFrame

( wxWindow* parent,

wxWindowID id,

const wxString& title,

const wxPoint& pos = wxDefaultPosition,

const wxSize& size = wxDefaultSize,

long style = wxDEFAULT_FRAME_STYLE,

const wxString& name = "frame"

)

Dés lors que le travail accompli sur la classe wxFrame nous la rendra plus perceptible, nous pourrons passer un petit moment à regarder quelques-unes unes de ses propriétés.

Notre constructeur BasicFrame nous fournit seulement quatre paramètres évidents :

un titre, la position x et y position, la largeur et la hauteur.

Le constructeur wxFrame a d'autres paramètres: un pointeur wxWindow, un style, un nom et un ID wxWindow, ce dernier est un entier et s'il est -1 c'est que la valeur par défaut est utilisée. Il peut être parfois plus utile de fournir un ID par vous-même. Le pointeur pointe vers une fenêtre parent, s'il y en a une. Dans notre cas le pointeur est NULL, il n'y avait pas de fenêtre parent. Le paramètre « name » peut être fournit par le programmeur et, comme le paramètre ID, il peut être plus utile si cela se rapporte au cadre.

Le style du cadre peut être d'une grande variété de styles:

Window styles

  • wxDEFAULT_FRAME_STYLE Définie comme la boite par défaut(wxMINIMIZE | wxMAXIMIZE_BOX | wxRESIZE_BOX | wxSYSTEM_MENU | wxCAPTION. ) et depuis la version 2.5.x wxCLOSE_BOX en plus.
  • wxICONIZE Affiche le cadre sous forme d'icône (réduite). Windows seulement.
  • wxCAPTION Place un titre dans le cadre.
  • wxMINIMIZE Identique à wxICONIZE. Windows seulement.
  • wxMINIMIZE_BOX Affiche le contrôle de réduction de la boite.
  • wxMAXIMIZE Affiche le cadre maximum. Windows seulement.
  • wxMAXIMIZE_BOX Affiche le contrôle d'agrandissement.
  • wxSTAY_ON_TOP Reste au dessus des autres fenêtres. Windows only.
  • wxSYSTEM_MENU Permet de fermer l'application.
  • wxSIMPLE_BORDER N'affiche aucune bordure ou autres effets. GTK et Windows seuls.
  • wxRESIZE_BORDER Affiche une bordure redimensionnable autour de la fenêtre (Windows et Unix seul).
  • wxFRAME_FLOAT_ON_PARENT Oblige le cadre à être au-dessus de la fenêtre parent en profondeur (z-order) et non-apparente dans la barre des tâches. Sans ce style, les cadres sont crées au-dessus des fenêtres et peuvent être recouvertes par la fenêtre parent, et les titres de cadres apparaissent dans la barre des tâches(Windows et GTK).
  • wxFRAME_TOOL_WINDOW Implique un cadre avec une petite barre de menu; le titre du cadre n'apparaît pas dans la barre des tâches. Windows seul.

Quelques petits tests...

BasicFrame::BasicFrame

(const wxChar *title,

int xpos, int ypos,

int width, int height)

: wxFrame

( (wxFrame *) NULL,

-1,

title,

wxPoint(xpos, ypos),

wxSize(width, height),

wxSIMPLE_BORDER

)

...

Le style du cadre est d'un ou plusieurs styles. En l'absence de définition de style (comme dans notre BasicFrame) la valeur par défaut est appliquée, c.a.d BasicFrame doit avoir une boite minimum, une boite maximum, un menu système, un titre et doit être redimensionnable.

Afin que vous puissiez voir l'effet des différents styles modifier le constructeur de BasicFrame afin que le style passé en argument au constructeur de wxFrame comme indiqué ici.


Parmi deux douzaines ou presque, voici quelques méthodes membres de wxFrame :

  • CreateStatusBar Exemple: frame->CreateStatusBar();
  • CreateToolBar
  • GetTitle
  • SetIcon
  • SetMenuBar
  • SetStatusBar
  • SetStatusText
  • SetToolBar
  • SetTitle

Vous utiliserez la plupart de ceux-ci pendant les sessions qui suivent mais pour maintenant voici un exercice avec les fonctions membres SetTitle et GetTitle.

Titres et noms des cadres

BasicFrame::BasicFrame

(const wxChar *title,

int xpos, int ypos,

int width, int height)

: wxFrame( (wxFrame *) NULL,

-1,

title,

wxPoint(xpos, ypos),

wxSize(width, height),

wxDEFAULT_FRAME_STYLE,

"Fred"

)

{

}

 

Le constructeur a été modifié afin qu'il passe un nom au constructeur wxFrame. Maintenant ajouter cette ligne:

frame->SetTitle(frame->GetTitle() + " " + frame->GetName());

à la fonction Ba sicApplication::OnInit() avant la ligne frame ->Show( true ) .

Compiler et exécuter le programme et vous en verrez l'effet. D'où vient la méthode GetName() ?

( Commentaire_2)


Sommaire

Dans cette première session, vous avez couvert une belle étendue du sujet. Vous avez vu la structure de base de wxWidgets et devez commencer à avoir quelques idées de l'architecture. N'oubliez pas de jeter un coup d'œil aux références de classes dans la documentation wxWidgets. Vous pouvez trouver cela confus mais les exercices vous enrichiront. Je suggère aussi que quand l'occasion se présente (ce qui arrive souvent) vous devriez regarder le code source de wxWidgets. Vous y trouverez beaucoup de commentaires utiles et aussi comment obtenir une maîtrise de ce qu'est cet excellent environnement.

Le tutoriel complet au format HTML en anglais (pour l'instant icpp_wx1 à icpp_wx8) est aussi disponible.

 

Retour en début de document

Etape suivante Dernière étape Glossaire A propos de

 

Traduction de Patrick VALERI du document de David Beech

Copyright © 1999 - 2001 David Beech


Ce document est issu de http://phenix.developpez.com/ et reste la propriété exclusive de son auteur.
La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.

Copyright © 2000-2005

Vos questions techniques : forum d'entraide C & 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-2005 www.developpez.com

Analyse et mesure de frequentation internet par


hit-parade