Cinquième Étape
Utilisation des dialogues personnalisés ou
« custom dialogs »
Introduction
Il est bien entendu que les dialogues communs sont destinés aux besoins courants et il y a beaucoup de cas où nous avons besoin de construire des dialogues personnalisés.
Il est particulièrement difficile de construire des dialogues personnalisés mais cela peut être rendu compliqué par l'approche adoptée et la majeure partie de la complexité initiale peut provenir de la conception de l‘aspect de ces boîtes de dialogue par exemple l'endroit où se situe les contrôles et leurs dimensions. Nous allons commencer d'abord par le plus difficile c'est à dire entrer en dur le code(hard coding) d'aspect des boites de dialogues.
Il y a des solutions plus adaptées qui utilisent des outils comme l'éditeur de dialogue « Julian Smart's Dialog Editor » et/ou « Robert Roebling's wxDesigner ». « Julian Smart's Dialog Editor” est distribué avec wxWindows, wxDesigner est un « shareware » et mérite bien son prix de quelques dollars. Vous pouvez vous entraîner gentiment avec l'éditeur de dialogue mais la différence entre les deux est trop nette si bien que je vous recommande vraiment de vous procurer wxDesigner.
Utilisation d'un premier dialogue personnalisé
|
Voici une boite de dialogue très simple, elle contient trois contrôles, un contrôle de texte et deux boutons. La boite de dialogue elle-même a un emplacement sur l'écran, relatif à la fenêtre parent, une hauteur et une largeur( Commentaire_4). Chaque contrôle a un emplacement définis dans la boite de dialogue qui est leur fenêtre parent et chacun d'eux a une dimension. |
D'abord, je vais vous montrer sa mise en place puis nous regarderons tous en détails.
void BasicFrame::OnAbout(wxCommandEvent & event)
{
BasicDialog
aboutDialog ( this,
-1,
"Your very own dialog",
wxPoint(100,100),
wxSize(200,200)
);
if (aboutDialog.ShowModal() != wxID_OK)
theText->AppendText("The about box was cancelled.\n");
else
theText->AppendText(aboutDialog.GetText());
} |
Vous voyez ici comment nous appelons le dialogue. Le dialogue est instancié dans la méthode OnAbout de la classe BasicFrame.
Pour l'utiliser, nous:
- Construisons le dialogue, définissons les arguments appropriés au constructeur: aboutdialog est de type BasicDialog.
- Nous appelons la méthode de dialogue ShowModal qui affiche le dialogue. Nous pourrions appeler Show() dans le cas où le dialogue ne dût pas accaparer la fenêtre active mais la plupart des dialogues sont conçus pour cette utilisation, c.a.d quand un tel dialogue est affiché nous ne pouvons pas déplacer l'activité de saisie(input focus c.a.d souris, clavier,..) sur d'autres éléments de l'application.
- Nous recevons un état de retour que nous traitons. Si la méthode ShowModal retourne une valeur équivalente à wxID_OK , nous agissons d'une façon sinon nous agissons autrement.
- Nous utilisons alors les valeurs saisies par le contrôle de dialogue de texte.
Comme vous pouvez le voir, l‘usage d'un dialogue personnalisé n'est guère différent d'un autre type de dialogue.
class BasicDialog: public wxDialog
{
public:
BasicDialog
( wxWindow *parent,
wxWindowID id,
const wxString &title,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = wxDEFAULT_DIALOG_STYLE
);
wxTextCtrl * dialogText;
wxString GetText();
private:
void OnOk( wxCommandEvent &event );
DECLARE_EVENT_TABLE()
}; |
Construire un dialogue personnalisé
Le fichier d'en-tête basic.h contient l'interface de dialogue.
BasicDialog est dérivée de wxDialog et un dialogue nécessite ce qui suit pour sa construction:
Une fenêtre parent: Le dialogue doit appartenir à quelque chose.
Un ID: Cela peut être quelque chose déterminé par le programmeur ou cela peur être -1 dans le cas où la valeur par défaut serait choisie :
Un titre: Simplement une wxString.
Une position relative à celle de fenêtre parent.
Une dimension.
Un style.
Le dialogue personnalisé peut aussi avoir un autre paramètre de construction hérite de wxDialog et c'est un nom. Cette propriété a une limite d'utilisation dans le cas de Windows.
L'implémentation de dialogue personnalisé est dans basic.cpp . BasicDialog déclare deux membres publics en dehors de son constructeur. Il y a un contrôle de texte et une fonction membre qui retourne une chaîne. BasicDialog déclare aussi un membre privé OnOk() et une table d'évènement.
BasicDialog::BasicDialog
( wxWindow *parent,
wxWindowID id,
const wxString &title,
const wxPoint &position,
const wxSize& size,
long style
) :
wxDialog( parent, id, title, position, size, style)
{
wxString dimensions = "", s;
wxPoint p;
wxSize sz;
sz.SetWidth(size.GetWidth() - 20);
sz.SetHeight(size.GetHeight() - 70);
p.x = 6; p.y = 2;
s.Printf(" x = %d y = %d\n", p.x, p.y);
dimensions.append(s);
s.Printf( " width = %d height = %d\n",
sz.GetWidth(), sz.GetHeight());
dimensions.append(s);
dimensions.append(AUTHOR);
dialogText =
new wxTextCtrl ( this, -1,
dimensions,
p, sz,
wxTE_MULTILINE
);
p.y += sz.GetHeight() + 10;
wxButton * b =
new wxButton( this,
wxID_OK,
"OK",
p,
wxDefaultSize);
p.x += 110;
wxButton * c =
new wxButton( this,
wxID_CANCEL,
"Cancel",
p,
wxDefaultSize);
} |
Le constructeur qui hérite de wxDialog.
Nous déclarons quelques variables locales p et sz utilise pour aider à mettre en place les positions et les dimensions des contrôles dans le dialogue. Vous devez lire à ce propos les classes WxPoint et wxSize dans l'aide wxWindows.
Nous devons paramétrer les valeurs des positions initiales dans p et aussi utiliser la méthode Printf to wxString pour formater un message.
Un contrôle de texte est ajouter au dialogue, il contient tout ce que les dimensions de chaîne contiennent, la position et la dimension en adéquation avec p et sz .
Maintenant nous réglons p , créons un bouton b, réglons p à nouveau et créons un bouton c.
Remarquez que wxID_OK et wxID_CANCEL sont utilisés. Ce sont les ID par défaut. |
Si vous souhaitez voir un exemple qui utilise les dialogues personnalisés et leurs fonctions alors téléchargez wxbasic5.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 un 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