2010-11-10 1 views
0

У меня есть верхний уровень (класс MyFrame), у которого есть дочернее дерево (класс MyTreeCtrl) и дочерняя панель (класс MyPanel). Объект MyPanel существует в MyTreeCtrl. Событие на узле в дереве должно заполнить панель. Я устанавливаю sizer с панелью, но она не устанавливается. Когда sizer установлен на панель при установке sizer для его родительского кадра, все в порядке. Но при попытке установить панель sizer в отдельной функции это не сработает.wxsizer не работает на дочерней панели при добавлении после события (wxwidgets 2.8, windows xp)

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
(this->mypanel)->SetSizer(paneltopsizer); 

При вызове этого установить экземпляр MyTreeCtrl иметь новый классификатор. Это удаляет любой предыдущий sizer, который может быть назначен экземпляру MytreeCtrl (вы уверены, что это то, что вы хотите?)

Он ничего не делает, если только экземпляр MytreeCtrl не получил сообщение об изменении размера. Но вы, вероятно, хотите, чтобы sizer сделал что-то, не так ли? Поэтому вам нужно добавить код, чтобы выполнить sizer.

Одним из способов может быть добавить

paneltopsizer-> Layout() в конце ничтожной MyTreeCtrl :: PopulateElementNode()

Что-то теперь будет происходить. Я не знаю, будет ли это то, что вы хотите! Я не совсем понимаю, что вы пытаетесь сделать.

+0

Я пытаюсь создать XML-редактор на основе дерева. Первоначально панель не установлена ​​с помощью sizer. Я намерен сохранить это до события на узле в дереве. Только когда пользователь выбирает узел, необходимо установить sizer, а панель заполняется его дочерними элементами. – shimna

+0

С моим существующим кодом на панели отображается только listctrl (0,0). Когда я даю paneltopsizer-> Layout() в конце void MyTreeCtrl :: PopulateElementNode(), на панели появляется мигание, и оно остается открытым. – shimna

+0

Когда пользователь выбирает узел, панель должна заполняться данными для этого узла - нормально, отлично. Эта панель может быть всплывающей или может быть постоянной панелью в окне приложения. В любом случае он НЕ должен быть дочерним элементом дерева. IMHO, пытаясь сделать панель, содержащую детали выбранного дерева, дочерним элементом управления деревом, не вызовет вас конца. – ravenspoint

1

Я думаю, что часть проблемы здесь заключается в том, что вы устанавливаете панель sizer прежде, чем вы даже заполнили sizer с помощью элементов управления.

Кроме того, вы действительно должны быть либо вызовом SetSizerAndFit() вместо SetSizer() (обратите внимание: это, безусловно, должно быть сделано после элементы управления были добавлены в классификаторе), или же позвонить mypanel->Layout() (примечание: метод макета панели, а не sizer) после добавления sizer и элементов управления. Последний подход должен отлично работать с настройкой sizer перед добавлением элементов управления, но все же должен произойти последним. В любом случае, действительно, даже не логично настраивать sizer панели, прежде чем добавлять что-либо в sizer.