2012-06-01 105 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

相關問題