В настоящее время в моем проекте у меня есть панель с такими вещами:
Проблема заключается в том, что когда панель расширяется, она создает пустое пространство под тем местом, где находятся кнопки, и противоположная проблема также возникает при сжатии панели, то есть кнопки полностью удаляются из поля зрения, прежде чем заключить контракт wxListControl, что является нежелательным поведением. Желаемое поведение будет выглядеть примерно так: при расширении я хочу, чтобы все достигло «хорошего размера», тогда единственное, что продолжало бы расширяться, это wxListControl, когда контракт wxListControl должен сначала сжиматься до минимального размера, а затем кнопки и управление поиском должно заключить контракт. Следующие изображения должны выделить проблемы.
**
Потерянное пространство внизу: http://i.stack.imgur.com/lsXOv.png
Кнопки искажены: http://i.stack.imgur.com/U50In.png
Итак, вот мой код (отредактированный только для малой ширины, с плохим именованием и прочим):
lbxEntityList = new wxListCtrl(this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
wxLC_REPORT | wxLC_EDIT_LABELS | wxLC_HRULES,
wxDefaultValidator, wxT("Entity List Control"));
lbxEntityList->AppendColumn("Entities",wxLIST_FORMAT_LEFT, 80);
srchControl = new wxSearchCtrl(this, wxID_ANY, "", wxDefaultPosition,
wxDefaultSize);
#ifndef __WXMAC__
srchControl->ShowSearchButton( true );
#endif
srchControl->ShowCancelButton( false );
btn_RemoveEntity = new wxButton( this, wxID_ANY, wxT("Remove Entity"),
wxDefaultPosition, wxDefaultSize, 0);
btn_AddEntity = new wxButton(this, wxID_ANY, wxT("Add Entity"),
wxDefaultPosition, wxDefaultSize, 0);
sizer = new wxBoxSizer(wxVERTICAL);
wxBoxSizer* o = new wxBoxSizer(wxHORIZONTAL);
sizer->Add(srchControl, wxSizerFlags().Expand().Border(wxALL, 10));
sizer->Add( lbxEntityList, wxSizerFlags().Expand().Border(wxALL, 10));
sizer->Add(o, 1, wxALIGN_CENTER, 5);
o->Add( btn_RemoveEntity, 0, wxALL, 5 );
o->Add( btn_AddEntity, 0, wxALL, 5 );
SetSizer( sizer );
Layout();
sizer->Fit(this);
Единственное, что я пытался — это постоянно пробовать случайные разные размерники в разных конфигурациях с разными флагами в wxFormBuilder в тщетной попытке заставить его работать, но это всегда заканчивается безрезультатно. Я просмотрел несколько уроков по sizer, и единственный вывод, к которому я пришел, заключается в том, что мне нужно написать свой собственный sizer, я надеюсь, что что-то упустил, и мне не придется этого делать.
Размеры обеспечивают поведение по умолчанию при первом прохождении, когда размер окна, в котором они находятся, изменяется.
Однако если вам требуется что-то отличное от поведения по умолчанию, вы должны сами обработать событие изменения размера окна и пересчитать размеры виджета.
В вашем случае вам нужно будет определить общий «красивый размер» других виджетов, вычесть это из нового размера окна и изменить размер ListCtrl, чтобы заполнить оставшуюся часть.
Я отправил этот вопрос в список рассылки wx-users и получил ответ:
В вертикальном сортировщике флаг EXPAND контролирует только размер
управление в горизонтальном направлении. Для вертикального направления
Параметр «пропорция» имеет значение.Установите пропорцию 0 для управления поиском и нижней горизонтали
Размер коробкиУстановите пропорцию 1 для списка.
Это должно дать вам поведение, которое вы хотите.
Хотя ответ не дает правильного поведения при заключении контракта, он обеспечивает правильное поведение расширения, что в моем случае является более важным.