Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
76
Добавлен:
02.04.2015
Размер:
8.79 Mб
Скачать
          1. Работа с семейством виджетов

Для работы с иерархией семейства виджетов могут использоваться следующие функции, и они могут быть полезны при установке порядка передачи фокуса:

PtChildType

Определяет взаимосвязь между двумя виджетами

PtFindDisjoint()

Возвращает ближайший рассоединённый родительский виджет

PtFindFocusChild()

Находит ближайший фокусируемый сыновний виджет

PtFindGuardian()

Находит виджет, отвечающий за действие другого виджета

PtGetParent()

Находит ближайший родительский виджет, совпадающий с заданным классом

PtGetParentWidget()

Возвращает текущий действующий по умолчанию родительский виджет

PtNextTopLevelWidget()

Получает указатель на следующий виджет верхнего уровня

PtValidParent()

Идентифицирует действующего родителя виджета

PtWidgetBrotherBehind()

Получает брата позади виджета

PtWidgetBrotherInFront()

Получает брата впереди виджета

PtWidgetChildBack()

Получает сына, самого заднего в контейнере

PtWidgetChildFront()

Получает сына, самого переднего в контейнере

PtWidgetFamily()

Проходит иерархию виджета задом наперёд

PtWidgetParent()

Получает родителя виджета

PtWidgetSkip()

Перескакивает к виджету в следующемй иерархии

PtWidgetTree()

Проходит дерево виджетов спереди назад

PtWidgetTreeTraverse()

Проходит иерархию семейства виджетов спереди назад

    1. Ответные реакции

Вы можете добавлять и удалять ответные реакции в Вашем программном коде так же, как и через PhAB – только обратите внимание на различия между двумя типами!

          1. Добавление ответных реакций

Приложение регистрирует ответные реакции, манипулируя ресурсами ответной реакции виджета. Для этих ресурсов в классах виджетов Photon'а используется соглашение по именованию: они все начинаются с Pt_CB_.

Ответные реакции могут быть добавлены в список ответных реакций, хранимых для этих ресурсов, использованием функции PtAddCallbacks() для добавления в список нескольких функций ответных реакций или функции PtAddCallback() для добавления только одной. В любом случае первыми двумя аргументами функции являются виджет и имя ресурса ответной реакции, которая добавляется. Остальные аргументы зависят от того, какая функция используется.

В функции PtAddCallbacks() третьим аргументом является массив записей ответных реакций. Каждая запись содержит указатель на функцию ответной реакции и указатель на данные присоединённого клиента, которые будут передаваться функции ответной реакции при её вызове. Каждая из этих записей ответных реакций скопирована во внутренний список ответных реакций виджета.

Например, мы можем захотеть, чтобы, когда пользователь выбрал кнопку (т.е. нажал её), приложение выполнило некое действие. Класс PtButton виджетов предоставляет ресурс ответной реакции Pt_CB_ACTIVATE для уведомления приложения, когда кнопка нажата. Чтобы создать виджет и присоединить к этому ресурсу ответной реакции функцию ответной реакции, мы используем код такого вида:

{

PtWidget_t *button;

int push_button_cb( PtWidget_t *, void *, PtCallbackInfo_t *);

PtCallback_t callbacks[] = { {push_button_cb, NULL} };

...

button = PtCreateWidget(PtButton, window, 0, NULL);

PtAddCallbacks(button, Pt_CB_ACTIVATE, callbacks, 1);

}

где push_button_cb – имя функции приложения, которая должна вызываться, когда пользователь нажимает кнопку. Для определения списка ответных реакций используется структура PtCallback_t; более подробно см. "Справочник виджетов Photon'а".

Когда в список ответных реакций добавляется только одна функция ответной реакции (как в этом случае), проще использовать PtAddCallback(). Эта функция берёт указатель на функцию ответной реакции как третий аргумент и указатель на данные клиента как последний аргумент. Вышеприведенный фрагмент кода может быть записан более кратко таким образом:

{

PtWidget_t *button;

int push_button_cb( PtWidget_t *, void *, PtCallbackInfo_t *);

button = PtCreateWidget(PtButton, window, 0, NULL);

PtAddCallback(button, Pt_CB_ACTIVATE, push_button_cb, NULL);

}

Вы можете также передавать массив записей ответной реакции как значение для ресурса ответной реакции, когда используется список аргументов в связке с функцией PtCreateWidget() или PtSetResources(). Поскольку список ответных реакций является массивом, Вы должны задать базовый адрес массива как третий аргумент функции PtSetArg() и число элементов как последний аргумент. В этом случае записи ответной реакции добавляются к текущему списку ответной реакции, если он имеется. Это даёт нам другой способ задания ответной реакции для вышеприведенного примера:

{

PtArg_t arg[5];

int push_button_cb( PtWidget_t *, void *, PtCallbackInfo_t *);

PtCallback_t callbacks[] = { {push_button_cb, NULL} };

...

PtSetArg(&args[0], Pt_CB_ACTIVATE, callbacks, 1);

PtCreateWidget(PtButton, window, 1, arg);

}

Каждый из этих методов имеет свои достоинства. Использование PtAddCallback(), конечно, простое. Использование функции PtAddCallbacks() более эффективно, когда имеется несколько ответных реакций. Использование функции PtSetArg() и передача результата в PtCreateWidget() позволяет автоматически осуществлять создание виджета и прикрепить список ответных реакций.

Соседние файлы в папке Литература_1