2012-06-01 2 views
1

При динамическом изменении размера элементов в wxNotebook (например, скрытии кнопки) размер всего элемента ноутбука не обновляется. Это может оставить пробел или предотвратить отображение некоторых элементов.Изменение размера wxNotebook при изменении размеров содержимого

Как правило, вызов Fit() или FitInside() родительского окна должен делать трюк, но не для ноутбука. Как мы можем изменить его размер?

Минимальный пример, демонстрирующий проблему:

#include <wx/wx.h> 
#include <wx/gbsizer.h> 
#include <wx/notebook.h> 

const int HIDEME_ID = 512, SHOWME_ID = 513; 

class MyApp: public wxApp 
{ 
    wxButton* hideme; 
    wxSizer* panel_sizer, *frame_sizer, *sw_sizer; 
    wxScrolledWindow* sw; 
    wxNotebook* nb; 

    void hide_button(wxCommandEvent&) { 
     hideme->Hide(); 
     relayout(); 
    } 
    void relayout() { 
     /* Insert layout code here */ 
    } 
    void show_button(wxCommandEvent&) { 
     hideme->Show(); 
     relayout(); 
    } 
    virtual bool OnInit() { 
     wxFrame *frame = new wxFrame(NULL, wxID_ANY, _("Hello World"), wxPoint(50, 50), wxSize(450, 340)); 
     frame_sizer = new wxBoxSizer(wxVERTICAL); 
     frame->SetSizer(frame_sizer); 

     sw = new wxScrolledWindow(frame, wxID_ANY); 
     sw->SetScrollRate(5, 5); 
     frame_sizer->Add(sw, 1, wxEXPAND); 

     sw_sizer = new wxBoxSizer(wxVERTICAL); 
     sw->SetSizer(sw_sizer); 

     nb = new wxNotebook(sw, wxID_ANY); 
     wxPanel* panel = new wxPanel(nb, wxID_ANY); 
     nb->AddPage(panel, wxT("Tab1")); 

     sw_sizer->Add(new wxButton(sw, wxID_ANY, _("Button1"), wxDefaultPosition, wxSize(200,200)), 0, wxEXPAND); 
     sw_sizer->Add(nb, 0, wxEXPAND); 
     sw_sizer->Add(new wxButton(sw, wxID_ANY, _("Button3")), 1, wxEXPAND); 
     sw_sizer->Add(new wxButton(sw, wxID_ANY, _("Button4")), 0, wxEXPAND); 

     panel_sizer = new wxBoxSizer(wxVERTICAL); 
     panel_sizer->Add(hideme = new wxButton(panel, HIDEME_ID, wxT("HideMe")), 0, wxEXPAND); 
     hideme->Hide(); 
     panel_sizer->Add(new wxButton(panel, SHOWME_ID, wxT("ShowMe")), 0, wxEXPAND); 
     panel->SetSizer(panel_sizer); 

     frame->Show(true); 
     SetTopWindow(frame); 
     return true; 
    } 

    DECLARE_EVENT_TABLE(); 
}; 

BEGIN_EVENT_TABLE(MyApp, wxApp) 
    EVT_BUTTON(HIDEME_ID, MyApp::hide_button) 
    EVT_BUTTON(SHOWME_ID, MyApp::show_button) 
END_EVENT_TABLE() 


IMPLEMENT_APP(MyApp); 

ответ

3

Несколько удивительно ловушкой здесь является то, что, в отличие от многих других окнами, wxNotebook кэширует его оптимальный размер. Мы должны аннулировать кеш, прежде чем делать какие-либо макеты:

nb->InvalidateBestSize(); 
sw->FitInside(); 
+0

ОН МОЙ БОГ, спасибо! Это меня беспокоило около 3 часов. Весь код, который вы считаете * должен * работать, делает после аннулирования размера! – Robert