Расширяемый wxSizer в зависимости от размера окна

#c #wxwidgets

#c #wxwidgets

Вопрос:

Я хочу создать макет, содержащий некоторые кнопки и панели, используя wxWidgets. Проблема в том, что я не могу создать расширяемый wxSizer в центре других фреймов.

Я попытался использовать некоторые компоненты wxWidgets, такие как wxBoxSizer, wxFlexGridSizer и другие. Есть ли какой-нибудь хороший совет по реализации этого макета?

Простое представление окна выглядит так: введите описание изображения здесь

Комментарии:

1. не могли бы вы показать какой-нибудь код того, что вы пробовали? Вы использовали какой-либо инструмент RAD, такой как wxSmith, wxGlade и т. Д.? С помощью такого инструмента очень легко создать ANY макет…

Ответ №1:

Вам нужно рассматривать это как несколько вложенных блоков.

  1. На самом высоком уровне у вас есть 3 блока, упорядоченных по горизонтали: правый прямоугольник, центральный прямоугольник и левый прямоугольник. Для этого вам нужен wxBoxSizer файл с горизонтальной ориентацией.
  2. На втором уровне, центральном прямоугольнике, у вас есть 3 блока, упорядоченных по вертикали: верхний прямоугольник, центральный прямоугольник и нижний прямоугольник. Вам понадобится wxBoxSizer с вертикальной ориентацией.
  3. Чтобы заставить центр расширяться, чтобы заполнить пространство, вам нужно будет использовать proportion параметр.

Вот пример фрагмента кода:

 wxBoxSizer* rootsizer = new wxBoxSizer(wxHORIZONTAL);

//TODO: the right side control is whatever you need it to be
wxPanel* rightPanel = new wxPanel(parent, wxID_ANY, wxDefaultPosition, rightPanelSize);
//NOTE the use of 0 as the proportion; this means the right panel will NOT expand
//horizontally; it is fixed in size.  The wxEXPAND flag means it will expand vertically
//to fill
rootsizer->Add(rightpanel, 0, wxEXPAND, 0);

//Our center sizer to contain our center controls
wxBoxSizer* centersizer = new wxBoxSizer(wxVERTICAL);
//NOTE the use of 1 as the proportion; this means the center panel will expand HORIZONTALLY to fill all available space
rootsizer->Add(centersizer, 1, wxEXPAND, 0);

//TODO: whatever control goes on the left
wxPanel* leftpanel = new wxPanel(parent, wxID_ANY, wxDefaultPosition, leftPanelSize);
//Proportion is again 0 to prevent expanding horizontally
rootsizer->Add(leftpanel, 0, wxEXPAND, 0);

//Now the second level

//TODO: whatever control goes on the top
wxPanel* toppanel = new wxPanel(parent, wxID_ANY, wxDefaultPosition, topPanelSize);
//Proportion is 0 to prevent expanding VERTICALLY (because we are now in the center sizer
//which is a vertical sizer
centersizer->Add(toppanel, 0, wxEXPAND, 0);

//Our final depth, the centermost control, is set to a proportion of 1 to fill the space
//vertically
//TODO: whatever is your center control
wxPanel* centerpanel = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize);
centersizer->Add(centerpanel, 1, wxEXPAND, 0);

//And then the bottom control at proportion 0
wxPanel* bottompanel= new wxPanel(parent, wxID_ANY, wxDefaultPosition, bottomPanelSize);
centersizer->Add(bottompanel, 0, wxEXPAND, 0);

  

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