Partage
  • Partager sur Facebook
  • Partager sur Twitter

Un onglet qui "suit" la taille de la fenetre

wxWidgets -> wxNotebook et wxSizer

Sujet résolu
    30 mai 2008 à 18:14:49

    Bonjour tout le monde,

    Je suis sur un projet (qui n'est autre que l'idée du TP que propose M@teo21 dans son cours sur Qt). Seulement je le programme via la bibliothèque wxWidgets.

    Voilà mon problème.
    J'ai une fenetre principale (dérivée de wxFrame) dans laquelle j'ajoute un wxNotebook contenant 2 onglets (et prenant tout l'espace de la fenetre). J'ajoute dans le premier onglet, des sizer, des controles, ... enfin bref voilà :
    Comment faire pour que les box (staticBoxSizer) dans les onglets et qui contiennent les controles suivent la taille de la fenetre ?

    En effet, se trouvant dans un onglets, les controles ne suivent jamais la taille de la fenetre (que je mette n'importe quelle valeur aux paramètres de proportion de tous les sizers).

    Enfin, j'espère que quelqu'un voudra bien passer un petit peu de temps sur mon code pour le comprendre et le rectifier...
    Merci d'avance.

    // Crée les controles
    void FenetrePrincipale::creerControles()
    {
        wxBoxSizer* sizer0 = new wxBoxSizer(wxVERTICAL);
        SetSizer(sizer0);
    
        m_ongletsPrincipaux = new wxNotebook(this, -1);
        sizer0->Add(m_ongletsPrincipaux, 1, wxALL|wxEXPAND, 0);
    
            m_ongletOptions = new wxPanel(m_ongletsPrincipaux);
            m_ongletsPrincipaux->AddPage(m_ongletOptions, "Options", true);
    
                wxBoxSizer* sizer1 = new wxBoxSizer(wxVERTICAL);
                m_ongletOptions->SetSizer(sizer1);
    
                    wxBoxSizer* sizer2 = new wxBoxSizer(wxHORIZONTAL);
                    sizer1->Add(sizer2, 0, wxALL, 5);
    
                        wxStaticBoxSizer* boxDefDeLaClasse = new wxStaticBoxSizer(wxVERTICAL, m_ongletOptions, "Définition");
                        sizer2->Add(boxDefDeLaClasse, 0, wxALL, 5);
    
                            wxGridSizer* sizer3 = new wxGridSizer(2, 2, 5, 5);
                            boxDefDeLaClasse->Add(sizer3, 0, wxALL, 5);
    
                                wxStaticText* textNomDeLaClasse = new wxStaticText(m_ongletOptions, -1, "Nom de la classe : ");
                                sizer3->Add(textNomDeLaClasse, 0, wxALL, 5);
    
                                m_nomDeLaClasse = new wxTextCtrl(m_ongletOptions, ID_NOMDELACLASSE);
                                sizer3->Add(m_nomDeLaClasse, 0, wxALL, 5);
    
                                wxStaticText* textNomDeLaClasseMere = new wxStaticText(m_ongletOptions, -1, "Classe mère : ");
                                sizer3->Add(textNomDeLaClasseMere, 0, wxALL, 5);
    
                                m_nomDeLaClasseMere = new wxTextCtrl(m_ongletOptions, ID_NOMDELACLASSEMERE);
                                sizer3->Add(m_nomDeLaClasseMere, 0, wxALL, 5);
    
                        wxStaticBoxSizer* boxOptionsDeLaClasse = new wxStaticBoxSizer(wxVERTICAL, m_ongletOptions, "Options");
                        sizer2->Add(boxOptionsDeLaClasse, 0, wxALL, 5);
    
                            wxGridSizer* sizer4 = new wxGridSizer(3, 1, 5, 5);
                            boxOptionsDeLaClasse->Add(sizer4, 0, wxALL, 5);
    
                                m_protectionHeader = new wxCheckBox(m_ongletOptions, ID_PROTECTIONHEADER, "Protéger le header contre les inclusions multiples");
                                sizer4->Add(m_protectionHeader, 0, wxALL, 5);
                                m_protectionHeader->SetValue(true);
    
                                m_genererConstructeurParDefaut = new wxCheckBox(m_ongletOptions, ID_GENERERCONSTRUCTEURPARDEFAUT, "Générer un constructeur par défaut");
                                sizer4->Add(m_genererConstructeurParDefaut, 0, wxALL, 5);
                                m_genererConstructeurParDefaut->SetValue(true);
    
                                m_genererDestructeur = new wxCheckBox(m_ongletOptions, ID_GENERERDESTRUCTEUR, "Générer un destructeur");
                                sizer4->Add(m_genererDestructeur, 0, wxALL, 5);
                                m_genererDestructeur->SetValue(true);
    
                    wxBoxSizer* sizer5 = new wxBoxSizer(wxHORIZONTAL);
                    sizer1->Add(sizer5, 0, wxALL, 5);
    
            m_ongletCode = new wxPanel(m_ongletsPrincipaux);
            m_ongletsPrincipaux->AddPage(m_ongletCode, "Code", false);
    }
    


    Les variables non déclarées dans la fonction sont des attributs de la classe...

    Tous les paramètres de proportion des fonctions "Add" sont à zéro mais quand je les mets à 1, ca ne marche pas non plus. Le systeme d'onglet prend bien tout l'espace de la fenetre mais chaque onglet ne suis pas la taille de celle-ci.
    • Partager sur Facebook
    • Partager sur Twitter
      1 juin 2008 à 11:27:59

      Un petit up... :o

      Si vous ne comprenez pas mon problème, dites-le moi svp. ^^
      • Partager sur Facebook
      • Partager sur Twitter
        1 juin 2008 à 11:35:05

        Le probleme c'est que la majorité ici apprenne le C/C++ sur le Sdz donc n'utilise pas wx mais Qt. Tu devrais posé la question sur developpez.net =) !
        • Partager sur Facebook
        • Partager sur Twitter
          1 juin 2008 à 12:17:11

          Salut.

          Je viens de jeter un coup d'œil à ton code.
          Le problème vient bien des paramètres quand tu fais un "wxSizer->Add(...)".
          Mais en fait, il ne faut pas raisonner dans ce sens : il ne faut pas que tes contrôles s'adaptent à ta fenêtre, mais l'inverse (pour que tout soit visible).

          Il faut donc que ta wxFrame ne soit pas redimensionnable, etil faut ajouter, à la fin de ton code :
          sizer0->SetSizeHints(this);
          

          afin que la taille de la fenêtre s'adapte à son contenu.

          @+
          Xav'
          • Partager sur Facebook
          • Partager sur Twitter
          Portail français wxWidgets : wxDev.fr | Quelques progs + libs wxWidgets compilées : mywxstuff
            2 juin 2008 à 6:54:29

            C'est pas exactement la réponse à laquelle je m'attendais mais l'idée est bien aussi :)
            Faut juste que je trouve comment faire pour que la fenetre ne puisse etre redimensionnée ;)
            Merci :)
            • Partager sur Facebook
            • Partager sur Twitter

            Un onglet qui "suit" la taille de la fenetre

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown