wxsizer не работает на дочерней панели при добавлении после события (wxwidgets 2.8, windows xp) - PullRequest
0 голосов
/ 10 ноября 2010

У меня есть фрейм верхнего уровня (класс MyFrame), который имеет дочернее дерево (класс MyTreeCtrl) и дочернюю панель (класс MyPanel). Объект MyPanel существует в MyTreeCtrl. Событие на узле в дереве должно заполнить панель. Я задаю размер панели с помощью панели, но она не устанавливается. Когда 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 ]

1 голос
/ 16 ноября 2010

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

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

0 голосов
/ 10 ноября 2010
(this->mypanel)->SetSizer(paneltopsizer);

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

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

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

paneltopsizer-> Layout () в конце void MyTreeCtrl :: PopulateElementNode ()

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

...