wxWidgets: размеры и потраченное впустую пространство

В настоящее время в моем проекте у меня есть панель с такими вещами:

  • wxBoxSizer (wxVertical)
    • wxSearchControl (wxExpand)
    • wxListControl (wxExpand)
    • wxBoxSizer (wxHorizontally, wxALIGN_CENTER)
      • wxButton (wxALL)
      • wxButton (wxALL)

Проблема заключается в том, что когда панель расширяется, она создает пустое пространство под тем местом, где находятся кнопки, и противоположная проблема также возникает при сжатии панели, то есть кнопки полностью удаляются из поля зрения, прежде чем заключить контракт 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, я надеюсь, что что-то упустил, и мне не придется этого делать.

0

Решение

Размеры обеспечивают поведение по умолчанию при первом прохождении, когда размер окна, в котором они находятся, изменяется.

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

В вашем случае вам нужно будет определить общий «красивый размер» других виджетов, вычесть это из нового размера окна и изменить размер ListCtrl, чтобы заполнить оставшуюся часть.

0

Другие решения

Я отправил этот вопрос в список рассылки wx-users и получил ответ:

В вертикальном сортировщике флаг EXPAND контролирует только размер
управление в горизонтальном направлении. Для вертикального направления
Параметр «пропорция» имеет значение.

Установите пропорцию 0 для управления поиском и нижней горизонтали
Размер коробки

Установите пропорцию 1 для списка.

Это должно дать вам поведение, которое вы хотите.

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

0

По вопросам рекламы [email protected]