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 : 3

Valid XHTML 1.0 Transitional

Valid CSS2

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» frame, panel et wxflexsizer
Conversation (Résolue) : frame, panel et wxflexsizer
07-01-2010 12:14:07  frame, panel et wxflexsizer #1
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 : http://img5.hostingpics.net/thumbs/mini_818122Capture_Fenetre_sans_nom.png

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
07-01-2010 14:21:47  Re: frame, panel et wxflexsizer #2
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1383
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à...
07-01-2010 15:32:32  Re: frame, panel et wxflexsizer #3
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
07-01-2010 16:12:37  Re: frame, panel et wxflexsizer #4
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1383
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à...
07-01-2010 16:18:23  Re: frame, panel et wxflexsizer #5
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
07-01-2010 16:27:31  Re: frame, panel et wxflexsizer #6
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1383
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à...
07-01-2010 16:27:34  Re: frame, panel et wxflexsizer #7
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.
07-01-2010 16:42:49  Re: frame, panel et wxflexsizer #8
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1383
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à...
07-01-2010 17:53:26  Re: frame, panel et wxflexsizer #9
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!
07-01-2010 22:28:27  Re: frame, panel et wxflexsizer #10
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1383
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à...
08-01-2010 11:17:49  Re: frame, panel et wxflexsizer #11
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 :p

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
11-01-2010 08:51:59  Re: frame, panel et wxflexsizer #12
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...
11-01-2010 09:27:47  Re: frame, panel et wxflexsizer #13
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1383
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:

inline wxSizerItem*
wxSizer::Add( wxSizerItem *item )
{
    return Insert( m_children.GetCount(), item );
}


@+
Xav'

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà...
11-01-2010 12:33:37  Re: frame, panel et wxflexsizer #14
guyothomas (Membre)
Inscrit le : 05-06-2008
Messages: 66
Snippets: 0
Tutoriels: 0
Hors ligne
OK, OK, ...

problem solved?
15-01-2010 14:23:20  Re: frame, panel et wxflexsizer #15
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 :p
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
15-01-2010 16:14:17  Re: frame, panel et wxflexsizer #16
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1383
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à...
Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» frame, panel et wxflexsizer