Я перемещаю свое приложение из старого графического интерфейса (где я использовал фиксированные размеры) в wxWidgets (где я пытаюсь изучить основы сайзеров).
Внутри приложения у меня есть несколько форм с довольно сложной структурой. Природа данных и рабочий процесс предлагают мне хранить все эти данные вместе на одном экране. Но этот экран должен быть правильно спроектирован, чтобы его можно было использовать.
Вот старая версия формы...
... и вот более-менее, что я смог придумать с помощью сайзеров...
Обратите внимание, что я не мог просто использовать wxGridSizer, так как некоторые виджеты охватывают всю строку, некоторые выходят за пределы фиксированной сетки и т. д.
Очевидно, я мог бы продолжать работать над этим, чтобы сделать его менее уродливым, но я поймал себя на мысли, что, возможно, сайзеры не являются правильным инструментом для этого. Чтобы достичь того, что я хочу, мне понадобится что-то похожее на wxGridSizer с каким-то механизмом colspan/rowspan, и, возможно, этого будет недостаточно.
Поэтому я начал думать о том, чтобы самостоятельно создать «Размер форм», который мог бы работать примерно так:
int w,h;
GetClientSize(&w,&h);
MyFormSizer *formSizer(w,h);
formSizer->SetDimension( widget1, 100, 20 );
formSizer->SetDimension( widget2, 500, 20 );
formSizer->newRow();
formSizer->SetDimension( widget3, 100, 20 );
formSizer->SetDimension( widget4, 250, 20 );
formSizer->SetDimension( widget5, 250, 20 );
formSizer->Layout();
Пользователь должен установить относительные размеры каждого виджета, чтобы полностью заблокировать геометрию формы. Чтобы сделать эту геометрию подходящей, wxPanel при изменении размера Layout()
вычислит соответствующий коэффициент масштабирования f
, а затем установит все размеры и позиции, выполнив что-то вроде
widget1->SetSize(CalculatedX, CalculatedY, 100/f, 20/f);
CalculatedX+=100/f;
widget2->SetSize(CalculatedX, CalculatedY, 500/f, 20/f);
CalculatedX+=0;
CalculatedY+=20/f;
и т. д. (это всего лишь царапина, примите это как грубую идею; должны быть механизмы, чтобы не делать все слишком маленьким, чтобы поместиться в текст в виджетах и / или соответствующим образом масштабировать размер шрифта и тому подобное).
Это кажется разумным? Как бы вы ответили на эту тему? Этот выбор во многом повлияет на мое будущее развитие, поэтому любые ответы, критика и комментарии будут очень кстати.