Сайзеры wxWidgets
Привет, Хабр!
Сегодня хочу немного рассказать о своем опыте применения сайзеров в 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.
Спасибо за внимание.