Membres inscrits :2359
Membres en ligne : 0
Invités en ligne : 3


|
Conversation (Résolue) : frame, panel et wxflexsizer |
milope (Membre)
Inscrit le : 07-01-2010
Messages: 34
Snippets: 0
Tutoriels: 0
Hors ligne |
Bonjour, J'ai un souci de dimensionnement ! Je m'explique :
Je bosse sous C::B avec wxSmith ; J'ai une frame 'pere' :
Code Cpp:MaFrame::MaFrame(wxWindow* parent, wxWindowID id) { Create(parent, id, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, _T("id")); SetClientSize(wxSize(421,533)); Center(); (...) }
Et un panel 'fils' qui contient un FlexSizer, un Treectrl et un Grid :
Code Cpp:MyPanel::MyPanel(wxWindow* parent,wxWindowID id,const wxPoint& pos,const wxSize& size) { Create(parent, id, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("id")); FlexGridSizer1 = new wxFlexGridSizer(1, 2, 5, 5); FlexGridSizer1->AddGrowableCol(1); FlexGridSizer1->AddGrowableCol(2); TreeCtrl1 = new wxTreeCtrl(this, ID_TREECTRL1, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE, wxDefaultValidator, _T("ID_TREECTRL1")); FlexGridSizer1->Add(TreeCtrl1, 0, wxALL|wxEXPAND|wxALIGN_LEFT|wxALIGN_TOP, 5); Grid1 = new wxGrid(this, ID_GRID1, wxDefaultPosition, wxDefaultSize, 0, _T("ID_GRID1")); FlexGridSizer1->Add(Grid1, 0, wxALL|wxEXPAND|wxALIGN_RIGHT|wxALIGN_TOP, 5); SetSizer(FlexGridSizer1); FlexGridSizer1->Fit(this); FlexGridSizer1->SetSizeHints(this); }
Je creé mon panel comme ceci :
Code Cpp: PGrille = new PanelGrille(this, -1); PGrille->Show();
Le problème, c'est que lorsque je redimensionne ma fenêtre, les contrôles grid et treectrl ne suivent pas (et donc le panel) :s
[edit:]exemple en image : 
Je ne vois pas d'où vient le probleme, mais je suis sure que c'est tt bete... Grand merci d'avance !
Dernière modification par milope (07-01-2010 13:03:48)
|
C::B 10.05 wx 2.8.10 (unicode), Linux et MinGW 2 Intel Xeon 3GHz, 2G ram sous Ubuntu 10.04
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne |
milope:Bonjour Salut, et bienvenue sur wxDev.fr
Ton problème vient du deuxième paramètre que tu donnes lorsque tu ajoutes tes contrôles à ton FlexGridSizer. Tu mets la valeur "0", ce qui signifie que le contrôle est à ne pas redimensionner.
Pour que les contrôles soient redimensionnables, ce paramètre doit être une valeur supérieure à 0, indiquant la proportion du contrôles par rapport aux autres. Par exemple, si tu veux un contrôle occupant 2/3 de la surface, et un autre occupant 1/3, tu met "2" au premier et "1" au deuxième. Dans ton cas, pour par exemple, répartir équitablement les deux contrôles il faudrait faire :
Code wxWidgets:MyPanel::MyPanel(wxWindow* parent,wxWindowID id,const wxPoint& pos,const wxSize& size) { ... FlexGridSizer1->Add(TreeCtrl1, 1, wxALL|wxEXPAND|wxALIGN_LEFT|wxALIGN_TOP, 5); ... FlexGridSizer1->Add(Grid1, 1, wxALL|wxEXPAND|wxALIGN_RIGHT|wxALIGN_TOP, 5); ... }
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà ... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
|
milope (Membre)
Inscrit le : 07-01-2010
Messages: 34
Snippets: 0
Tutoriels: 0
Hors ligne |
Merci pour ta réponse rapide ! Néanmoins, cela ne règle qu'une partie du problème qui est un chouïa plus compliqué que ce que j'ai expliqué précédemment : en ayant voulu simplifier, le cœur du souci à disparu...
En effet, mon projet comporte une frame et deux panels, et c'est, au vues de nouveaux essais, ce qui pose problème...
Désolé pour les doublons, mais je redécris 
Donc : la frame 'pere' et le panel 'fils'(panel_2) ne changent pas. Par contre, une autre frame toute bete (panel_1), sans sizer est présente :
Code Cpp:MyPanel_1::MyPanel_1(wxWindow* parent,wxWindowID id,const wxPoint& pos,const wxSize& size) { //(*Initialize(PanelProjet) Create(parent, id, wxDefaultPosition, wxDefaultSize, 0, _T("id")); BtCalcul = new wxButton(this, ID_BTCALCUL, _("Launch calculation"), wxPoint(240,440), wxDefaultSize, 0, wxDefaultValidator, _T("ID_BTCALCUL")); Connect(ID_BTCALCUL,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&PanelProjet::OnBtCalculClick); }
Elle est appelée depuis la frame
Code Cpp: Panel_1 = new MyPanel_1(this, -1); MyPanel_1->Show();
Elle contient un bouton qui permet de la cacher et de créer le Panel_2 (celui du premier message) via une fonction de la frame :
Code Cpp:void MyPanel_1::OnBtCalculClick(wxCommandEvent& event) { this->Hide(); //(this == Panel_1) MaFrame->AfficherPanel_2(); }
Code Cpp:void MaFrame::AfficherPanel_2() { Panel_2 = new MyPanel_2(this, -1); PGrille->Show(); }
Et bim ! probleme : si j'affiche MyPanel_2 tout seul (sans passer par MyPanel_1) ça roule, tout est bien dimentionneé. Par contre, en passant par MyPanel_1 (qui ne contient pas de sizer), ca ne dimentionne plus...
En esperant avoir ete a peu pres clair (ca m'apprendra a vouloir simplifier le code pour le forum...)
Merci !
|
C::B 10.05 wx 2.8.10 (unicode), Linux et MinGW 2 Intel Xeon 3GHz, 2G ram sous Ubuntu 10.04
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne |
Effectivement, le problème est tout autre.
Lorsqu'une frame ne contient qu'un seul contrôle, ce dernier est automatiquement redimensionné pour occuper toute la zone cliente. Dès que tu y ajoutes un deuxième contrôle, c'est à toi de gérer leurs positions respectives.
Pour cela, tu peux utiliser un sizer principal (un wxBoxSizer devrait amplement faire l'affaire), dans lequel tu ajoutes tes panels.
Si tu souhaites ajouter ou supprimer des contrôles en cours d'exécution, il faut que tu stockes le pointeur vers ce sizer, afin de pouvoir manipuler les éléments qu'il contient. Lorsque tu as fait tes modifs (ajout, suppression), il ne faut pas oublier de faire un Layout() afin de le mettre à jour.
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà ... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
|
milope (Membre)
Inscrit le : 07-01-2010
Messages: 34
Snippets: 0
Tutoriels: 0
Hors ligne |
Xav:Dès que tu y ajoutes un deuxième contrôle, c'est à toi de gérer leurs positions respectives. Même si je Hide le premier ?! C'est qu'ils n'apparaissent pas en même temps, car là , l'un remplace l'autre...
|
C::B 10.05 wx 2.8.10 (unicode), Linux et MinGW 2 Intel Xeon 3GHz, 2G ram sous Ubuntu 10.04
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne |
Qu'il soit caché ou non ne change rien : tu as toujours deux contrôles dans ta frame.
Le plus simple (mais pas toujours faisable) est d'ajouter les deux contrôles (avec une proportion de 1) dès le démarrage, et en fonction de ce que tu veux voir, tu caches/affiche les contrôles correspondants (dans ton cas, des panels), et tu n'oublies pas le Layout() sur le sizer principal (sinon, tu ne verras pas le changement sans redimensionner la fenêtre.
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà ... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
|
guyothomas (Membre)
Inscrit le : 05-06-2008
Messages: 66
Snippets: 0
Tutoriels: 0
Hors ligne |
wxSalut!
alors, je fais un truc similaire à toi (panels affichés alternativement mais dans le même sizer) dans un de mes progs, c'est avec un wxBoxSizer qui contient plein de panels. Lors de la création, je fais du:
Code wxWidgets: mon_sizer_middle->Insert(0, config_panel); mon_sizer_middle->Insert(0, protocol_panel); mon_sizer_middle->Insert(0, local_panel); Puis je fais un Hide() pour chaque panel sauf 1! Et ensuite, quand je veux changer de panel affiché, je les mon_sizer_middle->Hide() tous puis je mon_sizer_middle->Show() celui que je veux.
Sans parler du redimensionnement, c'est peut être cette partie qu'il te manque. Je sais que ce truc marche avec les Insert(); mais pas avec les Add();.
En espérant aider, Thomas.
|
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne |
guyothomas:Je sais que ce truc marche avec les Insert(); mais pas avec les Add(); Il me semble bien que si.
J'avais fait un truc dans ce genre il y a quelques temps : - Un premier panel avec une listbox qui était tout le temps affiché - Chaque entrée de la listbox correspondant à un panel - En fonction de ce qui était sélectionné dans la listbox, j'affichais ou masquais les autres panels - Lorsque c'était fait, il suffisait de faire un Layout() sur le sizer principal, et ça marchait tip-top.
Et il me semble bien que j'utilisais la méthode Add() du sizer (je n'ai pas souvenir d'avoir déjà utilisé la méthode Insert() ).
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà ... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
|
guyothomas (Membre)
Inscrit le : 05-06-2008
Messages: 66
Snippets: 0
Tutoriels: 0
Hors ligne |
Ce n'est pas par pur plaisir de contredire, mais je pense que le Insert(int place, wxWindow) permet que tous les panels soient à la place '0' dans le sizer. Add() les met les uns à la suite des autres, ils ont donc chacun leur place. Là , moi, j'insère chaque panel par dessus l'ancien. Je pense que la différence est là .
Sur ce, bonne soirée, et bon week-end!
|
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne |
guyothomas:Sur ce, bonne soirée, et bon week-end! Comment ça ? On n'est que jeudi il me semble ?
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà ... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
|
milope (Membre)
Inscrit le : 07-01-2010
Messages: 34
Snippets: 0
Tutoriels: 0
Hors ligne |
Ben en tout cas merci beaucoup !
Tout cela m'a bien servi, surtout à faire le menage dans ma tete concernant certains concepts, et accessoirement pour regler mon probleme 
A bientot pour de nouvelles aventures.
PS: J'utilise Add
|
C::B 10.05 wx 2.8.10 (unicode), Linux et MinGW 2 Intel Xeon 3GHz, 2G ram sous Ubuntu 10.04
|
guyothomas (Membre)
Inscrit le : 05-06-2008
Messages: 66
Snippets: 0
Tutoriels: 0
Hors ligne |
OK, je m'incline... Disons que les deux solutions fonctionnent...
|
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne |
Hello
Juste pour en remettre une petite couche  La méthode wxSizer::Add() utilise en fait la méthode wxSizer::Insert() :
Code wxWidgets:
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà ... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
|
guyothomas (Membre)
Inscrit le : 05-06-2008
Messages: 66
Snippets: 0
Tutoriels: 0
Hors ligne |
OK, OK, ...
problem solved?
|
|
milope (Membre)
Inscrit le : 07-01-2010
Messages: 34
Snippets: 0
Tutoriels: 0
Hors ligne |
Effectivement, résolue (je ne sais comment le marquer :s ) ---------- enfin, plus ou moins  mais un nouveau thread me semble nécessaire...
Dernière modification par milope (15-01-2010 14:24:27)
|
C::B 10.05 wx 2.8.10 (unicode), Linux et MinGW 2 Intel Xeon 3GHz, 2G ram sous Ubuntu 10.04
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne |
milope:Effectivement, résolue (je ne sais comment le marquer :s ) Il y a un petit bouton vert à droite du titre de chaque post : il sert à définir le (ou les) post correspondant comme "résolvant le problème".
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà ... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
|
|