Руководство программиста в Photon (953920), страница 24
Текст из файла (страница 24)
Pt_SetResource(ABW_my_container, Pt_ARG_RESIZE_FLAGS,
(Pt_RESIZE_XY_INITIAL | Pt_RESIZE_XY_AS_REQUIRED),
Pt_RESIZE_X_BITS | Pt_RESIZE_Y_BITS);
Чтобы установить список аргументов для очистки политики изменения размеров по х:
Pt_SetResource(ABW_my_container, Pt_ARG_RESIZE_FLAGS,
Pt_FALSE, Pt_RESIZE_X_BITS);
Имеется также несколько констант, упрощающих установку этих флагов. Например, есть константа, представляющая битовую маску для установки одновременно флагов по x и по y, и есть константы для наложения изменений для каждого флага по координатам x или y. Все эти константы определены в хеадер-файле <photon/PtWidget.h>
Абсолютное позиционирование
Самой основной формой компоновки, которую может обеспечить контейнер, является позиционирование своих потомков без наложения каких-либо ограничений на их размеры или позиционирование. В такой ситуации порождённый виджет закрепляется в своём собственном положении внутри контейнера, и контейнер не изменяет его размеров.
Виджет, использующий эту политику компоновки, является чем-то аналогичным доске объявлений. Вы можете прикнопить сообщение на доске объявлений и они остаются там, куда их прикнопили. Все контейнерные виджеты могут выполнять абсолютное позиционирование.
Простейшим путём позиционирования и установления размеров каждого потомка является использование мыши в PhAB.
Чтобы задать позицию каждого из потомков из программного кода Вашего приложения, Вы должны установить для каждого потомка ресурс Pt_ARG_POS. Если виджеты должны быть согласованы или быть предопределённых размеров, Вы также должны установить для каждого потомка ресурс Pt_ARG_DIM. Задаваемая Вами позиция является относительной верхнего левого угла холста родителя, так что при позиционировании потомков Вы можете не принимать во внимание границы родителя. По умолчанию все виджеты, позиционируемые абсолютно, используют политику изменения размеров Pt_AS_REQUIRED и Pt_INITIAL. Другими словами, начальные размеры контейнера выбираются при его реализации. Контейнер делается достаточно большим, чтобы разместить всех потомков в заданном местоположении и давая им возможность после реализации принять свои размеры.
Простейшим путём выполнения абсолютного позиционирования является размещение и позиционирование виджетов внутри главного виджета PtWindow приложения. Если Вам необходимо создать контейнерный виджет, выполняющий абсолютное позиционирование, как часть другого контейнера, Вы можете использовать виджет PtContainer.
Выравнивание виджетов с использованием групп
Виджеты PtGroup являются виджетами контейнерного класса, которые могут управлять геометрией своих потомков. Вы найдёте это полезным для выравнивания виджетов по горизонтали, вертикали или как матрицу. Они также обладают уникальной способностью растягивать порождённые виджеты.
PhAB расширяет полезность этого класса виджетов путём превращения их в ориентированную на действие команду "Group". Используя эту команду, Вы можете выбирать несколько виджетов внутри модуля и группировать их вместе в один групповой виджет. Если Вы попытаетесь выбрать любой виджет из группы, щёлкнув на нём, будет выбрана вся группа.
Когда Вы выбираете группу, панель управления ресурсами показывает ресурсы, имеющиеся в распоряжении виджетного класса PtGroup. Это включает ресурсы, позволяющие Вам выравнивать виджеты внутри группы и устанавливать эксклюзивное по выбору поведение.
Виджет PtGroup может быть использован для расстановки группы виджетов по строкам, колонкам или в виде таблицы. Для управления этим используется несколько ресурсов, и они интерпретируются несколько по-разному в зависимости от желаемой компоновки потомков.
Объединение виджетов в группу
Чтобы объединить виджеты в группу:
-
Выберите виджеты, используя либо метод ограничивающего прямоугольника, либо метод "Shift и щелчок"(как описано в главе "Создание виджетов в PhAB").
Вы можете использовать "Shift и щелчок", если собираетесь выравнивать виджеты по порядку, используя ресурс "Orientation". Первый выбранный Вами виджет становится первым внутри группы. Если порядок не важен или выравнивание не требуется, приятнее работать с методом ограничивающего прямоугольника.
-
Выполните одно из следующих действий:
-
Выберите пункт "Group Together" из меню "Edit".
-
Нажмите <Ctrl>+<G>
-
Щёлкните на кнопке "Group" на панели инструментов PhAB:
PhAB сгруппирует виджеты и выберет группу.
Получение доступа к виджетам в группе
Несмотря на то, что PhAB интерпретирует группу как один виджет, Вы по-прежнему можете получить доступ к любому отдельному виджету, входящему в группу. Чтобы это сделать, используйте клавиши "Следующая" и "Предыдущая" в панели управления ресурсами или ответными реакциями, или выберите виджет непосредственно из панели дерева модулей. Более подробно это описано в разделе "Выбор виджетов" в главе "Создание виджетов в PhAB".
Горизонтальное или вертикальное выравнивание виджетов
Ресурс ориентации Pt_ARG_GROUP_ORIENTATION управляет тем, выравниваются ли потомки группового виджета построчно или по колонкам. Значение Pt_GROUP_VERTICAL приводит к тому, что потомки выстраиваются вертикально, тогда как значение Pt_GROUP_HORIZONTAL – к тому, что они выстраиваются горизонтально. Вы можете управлять величиной свободного пространства, остающегося между виджетами, выстроенными в групповом виджете, путём использования ресурса Pt_ARG_GROUP_SPACING. Значение ресурса даёт число пикселей, оставляемых между виджетами.
Следующий пример показывает, как располагаются несколько потомков, если группа использует вертикальную ориентацию с пятью пикселями свободного пространства между потомками:
Если ориентация изменена на горизонтальную, группа выглядит так:
При первой реализации групповой виджет первоначально устанавливает свои размеры, чтобы после того, как все потомки будут расположены, быть достаточно большими, чтобы все их вместить.
Выстраивание виджетов построчно и в колонки
Установкой значения ресурса Pt_ARG_GROUP_ROWS_COLS в величину, большую чем единица, можно использовать групповой виджет для размещения его потомков построчно и в колонки, создавая таблицы.
Интерпретация этого ресурса зависит от ориентации:
-
Когда ориентация вертикальная, этот ресурс определяет число отображаемых строк; число колонок вычисляется на основе числа виджетов, чтобы получить верное число строк:
-
В противном случае значение определяет число колонок, и виджет вычисляет число строк:
Последняя строка или колонка может иметь меньшее количество виджетов, чем остальные.
Когда элементы группы скомпонованы в строки и колонки, сами виджеты могут быть тесно упакованы или же они могут быть расставлены с равными интервалами построчно и/или колонками. Это управляется ресурсом Pt_ARG_GROUP_SPACING.
Использование флагов групп
Виджет Pt_Group включает набор флагов Pt_ARG_GROUP_FLAGS, которые могут быть использованы для управления тем, как порождённые виджеты могут быть выбраны, изменены в размерах и растянуты:
Pt_GROUP_EXCLUSIVE
Позволяет быть одновременно установленным только одному потомку. Этот флаг может использоваться, чтобы сделать группу кнопок-переключателей радиокнопками (т.е. установить взаимоисключающий выбор).
Pt_GROUP_ EQUAL_SIZE
Размещает все виджеты в сетке, используя выбранный для группы размер ячейки, основанный на ширине самого широкого потомка и высоте самого высокого. Размеры всех потомков при компоновке устанавливаются в эти размеры.
Pt_GROUP_ EQUAL_SIZE_HORIZONTAL
Делает все виджеты шириной, равной ширине самого широкого виджета.
Pt_GROUP_ EQUAL_SIZE_VERTICAL
Делает все виджеты высотой, равной высоте самого высокого виджета.
Pt_GROUP_ NO_SELECT_ALLOWED
Устанавливает этот флаг для исключающей группы, если обоснованно не иметь никакого набора потомков. Пользователь может снять выбор текущего набора потомков, щёлкнув на нём ещё раз.
Pt_GROUP_ NO_KEYS
Не позволяет пользователю перемещаться внутри группы с помощью клавиш со стрелками.
Pt_GROUP_NO_KEY_WRAP_HORIZONTAL
Не позволяет автоматически переходить на другую сторону группы при использовании клавиш с левой и правой стрелками (т.е. например, перейти в начало, достигнув конца. Прим. пер.).
Pt_GROUP_ NO_KEY_WRAP_VERTICAL
Не позволяет автоматически переходить в вершину или вниз группы при использовании клавиш со стрелками вверх и вниз.
Pt_GROUP_ STRETCH_VERTICAL
Растягивает нижнюю строку виджетов при расширении группы
Pt_GROUP_ STRETCH_HORIZONTAL
Растягивает правую колонку виджетов при расширении группы
Pt_GROUP_ STRETCH_FILL
Растягивает последний (ие) виджеты так, чтобы заполнить доступное свободное пространство в направлении, указанном в ориентации
Не устанавливайте флаги Pt_GROUP_EQUAL_SIZE_... и Pt_GROUP_STRETCH_... для одного и того же направления – группа будет расширяться каждый раз, когда будет вычисляться его величина.
Для получения более полной информации см. описание виджета PtGroup в "Справочнике виджетов".
Расщепление группы на составляющие
Чтобы расщепить группу на отдельные виджеты:
-
Выберите группу
-
Сделайте одно из следующего:
-
Выберите пункт "Split Apart" из меню "Edit"
-
Нажмите <Ctrl>+<P>
-
Щёлкните на иконке "Split" на панели инструментов PhAB:
PhAB разберёт группу на составляющие виджеты и удалит контейнер PtGroup.
Управление привязкой с использованием анкеров – средств привязки
Вот общая ситуация компоновки, которая не управляется какой-бы то ни было политикой компоновки, рассматривавшейся нами. Предположим, что контейнер разделён на ряд панелей, ограниченных в своих размерах и местоположении. Обычно мы не желаем, чтобы панели перекрывались, и мы хотим управлять тем, как панели изменяют свои размеры, если сам контейнер увеличивается в размерах или сжимается. Механизм привязки обеспечивает это управление.
Анкеры предоставляются как механизм привязки позиции и размеров любого виджета внутри контейнера. Атрибут позиции и анкеры каждого потомка всегда используются для определения их позиций.
В текущей версии microGUI Photon'а виджеты немедленно прикрепляются при создании. В более ранних версиях закрепление делалось, когда виджет реализовывался.
Анкер может быть задан для любой стороны порождённого виджета. Анкер прикрепляется к одной из сторон родителя. Он удерживает соответствующую сторону потомка на фиксированном расстоянии – смещении анкера от крепящей стороны родителя. Смещение анкера может быть также выражено как количественное соотношение ширины или высоты холста родителя.
Возможно – но не всегда желательно – прикреплять края виджетов за пределами холста его родителя.