Tutoriel wxWindows
de David BEECH traduction française par Patrick VALERI
20/11/2003
Programmez avec wxWindows
Quatrième Étape
Utilisation des «common dialogs»
Introduction
Beaucoup d'opérations dans un GUI sont répétitives, par exemple l'ouverture des fichiers, l'impression, le changement de répertoire. Cela aide les utilisateurs à condition que les outils qu'ils utilisent pour ces opérations soient pratiques d'utilisation pour le but recherché et que la plupart des API (Application Programming Interfaces) fournissent les opérations courantes. Cela aide très souvent le programmeur et assure aussi une interface qui « tienne la route ». L'utilisateur peut faire une sélection depuis le menu et s'attendre à voir un dialogue familier fonctionnant de façon logique sans se préoccuper de l'application exécutée.
wxWindows pourvoit aux usages de dialogue courant à travers un certain nombre de classes:
- wxColourDialog
- wxFontDialog
- wxPrintDialog
- wxFileDialog
- wxDirDialog
- wxTextEntryDialog
- wxMessageDialog
- wxSingleChoiceDialog
- wxMultipleChoiceDialog
Durant le reste de cette session, nous allons utiliser un certain nombre d'entre elles et allons commencer leur prise en main en utilisant la classe wxFileDialog et étendre l'exemple des sessions précédentes. Avant de commencer à garder en mémoire ce qu'elles font: nous allons générer les évènements depuis les sélections du menu, déclencher des dialogues courants et les utiliser.
Utilisation de boîtes de dialogues "Fichier" wxFileDialog
|
Quand vous utilisez wxFileDialog comme un dialogue d'ouverture de fichiers vous voyez cette boite de dialogue familière comme indiquée ici.
C'est le dialogcue fichier pour la plate-forme Windows et se présente différemment sur Linux ou Mac.
Puisque wxWindows est un cadre multiple plate-forme, cela reste omniprésent si bien que le dialogue courant est celui qui correspond à une plate-forme donnée ou, si le dialogue courant est inexistant, wxWindows lui substitue un dialogue générique. |
void BasicFrame::OnOpenFile (wxCommandEvent & event)
{ wxFileDialog
* openFileDialog =
new wxFileDialog ( this,
"Open file",
"",
"",
FILETYPES,
wxOPEN,
wxDefaultPosition);
if (openFileDialog->ShowModal() == wxID_OK)
{ SetCurrentFilename(openFileDialog->GetFilename());
theText->LoadFile(openFileDialog->GetFilename());
SetStatusText(GetCurrentFilename(), 0);
SetStatusText(openFileDialog->GetDirectory(),1);
}
} |
Voici un exemple de capture d'évènement qui présente un dialogue d'ouverture de fichier à l'utilisateur.
Pour l'utiliser, nous:
- Construisons le dialogue,
- Fixons les arguments appropriés au constructeur.
- Afficher le dialogue
- Obtenir un état de quand referme le dialogue
- utilisons la valeur retournée par le dialogue le cas échéant
|
Le constructeur contient la déclaration d'une variable openFileDialog qui est un pointeur vers un type wxFileDialog . Les arguments du constructeur sont:
- this la fenêtre parent
- "Open file" - Un en-tête
- "" Le répertoire par défaut
- "" Le nom de fichier par défaut
- FILETYPES une liste de fichiers filtre, dans ce cas défini en une chaîne FILETYPES
static const
wxChar
*FILETYPES = _T( "Text files|*.txt|"
"C/C++ source files|*.cpp;*.cc;*.c|"
"C/C++ header files|*.hpp;*.h|"
"Make files|Mak*;mak*|"
"Java files|*java|"
"Hypertext markup files|*html;*htm;*HTML;*HTM|"
"All files|*.*"
);
Nous pouvons juste avoir "*.*" comme chaîne de type de fichier mais le dialogue de fichier acceptera une chaîne structurée comme l'exemple. Cela représente ma liste des types de fichiers qui apparaîtra la boite composite "Files of type" du dialogue de fichier.
- wxOPEN un style de dialogue de fichier
- wxOPEN Dialogue d'ouverture.
- wxSAVE Dialogue de sauvegarde.
- wxHIDE_READONLY Fichiers cachés lecture seule.
- wxOVERWRITE_PROMPT Demande de confirmation pour écraser un fichier.
- wxMULTIPLE Pour dialogue d'ouverture seul: permet la sélection multiple de fichiers
- wxDefaultPosition non encore implémenter
La fonction membre ShowModal() affiche le dialogue. Une boite de dialogue peut être modale ou non. Si elle est modale alors aucune autre fenêtre de l'application ne peut capturer de réponse tant que la boite de dialogue n'est pas fermée. L'utilisateur peut clore la boite de dialogue en sélectionnant les boutons OK ou Cancel . ShowModal() retourne un entier et s'il s'agit du même que wxID_OK nous procédons à la saisie des valeurs structurées dans la boite de dialogue en appelant les diverses fonctions membres du dialogue de fichiers.
Dans notre cas nous obtenons le nom de fichier avec openFileDialog->GetFilename() et l'utilisons comme un argument à SetCurrentFilename() qui est une méthode du cadre parent. Nous utilisons aussi openFileDialog->GetFilename() pour charger le contenu du fichier dans theText . Nous appelons aussi SetStatusText() pour placer des caractères dans la barre d'état et enfin sortir de la capture d'évènement à partir de laquelle l'instance de dialogue de fichier est détruite.
Les dialogues de fichier « Enregistrer » et « Enregistrer sous » sont d'apparence identique au dialogue d'ouverture de fichier. La différence est plus une question de manière de les utiliser. Si vous appréciez voir un exemple des trois dialogues alors téléchargez wxbasic4a.zip et lisez le code source. Je vais continuer la session avec le dialogue de police de caractère.
Utilisation de boîtes de dialogue « Polices de caractères » wxFontDialog
Le dialogue de polices nous permet de changer la police de la fenêtre parent, dans notre cas le contrôle de texte theText . C'est un peu plus tortueux à utiliser que le dialogue de fichiers puisque nous (devons) déterminer la valeur de la police en cours dans la fenêtre parent avant de construire et d'utiliser le dialogue de polices.
Pour cela nous devons utiliser trois autres classes:
wxFontData Saisie les données pour la sélection du dialogue de police, nous transférons les données de police entre le monde et le dialogue via this,
wxFont Saisie les données pour la police de la fenêtre, nous transférons les données de police entre le monde et la fenêtre via this,
wxColour Saisie les données de couleur pour un objet.
void BasicFrame::OnChooseFont(wxCommandEvent & event)
{ wxFontData fontData;
wxFont theFont;
wxColour colour;
theFont = theText->GetFont();
fontData.SetInitialFont(theFont);
colour = theText->GetForegroundColour();
fontData.SetColour(colour);
fontData.SetShowHelp(true);
wxFontDialog *dialog = new wxFontDialog(this, &fontData);
if (dialog->ShowModal() == wxID_OK)
{ fontData = dialog->GetFontData();
theFont = fontData.GetChosenFont();
theText->SetFont(theFont);
theText->SetForegroundColour(fontData.GetColour());
}
} |
Voici un exemple qui utilise le dialogue et la classe associée. Il y a un certain nombre d'étapes avant de construire et ensuite enlever l'instance de dialogue de police :
- Envoyer les données de polices de la fenêtre(celle de notre application) vers une instance wxFont via la méthode GetFont() de wxTextCtrl et,
- Paramétrer ces données dans l'instance wxFontData préparer pour le transfert au dialogue de police.
- Obtenir la couleur de fond de la fenêtre via la méthode GetForegroundColour() et,
- Régler cette couleur dans l'instance wxFontData préparer pour le transfert vers le dialogue de police.
- Construire le dialogue de police.
- Montrer le dialogue et si cela retourne wxID_OK, nous pouvons maintenant inverser le processus:
- Extraire les données de police du dialogue en utilisant la fonction GetFontData() membre de wxFontDialog's
- Transférer ces données vers une instance wxFont via la méthode GetChosenFont() membre de wxFontData.
- Extraire la couleur de fond des données de dialogue de police
- La transférer à la fenêtre cible.
Si vous appréciez de voir un exemple qui utilise le dialogue de police et les autres classes alors téléchargez wxbasic4b.zip et lisez le code source.
Un petit rappel: dans la présentation des deux exemples j'ai seulement indiqué les détails frappants. Vous devez vous rappeler que ces exemples contiennent aussi d'autres codes qui sont pertinents, par exemple l'identifiant des fenêtres et la table des événements. J'ai allége les programmes d'exemples pour la présentation dans le but de garder de l'espace et de ne pas s'égarer.
Utilisation de boîtes de dialogue « Répertoire » wxDirDialog
|
Bien que nous ayons utilisé le dialogue d'ouverture de fichier nous avons dû scruter nous-même pour examiner les répertoires, dans mon cas « My Documents » (qui veut appeler un répertoire « My Documents »? Si c'est votre ordinateur, le répertoire ne serait probablement pas « Documents de quelqu'un d'autres », ce qui peut-être pénible). |
Pour pallier ce problème et nous placer à un endroit plus pratique de la structure du système de fichiers nous pouvons utiliser un dialogue et quelques fonctions courantes. Le dialogue est l'indication du répertoire courant montré ici et les fonctions courantes sont:
- wxGetCwd() - (Indiquer le répertoire de travail courant CWD) qui retourne la chaîne littérale contenant le chemin courant et,
- wxSetWorkingDirectory(wxString) qui place le CWD(current working directory)
à votre convenance.
Si nous ajoutons une donnée membre pour conserver le CWD dans notre instance BasicFrame alors nous nous pouvons retenir le CWD pendant l'exécution du programme et ne plus se voir revenir dans « My Documents » , sauf si nous le choisissons.
void BasicFrame::OnChooseDir(wxCommandEvent & event) {
wxDirDialog *d = new wxDirDialog (this, "Choose a directory", GetCurrentPath(), 0, wxDefaultPosition);
if (d->ShowModal() == wxID_OK)
SetCurrentPath(d->GetPath());
} |
Ici, la capture d'évènements qui produit le dialogue de changement de répertoire. Quand vous le comparez avec les autres dialogues, il a un aspect familier rassurant. Les arguments du constructeur sont:
this La fenêtre parent
"Choose a directory" Un en-tête,
GetCurrentPath() Une méthode BasicFrame qui retourne le CWD,
0 Un style qui n'est pas utilisé,
position - Une position qui n'est pas encore pas implémenté dans wxWindows version 2.
Il y aussi cette instruction conditionnelle familière:
if (d->ShowModal() == wxID_OK)
et après que le dialogue de répertoire ait été refermé, nous pouvons utiliser une de ses méthodes pour obtenir le répertoire sélectionné:
SetCurrentPath(d->GetPath())
SetCurrentPath() est une méthode simple que nous utilisons pour mettre à jour les données de BasicFrame que nous avons déjà déclarées. |
Si vous souhaitez voir un exemple qui utilise le dialogue de répertoire et les fonctions alors téléchargez wxbasic4c.zip et lisez le code source.
Sommaire
Une remarque ... |
enum
{ BASIC_EXIT = wxID_HIGHEST + 1,
BASIC_OPEN,
BASIC_SAVE,
BASIC_SAVE_AS,
BASIC_FONT,
BASIC_DIR,
BASIC_ABOUT,
BASIC_HELP
}; |
Si vous examinez les exemples présents ici vous verrez que j'ai fait un petit changement dans l'énumération que nous utilisons pour notre ID de fenêtre.
wxWindows utilise un certain nombre d'ID standard et les auteurs recommandent que les utilisateurs de ce framework évite simplement de piocher dans n'importe quelles valeurs d'ID windows dés lors qu'elle puisse entrer en conflit avec une déjà attribuée. Nous pouvons éviter ce conflit en utilisant wxID_HIGHEST + 1 lors de l'énumération de notre propre ID.
Un petit rappel : En présentant cela je n'ai montré que les détails importants. Vous devez vous rappeler que les exemples contiennent aussi d'autres codes pertinents, par exemple l'identifiant de fenêtres et la table d'événements. J'ai allége les programmes d'exemples pour la présentation dans le but de garder de l'espace et de ne pas s'égarer.
Retour en début de document
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