在事件发生后添加wxsizer在子面板中不起作用(wxwidgets 2.8,windows xp)

时间:2010-11-10 17:28:28

标签: wxwidgets

我有一个顶级框架(MyFrame Class),它有一个子树(MyTreeCtrl类)和一个子面板(MyPanel类)。 MyTnel的对象存在于MyTreeCtrl中。树中节点上的事件应该填充面板。我正在设置面板的sizer,但它没有设置。当sizer设置为面板同时为其父框架设置sizer时,一切都很好。但是,当尝试在单独的函数中设置面板大小调整器时,它不起作用。

void MyTreeCtrl::PopulateElementNode(wxTreeItemId &id)
{

//adding panel control elements and setting its sizer


wxBoxSizer *paneltopsizer = new wxBoxSizer(wxVERTICAL);
(this->mypanel)->SetSizer(paneltopsizer);

this->MyListCtrl=new wxListCtrl(this->mypanel,
    wxID_LISTCTRL,wxDefaultPosition,wxSize(245,100),wxLC_REPORT);
wxButton *Add=new wxButton(this->mypanel,wxID_ADD,wxT("Add"));
wxButton *Delete=new wxButton(this->mypanel,wxID_DELETE,wxT("Delete"));
wxButton *ApplyChanges=new wxButton(this->mypanel,wxID_APPLYCHANGES,wxT("ApplyChanges"));

wxBoxSizer *panelbuttonsizer = new wxBoxSizer(wxHORIZONTAL);
panelbuttonsizer->Add(Add,0,wxALL|wxALIGN_RIGHT,5);
panelbuttonsizer->Add(Delete,0,wxALL|wxALIGN_RIGHT,5);
panelbuttonsizer->Add(ApplyChanges,0,wxALL|wxALIGN_RIGHT,5);
paneltopsizer->Add(this->MyListCtrl,1,wxALL|wxEXPAND,10);
paneltopsizer->Add(panelbuttonsizer,0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);

//panel control ends
}

2 个答案:

答案 0 :(得分:1)

我认为这里的部分问题是你在使用控件填充sizer之前设置了面板大小调整器。

此外,你应该真的要么调用SetSizerAndFit()而不是SetSizer()(注意:这肯定需要控件添加到sizer之后),或者调用添加sizer和控件后,mypanel->Layout()(注意:面板的布局方法,而不是sizer)。后一种方法应该在添加控件之前设置sizer工作正常,但仍然必须最后发生。在任何一种情况下,在向sizer添加任何内容之前设置面板的sizer确实不合逻辑。

答案 1 :(得分:0)

(this->mypanel)->SetSizer(paneltopsizer);

当你调用它时,你将MyTreeCtrl的实例设置为拥有新的sizer。这将删除任何可能已分配给MytreeCtrl实例的先前sizer(您确定这是您想要的吗?)

除非稍后MytreeCtrl实例收到调整大小消息,否则它什么都不做。但你可能希望sizer做点什么,对吧?因此,您必须添加一些代码才能使sizer执行。

一种方法可能是添加

paneltopsizer->布局()在void MyTreeCtrl :: PopulateElementNode()的末尾

现在会发生一些事情。我不知道它是不是你想要的!我真的不明白你想要做什么。