IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

wxWidgets Discussion :

Organiser des sizers / afficher en double


Sujet :

wxWidgets

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 16
    Points : 15
    Points
    15
    Par défaut Organiser des sizers / afficher en double
    Bonjour à tous.

    Je vais essayer de vous exposer mon problème assez simplement.

    Je suis en train de créer un petit éditeur pour un jeu de hockey (NHL09).
    Mon problème se situe dans la gestion des caractéristiques puisque 2 types de joueurs interviennent :
    - gardien
    - skater (joueur autre que le gardien, attaquant ou défenseur)

    Chacun possède des caractéristiques propres mais ils possèdent aussi des caractéristiques communes.

    Mon soucis réside sur ces caractéristiques communes qui doivent être affichées lorsqu'un gardien est sélectionné dans la liste ou lorsqu'un skater est sélectionné.
    J'ai pour objectif de représenter un joueur dans un wxNotebook de la manière suivante : 1 onglet pour les informations personnelles du joueur, et 1 onglet pour ses caractéristiques ou attributs.

    NB : 1 caractéristique est représentée ainsi : un wxBoxSizer contenant un wxStaticText + un wxSpinCtrl.

    J'ai essayé de nombreuses réflexions qui se sont toutes avérées infructueuses :
    - j'ai essayé de mettre à jour l'onglet Attributs en fonction du type de joueur sélectionné en utilisant ces fonctions sur les sizers : "Detach()", "Replace()", "Insert()". Explosions diverses et variées du programme. Je ne sais pas ce que je ratais mais je n'ai pas réussi une seule fois à détacher un sizer d'un endroit et l'insérer ailleurs.

    - du coup j'ai opté pour un système à 3 onglets :
    -> un onglet Infos Perso.
    -> un onglet Attributs Skater.
    -> un onglet Attributs Gardien.
    Avec comme intérêt final d'activer ou non les onglets suivant le type de joueur.
    Dans ce cas j'ai rencontré le problème suivant : j'ai essayé de créer une référence, ou une copie sur chaque caractéristiques communes pour pouvoir l'afficher sur chaque onglet mais je n'ai pas réussi.

    Dans l'absolu, je ne souhaite pas copier ces caractéristiques en double. Je penserais plutôt à une référence ou un pointeur permettant d'afficher une caractéristiques à deux endroits différents. Cela doit bien être possible.


    Voilà, cela fait un bon moment que je retourne le problème dans tous les sens et je n'arrive pas à trouver une solution claire et efficace.
    Je vous écris donc pour savoir si quelqu'un aurait une idée à me proposer pour agencer tout ça, ou des explications sur l'une des deux solutions que j'ai essayées inefficacement.


    Merci d'avance.


    Gourbish.

  2. #2
    dug
    dug est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Points : 84
    Points
    84
    Par défaut
    heu... beaucoup trop fonctionnel ton problème, on peut pas vraiment t'aider sur ton problème d'interface, tu fais comme tu préfères, tout est presque faisable en wxwidgets.

    donc, tu as des fonctions Draw dans tes contrôles, qui te permettent d'afficher le contenu de l'objet. Ces fonctions sont appelées dès qu'il y a besoin de rafficher ton objet, cad s'il y a une fenêtre qui passe par dessus l'objet.
    dans cette fonction, tu affiches le contenu d'une variable, en accédant par un pointeur. Plusieurs objets peuvent pointés sur la même variable, donc dès que tu changes la valeur de la variable, tu appelles le refresh de tes onglets ou contrôle, et cela se met à jour tout seul...

    désolé si tu sais tout cela, mais bon, j'essaye de t'aider simplement.

  3. #3
    Membre averti Avatar de wxXav
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Décembre 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur amateur

    Informations forums :
    Inscription : Décembre 2008
    Messages : 214
    Points : 354
    Points
    354
    Par défaut
    Salut.

    Pour ton agencement avec deux onglets, c'est tout à fait faisable.
    Voici le principe :
    Pour le premier onglet, je pense que tu n'as pas de soucis vu que (si j'ai bien compris), c'est un onglet commun aux deux types de personnage).
    Pour le deuxième onglet, voici ce que tu peux faire :
    Pour chaque type de personnage, tu crées un wxPanel contenant les contrôles permettant d'afficher/définir ses attributs.
    Tu places les deux wxPanel dans l'onglet, mais tu n'en affiche qu'un à la fois, en masquant celui qui ne t'intéresse pas (m_panel->Hide() ).

    Lorsque tu veux changer l'affichage, tu affiches/caches le wxPanel correspondant, et le tour est joué.

    Pour placer les deux wxPanels dans une "page" du wxNotebook, tu en utilises un 3ème qui leur sert de parent, et tu gères ça avec un wxBoxSizer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    // le wxPanel parent
    wxPanel *m_page2=new wxPanel(m_nBook, -1);
    // le wxBoxSizer pour gérer les deux wxPanel enfants
    wxBoxSizer *srz=new wxBoxSizer(wxHORIZONTAL);
    // le wxPanel pour les contrôles relatifs au gardien
    wxPanel *pnlGardien = new wxPanel(m_page2,- 1);
    // Tu places les contrôles propres au gardien sur ce panel
     
    // le wxPanel pour les contrôles relatifs aux autres joueurs
    wxPanel *pnlJoueur = new wxPanel(m_page2, -1);
    // Tu places les contrôles propres au joueur sur ce panel
     
    // On ajoute les deux wxPanels au wxBoxSizer
    szr->Add(m_pnlGardien, 0, wxALL|wxEXPAND, 0);
    szr->Add(m_pnlJoueur, 0, wxALL|wxEXPAND, 0);
     
    // On n'affiche que le wxPanel correspondant au gardien
    pnlGardien->Show();
    pnlJoueur->Hide();
    //On met à jour le wxBoxSizer
    szr->Layout();
     
    // On ajoute la page au wxNotebook
    m_nBook->AddPage(m_page2, _T("Attributs"));
    Ensuite, quand tu as besoin de modifier l'affichage (par exemple, pour passer d'un gardien à un joueur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    m_pnlGardien->Hide();
    m_pnlJoueur->Show();
    m_page2->GetSizer()->Layout();
    Avec ça, normalement, ça devrait marcher.
    Si tu as besoin de plus d'infos, n'hésite pas.
    @+
    Xav'

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 16
    Points : 15
    Points
    15
    Par défaut
    Salut et désolé pour l'absence de réponse : j'ai eu quelques contre-temps à l'époque donc j'avais par la suite réussi à me débrouiller par moi même, je ne me rappelais même plus avoir écrit ce sujet ! Oups !


    Donc j'ai réussi à résoudre ce problème en 2 temps.

    Dans un premier temps, j'avais fait quelque chose de très proche de ce que wxXav proposait, mais l'inconvénient était le temps de travail d'un tel système : à chaque changement de joueur, si l'on passait d'un skater à un gardien ou inversement, il fallait ré-afficher TOUT un panel. Et certaines infos sont doublées.

    Par la suite j'ai enfin réussi à utiliser la fonction Detach() d'un sizer après avoir fait de nombreuses recherches de fuites de mémoire. Ainsi, j'ai un unique panel pour les attributs quelque soit le type de joueur.
    - Pour cela, je crée tous les attributs (ceux d'un skater, ceux d'un gardien et ceux communs).
    - Ensuite, en fonction du type de joueur, j'insère et j'affichent les sizers contenant les attributs qui lui correspondent, tout en détachant et masquant les sizers contenant les mauvais attributs. En résumé :
    -> si skater : insérer et afficher attributs d'un skater / détacher et masquer attributs d'un gardien
    -> si gardien : insérer et afficher attributs d'un gardien / détacher et masquer attributs d'un skater



    Donc merci quand même de s'être penché sur la question et désolé de ne pas y avoir répondu plus tôt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 02/10/2014, 17h13
  2. [XL-2010] Listview / double clique pour ouverture usf / et / choix des colonnes à afficher
    Par GADENSEB dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 25/08/2014, 09h38
  3. Organisation des classes
    Par R3iTt0R dans le forum Langage
    Réponses: 2
    Dernier message: 02/06/2004, 17h27
  4. Réponses: 2
    Dernier message: 18/12/2002, 10h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo