Центрированный виджет в 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();