首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当内容大小更改时调整wxNotebook的大小

当内容大小更改时调整wxNotebook的大小
EN

Stack Overflow用户
提问于 2012-06-01 16:00:57
回答 1查看 1.7K关注 0票数 2

当动态改变wxNotebook中元素的大小(例如,隐藏按钮)时,整个notebook元素的大小不会更新。这可能会留下空白或阻止显示某些元素。

通常,对父窗口的Fit()或FitInside()的调用应该可以做到这一点,但对notebook却不行。我们如何调整它的大小?

演示问题的最小示例:

代码语言:javascript
复制
#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 );
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-01 16:00:57

这里有些令人惊讶的陷阱是,与许多其他窗口不同,wxNotebook缓存了它的最佳大小。在进行任何布局之前,我们必须使缓存无效:

代码语言:javascript
复制
nb->InvalidateBestSize();
sw->FitInside();
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10846567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档