Partie III : Dessiner avec wxWidgets

CGi

Dans cette troisième partie de cette série de tutoriels, vous allez apprendre à dessiner avec la bibliothèque wxWidgets.

Un espace de dialogue vous est proposé sur le forum. N'hésitez pas à apporter vos commentaires sur le lien ci-dessous, si vous avez des remarques concernant ce tutoriel. ♪

Commentez

- Titre : Partie III : Dessiner avec wxWidgets

- Auteur : CGi

- Parution : 24 mai 2004

- Mise à jour : 14 octobre 2016

- Licence : Copyright ® 2016 CGi. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Explication

- III. Code source complet

- III-A. wxwin1.h

- III-B. wxwin1.cpp

- IV. Remarques sur ce document

I - Introduction

Dans ce chapitre nous allons aborder les méthodes de dessin de la bibliothèque wxWidgets qui sont d'une grande simplicité et qui n'ont rien à envier aux autres bibliothèques du même genre.

Nous ne passerons pas en revue toutes les fonctions de dessin, cet article ayant plutôt pour but de voir la façon de les implémenter. Nous y verrons le tracé de texte, de formes, de traits, mais aussi les pinceaux et les crayons.

Nous nous aiderons pour cela d'un exemple dont vous pouvez voir le résultat sur la copie d'écran ci-dessous.

II - Explication

Comme toutes les applications fenêtrées, les opérations de dessin font suite à l'arrivée d'un événement déclenché par le système d'exploitation. Il appellera une méthode de la fiche nommée dans l'exemple OnPaint qui comme dans les chapitres précédents sera désignée par l'intermédiaire d'une table d'événements.

1. BEGIN_EVENT_TABLE(TMyFrame, wxFrame)

2. EVT_PAINT(TMyFrame::OnPaint)

3. END_EVENT_TABLE()

Sous wxWidgets les fonctions de dessin sont encapsulées dans une classe nommée : wxPaintDC qui englobe aussi un contexte de périphérique que nous obtenons en appelant son constructeur avec comme paramètre la fiche (this).

Implémentation de la méthode OnPaint :

1. void TMyFrame::OnPaint(wxPaintEvent& evt)

2. {

3. wxPaintDC MonDc(this);

4. MonDc.DrawRectangle(125,25,90,90);

5. //...

6. }

Ensuite, pour dessiner, il suffit tout d'appeler ses méthodes de dessin, comme DrawRectangle dans l'exemple. Pour avoir la liste des méthodes de dessin consultez l'aide sur la classe wxDC dont dérive wxPaintDC.

Pour écrire du texte, vous devez d'abord créer une fonte à l'aide de la classe wxFont que vous affecterez ensuite au contexte de périphérique à l'aide de sa méthode SetFont.

1. wxFont MaFont(20, wxSWISS , wxNORMAL, wxNORMAL, false, "Arial Black");

2. MonDc.SetFont(MaFont);

3. MonDc.DrawRotatedText("Bonjour",0,100,45);

Le constructeur de wxFont reçoit comme paramètres : la taille de la fonte, sa famille (n'a aucun effet si son nom est renseigné), son style (italique), son poids (gras), la valeur true si elle doit être soulignée, puis son nom. (Consultez l'aide classe wxFont, son constructeur a plusieurs paramètres prédéfinis).

Dans l'exemple nous l'avons sélectionnée par son nom « Arial Black » de taille 20. Nous nous servons de la méthode DrawRotatedText pour dessiner le texte. Cette méthode à comparer à DrawText, peut dessiner un texte avec un certain angle dont la valeur est entrée dans son quatrième paramètre.

Nous pouvons aussi utiliser des pinceaux, par exemple pour peindre le cercle en rouge dans l'exemple. Les pinceaux sont encapsulés dans la classe wxBrush. Comme pour les fontes on les affecte au contexte de périphérique, ici avec la méthode SetBrush.

1. wxBrush MaBrush("RED",wxSOLID );

2. MonDc.SetBrush(MaBrush) ;

3. MonDc.DrawCircle(300,70,50) ;

wxBrush à plusieurs constructeurs possibles, voir l'aide sur wxBrush. Dans l'exemple j'ai utilisé une couleur prédéfinie et nommée, dont on peut trouver la liste dans l'aide rubrique wxColourDatabase. Tout comme les pinceaux on peut aussi créer des crayons, ceci est l'affaire de la classe wxPen. Là aussi le crayon et affecté au contexte de périphérique à l'aide de sa méthode SetPen.

1. wxColour MaCouleur(0,0,255);

2. wxPen MonCrayon(MaCouleur,10,wxSOLID);

3. MonDc.SetPen(MonCrayon);

4. MonDc.DrawLine(120,20,220,120);

5. MonDc.DrawLine(220,20,120,120);

Ici aussi plusieurs constructeurs possibles (voir aide). Pour initialiser la couleur du crayon, j'ai créé une couleur personnalisée à l'aide d'un objet wxColour. Le deuxième paramètre du constructeur de wxPen comme vous vous en doutiez est la largeur du trait. Dans l'exemple nous nous servons de ce crayon pour tracer deux traits formant une croix sur le rectangle.

III - Code source complet

III-A - wxwin1.h

1. #ifndef wxWin1H

2. #define wxWin1H

3. //------------------------------------------------------------------------------

4. class TMyApp : public wxApp

5. {

6. public:

7. virtual bool OnInit();

8. };

9. //------------------------------------------------------------------------------

11. class TMyFrame : public wxFrame

12. {

13. public:

14. TMyFrame(const wxString& title, const wxPoint& pos, const wxSize& size,

15. long style = wxDEFAULT_FRAME_STYLE);

16. void OnPaint(wxPaintEvent& evt);

17. private:

19. DECLARE_EVENT_TABLE()

20. };

21. //------------------------------------------------------------------------------

22. #endif //wxWin1H

III-B - wxwin1.cpp

1. #include "wx/wxprec.h"

3. #ifdef __BORLANDC__

4. #pragma hdrstop

5. #endif

7. #ifndef WX_PRECOMP

8. #include "wx/wx.h"

9. #endif

10. //------------------------------------------------------------------------------

11. #include "wxWin1.h"

13. BEGIN_EVENT_TABLE(TMyFrame, wxFrame)

14. EVT_PAINT(TMyFrame::OnPaint)

15. END_EVENT_TABLE()

17. IMPLEMENT_APP(TMyApp)

19. //------------------------------------------------------------------------------

21. bool TMyApp::OnInit()

22. {

23. TMyFrame *frame = new TMyFrame("Mon application",

24. wxPoint(150, 150), wxSize(480, 360));

25. frame->Show(TRUE);

26. return TRUE;

27. }

28. //------------------------------------------------------------------------------

29. TMyFrame::TMyFrame(const wxString& title, const wxPoint& pos, const wxSize& size,

30. long style) : wxFrame(NULL, -1, title, pos, size, style)

31. {

32. SetIcon(wxICON(monicone));

33. SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));

34. }

35. //------------------------------------------------------------------------------

36. void TMyFrame::OnPaint(wxPaintEvent& evt)

37. {

38. wxPaintDC MonDc(this);

39. MonDc.DrawRectangle(125,25,90,90);

40. wxFont MaFont(20, wxSWISS , wxNORMAL, wxNORMAL, false, "Arial Black");

41. MonDc.SetFont(MaFont);

42. MonDc.DrawRotatedText("Bonjour",0,100,45);

43. wxBrush MaBrush("RED",wxSOLID );

44. MonDc.SetBrush(MaBrush) ;

45. MonDc.DrawCircle(300,70,50) ;

46. wxColour MaCouleur(0,0,255);

47. wxPen MonCrayon(MaCouleur,10,wxSOLID);

48. MonDc.SetPen(MonCrayon);

49. MonDc.DrawLine(120,20,220,120);

50. MonDc.DrawLine(220,20,120,120);

51. }

52. //------------------------------------------------------------------------------

Ici pas besoin de se préoccuper de la libération des outils de dessin, qui, sous Windows, peuvent parfois être un calvaire. Dans l'exemple les objets de dessin sont créés par valeur, si vous les créez à l'aide de pointeur avec un new, il faudra les supprimer par un delete. Ce n'était pas le cas des objets fenêtrés des chapitres précédents.

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,

CGi

Avec la contribution d'Alacazam pour la relecture.