Привет, Хабр!
Сегодня хочу немного рассказать о своем опыте применения сайзеров в wxWidgets.
Всю свою сознательную 'жизнь' на С++ я провёл в среде C++Builder с редкими вылазками в Misrosoft VC. В поисках чего-то нового решил попробовать связку CodeBlocks и wxWidgets. И сразу же поймал ностальгию по тепличным условиям среды C++Builder с его 'живыми' визуальными формами в конструкторе. В первую очередь у меня не получилось взаимопонимания с wxSizers. Их подмножество и поведение подрывало весь оптимизм освоения новой для меня среды. И здесь возникла мысль написать что-то свое для wxWidgets, чтобы было как в C++Builder.
В результате появился wxFreeStyleSizer, названный так из-за недостатка фантазии и времени.
Стиль поведения этого сайзера я стремился сделать как можно ближе к поведению форм и компонентов в C++Builder ( Delphi ).
Реализован механизм Align — панели и контролы (элементы формы) могут растягиваться вдоль одной из сторон формы, либо растягиваться на всю форму. Множество контролов умеет выстраиваться стеком в нужном положении. Приоритет размещения контролов: верх+низ/лево+право/на всю форму.
Вот пример такого размещения панелей:
![image](https://habrastorage.org/r/w780q1/webt/ue/yf/ta/ueyftarp1bplznwedmpmg0uoqle.jpeg)
Реализован механизм Anchors — положение стороны контрола фиксируются на определенном расстоянии от края формы. В зависимости от того, какие из сторон зафиксированы, можно получить различные модели поведения контрола при изменении размера формы. К примеру, зафиксировав левую и правую стороны контрола получим растягивание/сжатие контрола при изменении размера формы.
Исходный размер контролов:
![image](https://habrastorage.org/r/w780q1/webt/51/gv/vm/51gvvmnsg8omfwdyt0bb2vlkx1k.jpeg)
Размеры после растягивания:
![image](https://habrastorage.org/r/w780q1/webt/bh/ir/4y/bhir4ydw47hu-wt4z2adkgoezvo.jpeg)
Реализован механизм Splitter — размеры и положение сторон контрола могут меняться пользователем с помощью мыши компьютера. Пример применения данной опции к двум панелям:
![image](https://habrastorage.org/r/w780q1/webt/nj/33/fb/nj33fbhrvbmtka9jdzmngunvkrs.jpeg)
Пример ресайза ( перетаскивания сплиттера ) между двумя панелями:
![image](https://habrastorage.org/r/w780q1/webt/xq/ze/ds/xqzedspodhyzq_k3ifpez0a-91m.jpeg)
Следует также отметить, что всё выше перечисленное реализуется на одном элементе сайзера, одна панель — один сайзер на ней.
В качестве дисклаймера нужно сказать, что код написан в CodeBlocks в среде Windows ( GNU GCC, C++11, wxWidgets 3.1.2 ) для личных целей. Если кого есть желание ознакомиться с исходниками, Welcome.
Спасибо за внимание.
Сегодня хочу немного рассказать о своем опыте применения сайзеров в wxWidgets.
Всю свою сознательную 'жизнь' на С++ я провёл в среде C++Builder с редкими вылазками в Misrosoft VC. В поисках чего-то нового решил попробовать связку CodeBlocks и wxWidgets. И сразу же поймал ностальгию по тепличным условиям среды C++Builder с его 'живыми' визуальными формами в конструкторе. В первую очередь у меня не получилось взаимопонимания с wxSizers. Их подмножество и поведение подрывало весь оптимизм освоения новой для меня среды. И здесь возникла мысль написать что-то свое для wxWidgets, чтобы было как в C++Builder.
В результате появился wxFreeStyleSizer, названный так из-за недостатка фантазии и времени.
Стиль поведения этого сайзера я стремился сделать как можно ближе к поведению форм и компонентов в C++Builder ( Delphi ).
Реализован механизм Align — панели и контролы (элементы формы) могут растягиваться вдоль одной из сторон формы, либо растягиваться на всю форму. Множество контролов умеет выстраиваться стеком в нужном положении. Приоритет размещения контролов: верх+низ/лево+право/на всю форму.
Вот пример такого размещения панелей:
![image](https://habrastorage.org/webt/ue/yf/ta/ueyftarp1bplznwedmpmg0uoqle.jpeg)
Реализован механизм Anchors — положение стороны контрола фиксируются на определенном расстоянии от края формы. В зависимости от того, какие из сторон зафиксированы, можно получить различные модели поведения контрола при изменении размера формы. К примеру, зафиксировав левую и правую стороны контрола получим растягивание/сжатие контрола при изменении размера формы.
Исходный размер контролов:
![image](https://habrastorage.org/webt/51/gv/vm/51gvvmnsg8omfwdyt0bb2vlkx1k.jpeg)
Размеры после растягивания:
![image](https://habrastorage.org/webt/bh/ir/4y/bhir4ydw47hu-wt4z2adkgoezvo.jpeg)
Реализован механизм Splitter — размеры и положение сторон контрола могут меняться пользователем с помощью мыши компьютера. Пример применения данной опции к двум панелям:
![image](https://habrastorage.org/webt/nj/33/fb/nj33fbhrvbmtka9jdzmngunvkrs.jpeg)
Пример ресайза ( перетаскивания сплиттера ) между двумя панелями:
![image](https://habrastorage.org/webt/xq/ze/ds/xqzedspodhyzq_k3ifpez0a-91m.jpeg)
Следует также отметить, что всё выше перечисленное реализуется на одном элементе сайзера, одна панель — один сайзер на ней.
В качестве дисклаймера нужно сказать, что код написан в CodeBlocks в среде Windows ( GNU GCC, C++11, wxWidgets 3.1.2 ) для личных целей. Если кого есть желание ознакомиться с исходниками, Welcome.
Спасибо за внимание.