Руководство программиста в Photon (953920), страница 23
Текст из файла (страница 23)
или
-
Вы можете вызвать PtRemoveHotkeyHandler(), чтобы удалить горячую клавишу, и впоследствии вызвать PtAddHotkeyHandler(), чтобы включить её снова.
Обработчики событий – необработанные и отфильтрованные ответные реакции
Обработчики событий позволяют Вам реагировать непосредственно на события Photon'а. Вы можете присоединить обработчики событий к любому виджету; они похожи на другие ответные реакции виджета, но с дополнением в виде маски событий. Используя эту маску, Вы можете выбрать, какие события будут получать Ваши ответные реакции.
Вы найдёте это крайне полезным для получения событий Pt_EV_DRAG для конкретного окна. Для получения более подробной информации по перетаскиванию см. раздел "Перетаскивание" в главе "События".
Pt_Widget определяет следующие ресурсы обработки событий:
Pt_CB_FILTER | Вызывается перед тем, как событие достигло виджета |
Pt_CB_RAW | Вызывается после того, как виджет обработал событие (даже если виджет поглотил событие) |
Описание необработанных и отфильтрованных обработчиков событий и их использования см. в разделе "Обработчики событий – необработанные и отфильтрованные ответные реакции" в главе "События".
Для получения более подробной информации о добавлении обработчиков событий в программный код приложения см. "Обработчики событий" в главе "Управление виджетами в программном коде приложения".
Чтобы присоединить необработанную или отфильтрованную ответную реакцию:
-
Выберите виджет, затем переключитесь, если необходимо, в панель управления ответными реакциями.
-
Щёлкните на ресурсе Pt_CB_RAW (необработанные события) или Pt_CB_FILTER (отфильтрованные), чтобы открыть редактор ответных реакций.
-
Всплывёт редактор с областью "Event Mask" в зоне связанной информации:
Рис. 6-12. Область маски событий в редакторе ответных реакций
Область маски событий позволяет Вам задавать, к каким событиям Photon'а должен быть чувствителен виджет. Если случается любое из этих низкоуровневых событий, виджет вызывает ответную реакцию.
Щёлкните на иконке рядом с этой областью, чтобы открыть селектор событий:
Рис. 6-13. Селектор событий
-
Выберите события, к которым должен быть чувствителен виджет, затем закройте селектор.
Для получения более полной информации см. типы событий, описанные в структуре PhEvent_t в "Справочнике библиотеки Photon'а".
Глава 7. Управление геометрией
Эта глава описывает, как задать или точно регулировать геометрию Ваших виджетов.
Она включает:
-
Контейнер виджетов
-
Согласование геометрии
-
Абсолютное позиционирование
-
Выравнивание виджетов с использованием групп
-
Удерживающее управление с использованием анкеров
-
Удерживание позиции или ограничение изменения размеров без анкеров
Контейнер виджетов
Контейнерный виджет является порождением виджетного класса PtContainer. Контейнерными виджетами являются только те виджеты, которые могут иметь потомков. Любой виджет, не имеющий окна в своём владении, всегда визуализируется внутри границ своего родителя. Только виджеты, принадлежащие к производному классу от виджетного класса PtWindow, получают в свою собственность окно.
Контейнерные виджеты отвечают за выполнение управления геометрией. Первой обязанностью контейнерного виджета является позиционирование каждого потомка и установка его размеров так, чтобы обеспечить желаемое расположение для всех своих потомков. Контейнер также может накладывать на своих потомков ограничения по размерам (например, заставляет их все быть одного и того же размера). Кроме того, контейнер должен ограничивать потомков так, чтобы они не появлялись вне границ контейнера. Обычно это достигается путём обрезания потомков.
Для понимания того, как различные контейнеры выполняют управление геометрией, важно понимать геометрию виджета. См. "Геометрия виджета" во введении к настоящему руководству.
Согласование геометрии
При реализации виджета во всех виджетах иерархии семейства виджета запускается процесс согласования геометрии. Каждому потомку виджета даётся благоприятная возможность просчитать свои размеры. Это проходит волной вниз через все виджеты семейства, в результате чего пересчитываются размеры каждого потомка.
Как только каждый потомок пересчитал свои желаемые размеры, родительский виджет может попытаться определить расположение для своих потомков. Компоновка, выполняемая виджетом, зависит от:
-
политики компоновки виджетов;
-
любого размера, установленного для виджета;
-
размерами и желаемой позицией для каждого из потомков.
Если приложение задаёт размер для виджета, то он может выбирать, как располагать потомков, используя только это доступное пространство. На это влияет политика изменения размеров, установленная для виджета. Ресурс Pt_ARG_RESIZE_FLAGS устанавливает флаги, определяющие политику изменения размеров для виджета. Флаги задают в отдельности политику изменения ширины и высоты виджета. Если для какого-либо из измерений политика не определена, виджет не пытается изменять свои размеры а этом измерении при выполнении компоновки. Любая другая политика изменения размеров позволяет виджету увеличиваться в этом измерении, чтобы приспособиться под своих потомков. Более детально это описано в разделе "Политика изменения размеров" ниже.
Если виджет не имеет предопределённых размеров, он пытается изменить свои размеры, чтобы приспособиться по всем потомкам, используя соответсвующую политику компоновки. Таким образом, он вначале пытается определить правильную компоновку и затем определяет пространство, необходимое для подгонки под эту компоновку.
Процесс компоновки определяет желаемое местоположение каждого потомка. Политика компоновки, используемая для виджета, управляет, как процесс компоновки пытается позиционировать потомков один относительно другого. Она должна принимать в расчёт размеры потомков. Контейнер отвечает за фиксирование позиции каждого потомка, так что политика компоновки может выбирать, принимать или нет во внимание атрибуты позиции потомков.
Выполняя компоновку, виджет может также принимать во внимание политику изменения размеров. Основываясь на этой политике, он определяет, должен ли он корректировать их ширину или высоту, или же изменять компоновку, что объясняется ограничением пространства. Виджет пытается выбрать компоновку, которая бы наилучшим образом совмещала ограничения, налагаемые какими-либо ограничениями размеров и политикой компоновки. После определения желаемой позиции для каждого из своих потомков виджет вычисляет ширину и высоту, требуемые им для размещения потомков в этих местоположениях. Он изменяет при необходимости их размеры, чтобы приладить каждый из потомков в желаемой позиции. Если это невозможно, потому что этого не позволяет политика изменения размеров, виджет пересчитывает позицию, чтобы пристроить потомков внутри доступного свободного места.
После того как компоновка успешно установлена, виджет устанавливает позицию для каждого потомка путём внесения изменения в атрибуты позиции потомков.
Политика изменения размеров
Любые изменения виджета, которые могут оказать действие на объём пространства, требуемого для отображения его содержания, могут приводить к изменению размеров самого этого виджета, с тем чтобы вместить его содержание. На это влияет политика изменения размеров, назначенная виджету.
Политика изменения размеров действует на базовые виджеты и на контейнеры. Контейнер проверяет свою политику изменения размеров при компоновке своих потомков, чтобы определить, будет ли он изменять свои размеры, чтобы разместить всех потомков в их желаемом местоположении. Во время процесса согласования геометрии это действие распространяется вверх по семейству виджетов до тех пор, пока не определяется размер виджета окна.
Политикой изменения размеров управляет ресурс Pt_ARG_RESIZE_FLAGS. Этот ресурс состоит из отдельного набора флагов для ширины и высоты. Значение флагов определяет условия, в которых виджет пересчитывает соответствующий размер. Значения проверяются каждый раз, когда виджет реализуется или изменяется его содержание.
Если политика изменения размеров конфликтует с анкерами, Pt_ARG_RESIZE_FLAGS переписывает Pt_ARG_ANCHOR_OFFSETS и Pt_ARG_ANCHOR_FLAGS.
Имеются следующие флаги изменения размеров:
Pt_RESIZE_X_ALWAYS
Пересчитывает размер виджета всякий раз, когда изменяется значение размера x. Виджет растёт или сжимается в горизонтальном направлении в соответствии с изменением его содержания.
Например, следующий рисунок показывает кнопку с установленным флагом Pt_RESIZE_X_ALWAYS при изменении надписи с "Hello" к "Hello, world" и к "Hi".
Pt_RESIZE_Y_ALWAYS
Пересчитывает размер виджета всякий раз, когда изменяется значение размера y. Виджет растёт или сжимается в вертикальном направлении в соответствии с изменением его содержания.
Pt_RESIZE_XY_ALWAYS
Пересчитывает размер виджета всякий раз, когда изменяется значение размера x или y. Виджет растёт или сжимается в обоих направлениях в соответствии с изменением его содержания.
Флаг Pt_RESIZE_XY_ALWAYS в PhAB не определён. Он представляется для Вашего удобства, когда установка флагов изменения размеров осуществляется из Вашего программного кода.
Pt_RESIZE_X_AS_REQUIRED
Пересчитывает размер виджета всякий раз при изменении размера x и не производит подгонку при наличии свободного пространства. Например, следующий рисунок показывает кнопку с установленным флагом Pt_RESIZE_X_AS_REQUIRED при изменении надписи с "Hello" к "Hello, world" и к "Hi".
Pt_RESIZE_Y_AS_REQUIRED
Пересчитывает размер виджета всякий раз при изменении размера y и не производит подгонку при наличии свободного пространства.
Pt_RESIZE_XY_AS_REQUIRED
Пересчитывает размер виджета всякий раз при изменении размера x или y и не производит подгонку при наличии свободного пространства.
Флаг Pt_RESIZE_XY_AS_REQUIRED в PhAB не определён. Он предоставляется для Вашего удобства, когда установка флагов изменения размеров осуществляется из Вашего программного кода.
Эти флаги также могут быть модифицированы значениями другого набора флагов, а именно
-
Pt_RESIZE_X_INITIAL
-
Pt_RESIZE_Y_INITIAL
-
Pt_RESIZE_XY_INITIAL
Флаг Pt_RESIZE_XY_INITIAL в PhAB не определён. Он предоставляется для Вашего удобства, когда установка флагов изменения размеров осуществляется из Вашего программного кода.
Если Вы установили какой-либо из этих "инициализирующих" флагов, виджет не будет изменять свои размеры в ответ на изменение данных – он изменяет свои размеры только в процессе согласования геометрии всякий раз, когда реализуется. Виджет либо делает себя в точности по размерам своего содержимого, либо увеличивается в размерах, чтобы разместить своё содержимое, если его размеры в этот момент недостаточно велики.
Если никакой из флагов изменения размеров не установлен, виджет не пытается расчитать свои собственные размеры, а использует те размеры, которые были установлены приложением (таким образом, возможно, обрезая в результате содержимое виджета).
Например, следующий рисунок показывает кнопку, у которой не установлены никакие флаги изменения размеров, при изменении надписи с "Hello" к "Hello, world" и к "Hi":
Установка политики изменения размеров в PhAB
Вы можете установить эти флаги в PhAB при редактировании флагов изменения размеров контейнера Pt_ARG_RESIZE_FLAGS, как показано ниже:
Установка политики изменения размеров в программном коде приложения
Вы можете также установить флаги изменения размеров контейнера в Вашем программном коде, используя метод, описанный в главе "Управление ресурсами в программном коде приложения".
Предоставляются битовые маски, позволяющие управлять путём установки битов. Имеется по одной битовой маске для политики изменения размеров по x и по y:
-
Pt_RESIZE_X_BITS
-
Pt_RESIZE_Y_BITS
-
Pt_RESIZE_XY_BITS
Например, чтобы сделать контейнер вырастающим для размещения всех своих потомков, если его размеры при реализации виджета недостаточно велики, установите оба флага установки размеров initial (начальный) и required (требуемый) по координатам x и y: