Привет, Хабр!

Сегодня хочу немного рассказать о своем опыте применения сайзеров в wxWidgets.

Всю свою сознательную 'жизнь' на С++ я провёл в среде C++Builder с редкими вылазками в Misrosoft VC. В поисках чего-то нового решил попробовать связку CodeBlocks и wxWidgets. И сразу же поймал ностальгию по тепличным условиям среды C++Builder с его 'живыми' визуальными формами в конструкторе. В первую очередь у меня не получилось взаимопонимания с wxSizers. Их подмножество и поведение подрывало весь оптимизм освоения новой для меня среды. И здесь возникла мысль написать что-то свое для wxWidgets, чтобы было как в C++Builder.

В результате появился wxFreeStyleSizer, названный так из-за недостатка фантазии и времени.
Стиль поведения этого сайзера я стремился сделать как можно ближе к поведению форм и компонентов в C++Builder ( Delphi ).

Реализован механизм Align — панели и контролы (элементы формы) могут растягиваться вдоль одной из сторон формы, либо растягиваться на всю форму. Множество контролов умеет выстраиваться стеком в нужном положении. Приоритет размещения контролов: верх+низ/лево+право/на всю форму.

Вот пример такого размещения панелей:



Реализован механизм Anchors — положение стороны контрола фиксируются на определенном расстоянии от края формы. В зависимости от того, какие из сторон зафиксированы, можно получить различные модели поведения контрола при изменении размера формы. К примеру, зафиксировав левую и правую стороны контрола получим растягивание/сжатие контрола при изменении размера формы.

Исходный размер контролов:



Размеры после растягивания:



Реализован механизм Splitter — размеры и положение сторон контрола могут меняться пользователем с помощью мыши компьютера. Пример применения данной опции к двум панелям:



Пример ресайза ( перетаскивания сплиттера ) между двумя панелями:



Следует также отметить, что всё выше перечисленное реализуется на одном элементе сайзера, одна панель — один сайзер на ней.

В качестве дисклаймера нужно сказать, что код написан в CodeBlocks в среде Windows ( GNU GCC, C++11, wxWidgets 3.1.2 ) для личных целей. Если кого есть желание ознакомиться с исходниками, Welcome.

Спасибо за внимание.