wxDev.fr, le portail francophone consacré à wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :2359

Membres en ligne : 0
Invités en ligne : 1

Valid XHTML 1.0 Transitional

Valid CSS2

Menu Snippets (navigation):
Pages: 1    Accueil » Snippets » Contrôles
» [wxDialog] : Quelques petites astuces
Détails du snippet : [wxDialog] : Quelques petites astuces
Informations sur l'auteur de ce snippet :


Hors ligne
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1369
Snippets: 25
Tutoriels: 6
Introduction / Description :
Bonjour à tous.

Voici quelques petits trucs concernant la classe wxDialog.

Certains sont simplement tirés de la doc officielle, d'autres concernent des méthodes non documentées de cette classe.
Contenu du snippet :
Tout d'abord, la création des boutons "standards".
La classe wxDialog possède deux méthodes permettant de facilement créer un sizer contenant une série de boutons standards.
Les boutons disponibles sont : "Ok", "Annuler", "Oui", "Non", "Aide"
Il vous suffira de les spécifier en utilisant une combinaison de leurs IDs qui sont respectivement wxOK, wxCANCEL, wxYES, wxNO, wxHELP.
Il y a également une valeur permettant de spécifier qu'aucun des boutons à créer ne doit être considéré comme le bouton par défaut : wxNO_DEFAULT
La première de ces deux méthodes affiche simplement les boutons voulus, alors que la deuxième les affiche sous une barre de séparation.
L'utilisation est très simple : il suffit de créer le sizer principal du wxDialog, de lui ajouter vos contrôles, et en dernier lieu, de lui ajouter le sizer contenant les boutons.
Par exemple, pour créer un simple wxDialog contenant un wxTextCtrl, et les boutons "Ok" et "Annuler" :

Code wxWidgets:

MyDialog::MyDialog(wxWindow *parent)
  : wxDialog(parent, -1,_T("Mon Dialogue"), wxDefaultPosition, wxDefaultSize)
{
    // Création du sizer principal
    wxBoxSizer *mainsizer=new wxBoxSizer(wxVERTICAL);
    // Création du wxTextCtrl et ajout au sizer principal
    mainsizer->Add(new wxTextCtrl(this,-1,_T(""),wxDefaultPosition, wxSize(200,150),wxTE_MULTILINE),1,wxALL|wxEXPAND,5);
    // Création d'un sizer contenant les boutons "Ok" et "Annuler"
    wxSizer *btnSizer=CreateButtonSizer(wxOK|wxCANCEL);
    // Ajout au sizer principal
    mainsizer->Add(btnSizer,0,wxALL|wxEXPAND,5);
    // Affectation du sizer au wxDialog
    SetSizer(mainsizer);
    // Calcul de la taille du wxDIalog
    mainsizer->SetSizeHints(this);
    // Centrage du wxDialog sur la fenêtre parent
    CenterOnParent();
}

Et voilà, c'est tout bête, et ça peut épargner quelques lignes de code.
Et pour avoir  les mêmes boutons, mais affichés sous une ligne horizontale, et sans que le bouton "Ok" soit le bouton par défaut, il auraiit suffit de mettre :

Code wxWidgets:

wxSizer *btnSizer=CreateSeparatedButtonSizer( wxOK| wxCANCEL| wxNO_DEFAULT);


Changer l'ID du bouton de validation
Il se peut que lors dela création de votre dialogue, vous ayez besoin de définir un bouton comme étant celui qui doit être cliqué pour valider votre dialogue (pour qu'il ait le même comportement qu'aurait eut le bouton Ok, par exemple).
Par la méthode "classique", il aurait fallu connecter ce bouton à une méthode du wxDialog depuis la table des événements, et dans cette méthode, appeler EndModal(wxOK).
Les concepteurs de wxWidgets ont tout prévu : il suffit de déclarer l'ID de ce bouton comme étant l'ID de validation, et le tour est joué.
Et cela se fait tout simplement comme ceci :

Code wxWidgets:

MyDialog::MyDialog(wxWindow *parent)
  : wxDialog(parent, -1,_T("Mon Dialogue"), wxDefaultPosition, wxDefaultSize)
{
    // Création des contrôles
    ......
    // Déclaration du bouton ayant l'ID "ID_BOUTON1" comme étant le "validateur"
    wxDialog::SetAffirmativeId(ID_BOUTON1);
}

Et sachez également que la même chose existe pour l'ID du bouton d'annulation :

Code wxWidgets:

wxDialog::SetEscapeId(ID_BOUTON2);


Simuler un clic sur un bouton du wxDialog
Vous avez besoin, pour une raison plus ou moins obscure, de simuler un clic sur un bouton de votre dialogue ?
Plutôt que de créer un wxCommandEvent et de l'initialiser avec les infos concernant le bouton en question, puis de poster un évènement afin qu'il soit traité normalement, il suffit d'appeler la méthode EmulateButtonClickIfPresent(int ID).
Cette méthode n'est pas référencée dans la doc officielle (sans doute parce qu'elle fait partie des méthodes "protected" de cette classe).
Voici un petit exemple (bidon, j'en convient, mais c'est juste pour illustrer):

Code wxWidgets:

void MyDialog::Cliquer_Sur_Annuler()
{
    wxDialog::EmulateButtonClickIfPresent(wxID_CANCEL);
}

Et ça marche avec n'importe quel bouton !
Explications finales :
Voilà, c'est tout pour l'instant.
D'autres petites combines viendront s'ajouter à cette liste.

D'ici là, @+ et bonne prog !
Xav'
Commentaires

Il n'y a pas encore de commentaire pour ce snippet.
Menu Snippets (navigation):
Pages: 1    Accueil » Snippets » Contrôles
» [wxDialog] : Quelques petites astuces