Центрированный виджет в FLTK

Можете ли вы центрировать неизменяемый виджет в FLTK? Ссылки из этого вопроса stackru, кажется, подразумевают ответ "нет". Для центрированного виджета потребуются виджеты с изменяемым размером с обеих сторон, но в группе может быть только один дочерний объект с изменяемым размером.

(Извините за вопрос и ответ, но я искал все это и почти сдался, поэтому я думаю, что это будет полезно для других.)

2 ответа

Вот как ты это делаешь. Хитрость в том, что виджет в FLTK может находиться за пределами границ родительской группы.

У вас есть 4 группы A, B, C и D. B и C - дочерние элементы A. D - дочерний элемент C. Не показан виджет, который вы действительно хотите отцентрировать, называемый E. E - дочерний элемент C. А и Е - это те, которые вы действительно хотите увидеть. B, C и D пусты без границ, поэтому они невидимы. A и D могут быть изменены. Больше ничего нет. Центр E в A, не перекрывающийся с D. E будет частично за пределами C. Это хитрость.

|--------------------------------------------|
|                 A                          |
||--------------------||--------------------||
||                    ||           |-----|  ||
||          B         ||      C    |  D  |  ||
||                    ||           |-----|  ||
||--------------------||--------------------||
|--------------------------------------------|

При изменении размера A размеры B и C изменяются пропорционально и в равной степени, поскольку не существует изменяемых размеров дочерних элементов A, и они имеют одинаковый размер. Источник C останется в центре A. Когда размер C будет изменен, размер E не будет изменен, только D. Таким образом, E останется в том же положении относительно источника C, то есть относительно центра A,

Предостережение 1: Я реализовал это в FLUID/FLTK 1.3.0, который по общему признанию является старым. С тех пор все могло измениться. Я не пытался проверить это на чем-то более недавнем.

Предостережение 2: FLUID автоматически изменит размер группы для включения в нее виджетов при каждом перемещении любого виджета. Это нарушает центрирующее поведение. Я обнаружил, что мне нужно каждый раз изменять размер C через диалоговое окно FLUID до исходного размера, после любых других изменений макета.

Макет FLTK упрощается благодаря файлам заголовков здесь: https://fltk-layout-manager.blogspot.com

      CoordinateManager()
   .set(addrSubject)
   .centerTo (void* addrBenefactor)
   .render();

Вы можете указать точку x, y или верхнюю левую и нижнюю правую координаты:

      CoordinateManager()
   .set(addrSubject)
   .centerTo (int x, int y, int x2 = 0, int y2 = 0)
   .render();
Другие вопросы по тегам