Руководство программиста в Photon (1037671), страница 24
Текст из файла (страница 24)
Следующий пример показывает, как располагаются несколько потомков, если группа использует вертикальную ориентацию с пятью пикселями свободного пространства между потомками:
Если ориентация изменена на горизонтальную, группа выглядит так:
При первой реализации групповой виджет первоначально устанавливает свои размеры, чтобы после того, как все потомки будут расположены, быть достаточно большими, чтобы все их вместить.
Выстраивание виджетов построчно и в колонки
Установкой значения ресурса 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'а виджеты немедленно прикрепляются при создании. В более ранних версиях закрепление делалось, когда виджет реализовывался.
Анкер может быть задан для любой стороны порождённого виджета. Анкер прикрепляется к одной из сторон родителя. Он удерживает соответствующую сторону потомка на фиксированном расстоянии – смещении анкера от крепящей стороны родителя. Смещение анкера может быть также выражено как количественное соотношение ширины или высоты холста родителя.
Возможно – но не всегда желательно – прикреплять края виджетов за пределами холста его родителя.
Каждый раз при изменении размеров родителя позиция потомка (и возможно, его размеры) изменяются, чтобы сохранить это взаимоотношение. Если какая-либо сторона потомка не прикреплена к родителю, это позволяет ей свободно "плавать". Если Вы явно установили размеры и/или позицию для закреплённого виджета, смещения его анкера пересчитываются автоматически.
При использовании PhAB Вы не задаёте смещения анкера. Вместо этого Вы позиционируете виджеты на желаемом смещении путём установки ресурсов позиции (Pt_ARG_POS) и размеров (Pt_ARG_DIM). PhAB вычисляет смещение анкера автоматически, основываясь на относительных размерах и позициях родителя и закреплённых потомков.
На ширину порождённого виджета влияют анкеры для его левой и правой сторон; на высоту – анкеры для верха и низа. Если любой из противоположных пар краёв позволено "плавать", стеснённость встречается при выборе только позиционировании виджета в соответствующих размерах. Это означает, что виджет может скользить в любом их четырёх направлений для удовлетворения анкерных ограничений. Если оба края "заякорены", виджет также должен изменять свои размеры в этом направлении.
Рис. 7-1. Пример закрепления
Если политика изменения размеров конфликтует с анкерами, флаги Pt_ARG_RESIZE_FLAGS переписывают Pt_ARG_ANCHOR_OFFSETS и Pt_ARG_ANCHOR_FLAGS.
Создание главного окна приложения представляет из себя простой пример использования анкерных ресурсов. В общем случае окно состоит по меньшей мере из двух частей: панель меню и рабочая область. Если рассматривать приложение, имеющее групповой виджет в рабочей области, мы можем идентифицировать типы анкеров, необходимые для того, чтобы сделать изменение его размеров в ответ на изменение размеров виджета окна корректным. Каждый край рабочей области прикреплён к соответствующему краю окна. Смещение левого и верхнего анкеров установлены такими же, как атрибуты позиции для виджета. Они должны быть вычислены, чтобы разместить рабочую область под панелью меню. Размеры виджета установлены в соответствии с желаемым объёмом рабочего пространства.
При реализации окно размещает рабочую область там, где это задано в её атрибутах позиционирования. Размеры окна устанавливаются настолько большими, чтобы вместить рабочую область. Если окно изменяет размеры, ширина и высота рабочей области меняет свои размеры соответственно, поскольку все края закреплены. Если смещения анкера были определены корректно, позиция виджета не изменится.
Мы ничего не делаем с панелью меню, поскольку она автоматически прикрепляется к вершине и сторонам окна.
Ресурсы анкеров
Ресурс Pt_ARG_ANCHOR_FLAGS (определённый для PtWidget) управляет прикреплением анкерами. Среди анкерных флагов имеются три, связанные с каждым краем виджета, эти три флага позволяют каждому краю быть прикреплёнными одним из трёх возможных способов:
-
прикрепиться к соответствующему краю его родителя
-
прикрепиться к противоположному краю его родителя
-
задать определённое местоположение, т.е. в какой-то пропорции от ширины или высоты виджета.
Эти флаги используют такие именующие схемы:
Pt_edge_ANCHORED_anchor
где
edge является именем закрепляемого края и должно быть TOP, LEFT, RIGHT или BOTTOM, т.е. верхний, левый, правый и нижний края соответственно;
anchor является именем родительского края, к которому производится прикрепление, т.е. родительского edge (см. выше), или принимать значение RELATIVE для пропорционального анкера.
Таким образом, определены следующие флаги (не, ну уже для совсем непонятливых!!! Прим. пер.):
-
Pt_LEFT_ANCHORED_LEFT
-
Pt_LEFT_ANCHORED_RELATIVE
-
Pt_LEFT_ANCHORED_RIGHT
-
Pt_RIGHT_ANCHORED_LEFT
-
Pt_RIGHT_ANCHORED_RELATIVE
-
Pt_RIGHT_ANCHORED_RIGHT
-
Pt_TOP_ANCHORED_BOTTOM
-
Pt_TOP_ANCHORED_RELATIVE
-
Pt_TOP_ANCHORED_TOP
-
Pt_BOTTOM_ANCHORED_BOTTOM
-
Pt_BOTTOM_ANCHORED_RELATIVE
-
Pt_BOTTOM_ANCHORED_TOP
Пропорциональный анкер задаёт положение края как процентное отношение к одному из размеров родительского окна. Левый или правый края задаются как пропорция ширины родителя, и верхний или нижний края задаются как пропорция высоты родителя. Пропорция обеспечена смещением анкера и выражается в десятых долях процентов.
Установка флагов анкеров в PhAB
Чтобы установить флаги анкера, щёлкните на ресурсе флагов анкера (Pt_ARG_ANCHOR_FLAGS) и используйте редактор флагов PhAB:
Установка флагов анкеров в программном коде Вашего приложения
Вы можете также установить эти флаги из Вашего программного кода, используя метод, описанный в главе "Манипулирование ресурсами в программном коде приложения". Для удобства каждый набор флагов имеет объединённую маску битов:
-
Pt_LEFT_IS_ANCHORED – выделяет биты, отвечающие за задание анкера для левого края
-
Pt_RIGHT_IS_ANCHORED – выделяет биты, отвечающие за задание анкера для правого края
-
Pt_TOP_IS_ANCHORED – выделяет биты, отвечающие за задание анкера для верхнего края
-
Pt_BOTTOM_IS_ANCHORED – выделяет биты, отвечающие за задание анкера для нижнего края.
Таким образом, чтобы установить левый и правый края нашей панели меню в приведенном выше примере, необходимо инициализировать элемент списка аргументов следующим образом:
PtSetArg(&arg[n], Pt_ARG_ANCHOR_FLAGS,
Pt_LEFT_ANCHORED_LEFT | Pt_RIGHT_ANCHORED_RIGHT |
Pt_TOP_ANCHORED_TOP,
Pt_LEFT_IS_ANCHORED | Pt_RIGHT_IS_ANCHORED |
Pt_TOP_IS_ANCHORED);
При установке анкерных флагов из программного кода Вашего приложения все смещения анкера задаются путём использования ресурса Pt_ARG_ANCHOR_OFFSETS. Этот ресурс берёт структуру PtRect_t (см. "Справочник по библиотеке Photon") как значение. Верхний левый угол прямоугольника используется для определения смещения анкера для верхнего и левого краёв виджета, и нижний правый угол прямоугольника указывает смещение анкера для правого и нижнего краёв.
Так, например, чтобы сделать рабочую область в 90% от ширины окна с равным размером обоих сторон, левый и правый края прикрепляются, используя следующий код:
PhRect_t offsets;
offsets.ul.x=50;