<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.docbook.org/xml/4.2/docbookx.dtd">
<article lang="fr">
<articleinfo>
  <title>Créer un projet wxWidgets a l'aide de Bloodshed Dev-C++ sous
	Microsoft Windows</title>
  <authorgroup>
  <author>
        <firstname>Nowicki</firstname>
        <surname>Christophe</surname>
		<affiliation>
		<address format="linespecific">
		  <email>nowick_c@epita.fr</email>
		</address>
		</affiliation>
  </author>
  </authorgroup>
  <keywordset>
	<keyword>Linux</keyword>
	<keyword>wxWindows</keyword>
	<keyword>wxWidgets</keyword>
	<keyword>Microsoft</keyword>
	<keyword>Windows</keyword>
	<keyword>Bloodshed</keyword>
	<keyword>Dev-C++</keyword>
	<keyword>C++</keyword>
	<keyword>Toolkit</keyword>
	<keyword>Multi plate-formes</keyword>
	<keyword>Libre</keyword>
	<keyword>LGPL</keyword>
  </keywordset>
  <date>septembre 2003</date>
  <copyright>
      <year>2003</year>
      <holder>Nowicki Christophe</holder>
  </copyright>
  <legalnotice>
	<para>
	  Permission est accordée de copier, distribuer et/ou modifier ce
	  document selon les termes de la Licence de Documentation Libre GNU 
	  (GNU Free Documentation License), version 1.1 ou toute version 
	  ultérieure publiée par la Free Software Fondation.
	  Pas de section inaltérable.
	</para>
  </legalnotice>
  <revhistory>
	<revision>
	<revnumber>1.1</revnumber>
	<date>26/02/2004</date>
	<revremark>s/wxWindows/wxWidgets/g ;(</revremark>
	</revision>
  <revision>
	<revnumber>1.0</revnumber>
	<date>27/10/2003</date>
	<revremark>Version initiale</revremark>
	</revision>
   </revhistory>
</articleinfo>


<abstract>
   <para>
	 Cet article décrit étape par étape l'installation, la configuration
	 et la compilation d'un projet Hello World! à l'aide de l'environnement 
	 de développement intégré (ou <acronym>IDE</acronym>) Bloodshed Dev-C++ et de 
	 l'interface de programmation d'applications (ou API) multiplateforme
	 wxWidgets sous Microsoft Windows. 
   </para>
</abstract>

<sect1>
	<title>Télécharger les outils</title>
	  <sect2>
		<title>Bloodshed Dev-C++</title>
		<para>
		  Bloodshed Dec-C++ est libre et écrit en Delphi pour Microsoft Windows. Il utilise
		  le portage Mingw des outils <acronym>GNU</acronym> dont le
		  fameux <acronym>GCC</acronym> (GNU
		  Compiler Collection). Il dispose des fonctionnalités suivantes :
		</para>
		<para>
		  <itemizedlist>
			<listitem>
			  <para>Débugger intégré</para>
			</listitem>
			<listitem>
			  <para>Gestion de projet</para>
			</listitem>
			<listitem>
			  <para>Colorisation syntaxique personnalisable</para>
			</listitem>
			<listitem>
			  <para>Navigateur de classe C++</para>
			</listitem>
			<listitem>
			  <para>Profiler</para>
			</listitem>
			<listitem>
			  <para>Création de fichiers Makefile</para>
			</listitem>
			<listitem>
			  <para>Création de modèles pour ses propres projets</para>
			</listitem>
			<listitem>
			  <para>Editer et compiler les ressources</para>
			</listitem>
			<listitem>
			  <para>Support de <acronym>CVS</acronym> (Concurrent Versions System)</para>
			</listitem>
		  </itemizedlist>
		</para>
		<para>
		  Il est possible de le télécharger librement sur le site de
		  <ulink url="http://www.bloodshed.net/devcpp.html">Bloodshed
			Software</ulink>. La version actuelle est la 5.0 beta 8
		  (4.9.8.0).
		</para>
	  </sect2>
	  <sect2>
		<title>wxWidgets</title>
		<para>
		  wxWidgets est une <acronym>API</acronym> C++ libre multiplateforme (Unix, Windows et
		  Mac). Elle a l'énorme avantage d'être sous License <acronym>LGPL</acronym>
		  (acronyme de Library General Public Licence) et donc permettre la
		  redistribution de binaires. De plus, elle utilise l'interface
		  graphique native sur chaque système d'exploitation.
		</para>
		<para>
		  Voila la liste des avantages offerts par wxWidgets :
		</para>
		  	<para>
		  <itemizedlist>
			<listitem><para>Libre</para></listitem>
			<listitem><para>Orienté objet</para></listitem>
			<listitem><para>Portable (Windows, Unix et Mac)</para></listitem>
			<listitem><para>Fonctionne avec la plupart des compilateurs C++</para></listitem>
			<listitem><para>Une interface Python (wxPython)</para></listitem>
			<listitem><para>Bien documenté</para></listitem>
		  </itemizedlist>
		</para>
		<para>
		  Si nous voulez avoir un aperçu de toutes les possibilitées de
		  cette <acronym>API</acronym>
		  je vous propose de vous référer aux documents officiels : 
		</para>
		<para>
		  <itemizedlist>
			<listitem>
			  <para>
				<ulink url="http://www.wxWidgets.org/faqgen.htm"><acronym>FAQ</acronym> Général</ulink>
			  </para>
			</listitem>
			<listitem>
			  <para>
				<ulink url="http://www.wxWidgets.org/faqmsw.htm"><acronym>FAQ</acronym> Microsoft Windows</ulink>
			  </para>
			</listitem>
			<listitem>
			  <para>
				<ulink url="http://www.wxWidgets.org/docs.htm">Documentation</ulink>
			  </para>
			</listitem>
		  </itemizedlist>
		</para>
		<para>
		  Pour l'installation de wxWidgets vous avez le choix entre :
		  recompiler les sources a l'aide de Dev-C++ ou bien télécharger
		  les DevPacks. Les DevPacks sont des modules pour Dev-C++
		  qui contiennent les librairies wxWidgets compilées et les
		  modèles des projets d'applications qui utilisent wxWidgets.
		  Les DevPacks wxWidgets pour Dev-C++ sont téléchargeables sur
		  la page personnelle de Michel Weinachter :</para>
		<para>
		  <ulink url="http://michel.weinachter.free.fr/">Les "DevPacks"
			wxWidgets pour Dev-C++</ulink>
		</para>
		<para>Vous devez télécharger les trois DevPacks suivants :</para>
		<para>
		  <itemizedlist>
			<listitem><para>wxWidgets 2.4.0</para></listitem>
		  </itemizedlist>
		  <itemizedlist>
			<listitem><para>imagelib</para></listitem>
		  </itemizedlist>
		  <itemizedlist>
			<listitem><para>wxWidgets 2.4.0 contribs</para></listitem>
		  </itemizedlist>
		</para>
	  </sect2>
</sect1>
<sect1>
	  <title>Installation</title>
	  <sect2>
		<title>Bloodshed Dev-C++</title>
		<para>
		  L'installation de Dev-C++ ne pose aucun problème. Il suffit de
		  choisir une installation dite Typical et choisir le répertoire
		  d'installation. Une fois l'installation terminée
		  vous pouvez choisir votre thème et la langue. Vous pouvez
		  choisir anglais ou bien français.
		</para>
	  </sect2>
	  <sect2>
		<title>Les DevPacks wxWidgets</title>
		<para>Pour installer les DevPacks il suffit de cliquer sur
		  :</para>
		<para>
		  <informaltable>
			<tgroup cols="2">
			  <thead>
				<row>
				  <entry>Anglais</entry>
				  <entry>Français</entry>
				</row>
			  </thead>
			  <tbody>
				<row>
				  <entry>
					<menuchoice moreinfo="none">
					  <guimenu moreinfo="none">Tools</guimenu>
					  <guimenuitem moreinfo="none">Package Manager</guimenuitem>
					</menuchoice>
				  </entry>
				  <entry>
					<menuchoice moreinfo="none">
					  <guimenu moreinfo="none">Outils</guimenu>
					  <guimenuitem moreinfo="none">Package Manager</guimenuitem>
					</menuchoice>
				  </entry>
				</row>
			  </tbody>
			</tgroup>
		  </informaltable>
		</para>
		<para>
		  Puis d'installer les DevPacks dans l'ordre suivant : imagelib, wxWidgets, wxWidgets-contrib.
		</para>
	  </sect2>
  </sect1>
  <sect1>
	<title>Création d'un projet d'interface graphique basique</title>
	  <sect2>
		<title>"Hello wxWidgets!"</title>
		<para>Une fois les trois DevPacks installés il suffit de cliquer
		  sur :</para>
		<para>
		  <informaltable>
			<tgroup cols="2">
			  <thead>
				<row>
				  <entry>Anglais</entry>
				  <entry>Français</entry>
				</row>
			  </thead>
			  <tbody>
				<row>
				  <entry>
					<menuchoice moreinfo="none">
					  <guimenu moreinfo="none">File</guimenu>
					  <guimenuitem moreinfo="none">New</guimenuitem>
					  <guimenuitem moreinfo="none">Project...</guimenuitem>
					</menuchoice>
				  </entry>
				  <entry>
					<menuchoice moreinfo="none">
					  <guimenu moreinfo="none">Fichier</guimenu>
					  <guimenuitem moreinfo="none">Nouveau</guimenuitem>
					  <guimenuitem moreinfo="none">Projet...</guimenuitem>
					</menuchoice>
				  </entry>
				</row>
			  </tbody>
			</tgroup>
		  </informaltable>
		</para>
		<para>Puis sur :</para>
		<para>
		  <menuchoice moreinfo="none">
			<guimenu moreinfo="none">GUI</guimenu>
			<guimenuitem moreinfo="none">wxWidgets</guimenuitem>
		  </menuchoice>
		</para>
		<para>
		  <mediaobject>
			<imageobject>
			  <imagedata fileref="new_projet.eps" format="EPS" scale="75" scalefit="1"/>
			</imageobject>
			<imageobject>
			  <imagedata fileref="new_projet.png" format="PNG"/>
			</imageobject>
			<textobject>
			  <phrase>Nouveau projet sous Bloodshed Dev-C++</phrase>
			</textobject>
		  </mediaobject>
		</para>
		<para>
		  Il ne reste plus qu'à choisir le nom de votre nouveau
		  projet et de le sauvegarder dans un répertoire de travail.
		  Une fois le projet créé vous devez voir un fichier main.cpp
		  avec le code d'une application wxWidgets minimal. Il faut
		  sauvegarder le fichier :
		</para>
		<para>
		  <informaltable>
			<tgroup cols="2">
			  <thead>
				<row>
				  <entry>Anglais</entry>
				  <entry>Français</entry>
				</row>
			  </thead>
			  <tbody>
				<row>
				  <entry>
		  <menuchoice moreinfo="none">
			<shortcut moreinfo="none">
			  <keycombo moreinfo="none">
				<keycap moreinfo="none">Ctrl</keycap>
				<keycap moreinfo="none">S</keycap>
			  </keycombo>
   			</shortcut>
			<guimenu moreinfo="none">File</guimenu>
   			<guimenuitem moreinfo="none">Save</guimenuitem>
		   </menuchoice>
				  </entry>
				  <entry>
		  <menuchoice moreinfo="none">
			<shortcut moreinfo="none">
			  <keycombo moreinfo="none">
				<keycap moreinfo="none">Ctrl</keycap>
				<keycap moreinfo="none">S</keycap>
			  </keycombo>
   			</shortcut>
			<guimenu moreinfo="none">Fichier</guimenu>
   			<guimenuitem moreinfo="none">Sauvegarder</guimenuitem>
		   </menuchoice>
				  </entry>
				</row>
			  </tbody>
			</tgroup>
		  </informaltable>

		  
		</para>
		<para>
		  Il ne vous reste plus qu'à compiler et exécuter celle-ci :
		</para>
		<para>
		  <informaltable>
			<tgroup cols="2">
			  <thead>
				<row>
				  <entry>Anglais</entry>
				  <entry>Français</entry>
				</row>
			  </thead>
			  <tbody>
				<row>
				  <entry>

		  <menuchoice moreinfo="none">
			<shortcut moreinfo="none">
			  <keycombo moreinfo="none">
				<keycap moreinfo="none">F9</keycap>
			  </keycombo>
   			</shortcut>
			<guimenu moreinfo="none">Execute</guimenu>
   			<guimenuitem moreinfo="none">Compile &amp; Run</guimenuitem>
		  </menuchoice>
		</entry>
		<entry>
		  <menuchoice moreinfo="none">
			<shortcut moreinfo="none">
			  <keycombo moreinfo="none">
				<keycap moreinfo="none">F9</keycap>
			  </keycombo>
   			</shortcut>
			<guimenu moreinfo="none">Executer</guimenu>
			<guimenuitem moreinfo="none">Compiler &amp; Executer</guimenuitem>
		  </menuchoice>
		  </entry>
				</row>
			  </tbody>
			</tgroup>
		  </informaltable>
		</para>
		<para>
		  Si la compilation s'est bien passée vous devez voir
		  apparaître la fenêtre suivante :
		</para>
		<para>
		  <mediaobject>
			<imageobject>
			  <imagedata fileref="minimal.eps" format="EPS" scale="75" scalefit="1"/>
			</imageobject>
			<imageobject>
			  <imagedata fileref="minimal.png" format="PNG"/>
			</imageobject>
			<textobject>
			  <phrase>Une application wxWidgets minimale sous Microsoft
				Windows</phrase>
			</textobject>
		  </mediaobject>
		</para>
	  </sect2>
	  <sect2>
		<title>Analyse du code source</title>
		<para>
		Nous allons analyser le code génére automatiquement par Dev-C++.
		Tout d'abord il faut inclure les fichiers d'entête de
		wxWidgets. Vous avez le choix entre inclure un gros fichier qui
		contient toutes les class wxWidgets (#include "wx/wx.h") ou bien
		inclure seulement les class dont votre application a besion
		(ex : #include "wx/window.h" et #include "wx/menu.h"). Pour les
		compilateurs qui supportent les fichiers d'entête précompilés
		il est possible d'utiliser la version précompilé. (#include
		"wx/wxprec.h")</para>
<para>
  <programlisting role="C++" format="linespecific">
<![CDATA[	
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"

#ifdef __BORLANDC__
    #pragma hdrstop
#endif

#ifndef WX_PRECOMP
    #include "wx/wx.h"
#endif
]]>
</programlisting>
</para>

		<para>Chaque application definit une classe dérivée de la classe
		wxApp. En utilisant la méthode virtuelle OnInit() de la classe
		wxApp, on peux initialiser notre application. Créer la fenêtre
		principale par exemple.</para>

<para>
  <programlisting role="C++" format="linespecific">
<![CDATA[  
class MyApp: public wxApp
{
    virtual bool OnInit();
};
]]>	
</programlisting>
</para>

		<para>Pour créer la fenêtre principale de l'application il suffit
		d'utiliser la même méthode : dériver une classe de la classe
		wxFrame. Dans le constructeur de cette nouvelle classe vous
		pouvez créer un menu est une barre des statuts. Cette fenêtre doit
		pouvoir repondre aux évènements envoyés par l'utilisateur (comme
		le bouton de la souris, les menus ou les boutons).
		Pour répondre à ces évènements, la classe doit contenir une table
		d'évènement (DECLARE_EVENT_TABLE).</para>

<para>
  <programlisting role="C++" format="linespecific">
<![CDATA[  
class MyFrame: public wxFrame
{
public:
    MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);

    void OnQuit(wxCommandEvent& event);
    void OnAbout(wxCommandEvent& event);

private:
    DECLARE_EVENT_TABLE()
};]]>
</programlisting>
</para>

		<para>
		Pour chaque évènement il faut donner un identifiant unique, à
		l'aide d'une constante ou bien d'un enum.
		</para>

<para>
  <programlisting role="C++" format="linespecific">
<![CDATA[
enum
{
    ID_Quit = 1,
    ID_About,
};
]]>	
</programlisting>
</para>

		<para>
		  Il faut implémenter les handler des differents évènement de la
		  classe wxFrame a l'aide de macros. Il n'a pas besoin de gérer
		  tous les évènement que peut recevoir la class car il y a un
		  handler d'évènement générique par défaut pour chaque
		  évènement.
		</para>

<para>
<programlisting role="C++" format="linespecific">
<![CDATA[
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
    EVT_MENU(ID_Quit,  MyFrame::OnQuit)
    EVT_MENU(ID_About, MyFrame::OnAbout)
END_EVENT_TABLE()
]]>
</programlisting>
</para>

<para>
  Tous les progammes doivent avoir une fonction d'entrée principale
  (main). Celle-ci est implémentée à l'aide d'une macro qui crée une
  instance de l'objet qui représente votre application.
</para>

<para>
<programlisting role="C++" format="linespecific">
<![CDATA[
IMPLEMENT_APP(MyApp)
]]>
</programlisting>
</para>

		<para>
		  Après la création de l'instance de wxApp la méthode OnInit()
		  est appeler. Vous pouvez l'utiliser cette methode pour
		  initialiser le programme, afficher un "splash screen" et créer
		  la ou les fenêtres principales. 
		</para>

<para>
  <programlisting role="C++" format="linespecific">
<![CDATA[
bool MyApp::OnInit()
{
    MyFrame *frame = new MyFrame( "Hello World", wxPoint(50,50), wxSize(450,340) );
    frame->Show( TRUE );
    SetTopWindow( frame );
    return TRUE;
}
]]>	
</programlisting>
</para>

		<para>
		  Dans ce constructeur de la fenêtre principale nous pouvons
		  créer un menu et une barre de statuts.
		</para>

<para>
<programlisting role="C++" format="linespecific">
<![CDATA[
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
       : wxFrame((wxFrame *)NULL, -1, title, pos, size)
{
    wxMenu *menuFile = new wxMenu;

    menuFile->Append( ID_About, "&About..." );
    menuFile->AppendSeparator();
    menuFile->Append( ID_Quit, "E&xit" );

    wxMenuBar *menuBar = new wxMenuBar;
    menuBar->Append( menuFile, "&File" );

    SetMenuBar( menuBar );

    CreateStatusBar();
    SetStatusText( "Welcome to wxWidgets!" );
}
]]>
</programlisting>
</para>

		<para>
		  Il nous reste plus qu'à écrire les méthodes pour la gestion
		  des évènements. MyFrame::OnQuit() ferme la fenêtre, s'il n'y a
		  pas d'autres fenêtres ouvertes par l'application, celle-ci se
		  termine automatiquement.
		</para>

<para>
<programlisting role="C++" format="linespecific">
<![CDATA[
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
    Close(TRUE);
}
]]>
</programlisting>
</para>

		<para>
		  MyFrame::OnAbout() va afficher un boite de dialog avec un
		  message dedans. 
		</para>

<para>
<programlisting role="C++" format="linespecific">
<![CDATA[  
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
{
    wxMessageBox( "This is a wxWidgets' Hello world sample",
                  "About Hello World", wxOK | wxICON_INFORMATION );
}
]]>
</programlisting>
</para>
	  </sect2>
  </sect1>

  <sect1>
	<title>Conclusion</title>
	<para>
	  Vous avez réussi a faire une application wxWidgets basique.
	  Pour mieux comprendre le fonctionnement de l'API et aller plus
	  loin il faut se plonger dans  
	  <ulink url="http://www.wxWidgets.org/manuals/">les manuels de référence de
		l'<acronym>API</acronym></ulink>.
	  Mais aussi sur le <ulink url="http://g.yi.org/Forum/list.php?f=13">forum
		dédié</ulink> à la programmation en wxWidgets avec Dev-C++.
	</para>
  </sect1>
</article>
