我有一个顶级框架(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
}
答案 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()的末尾
现在会发生一些事情。我不知道它是不是你想要的!我真的不明白你想要做什么。