Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПОУК / 09 семестр / Книги и методические указания / Руководство программиста в Photon.doc
Источник:
Скачиваний:
364
Добавлен:
04.03.2014
Размер:
7.99 Mб
Скачать

Глава 11. Управление виджетами в исходном коде приложения

Мы рекомендуем Вам создавать пользовательский интерфейс Вашего приложения в PhAB – это проще, чем делать это в Вашем коде. Однако если интерфейс динамический, Вы, возможно, создаёте часть интерфейса "на лету".

Эта глава включает:

  • Создание виджетов

  • Задание порядка виджетов

  • Ответные реакции

  • Обработчики событий

  • Стили виджетов

Создание виджетов

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

PtWidget_t *PtCreateWidget(

PtWidgetClassRef_t *class,

PtWidget_t *parent,

unsigned n_args,

PtArg_t *args );

Её аргументами являются:

class

Тип создаваемого виджета (напр., PtButton)

parent

Родитель нового виджета. Если это Pt_DEFAULT_PARENT, новый виджет становится потомком родителя, принимаемого по умолчанию, которым является самый последний созданный виджет контейнерного класса. Если parent равно Pt_NO_PARENT, виджет не имеет родителя.

n_args

Число элементов массива args

args

Массив структур PtArg_t , который хранит Ваши установки для ресурсов виджета. Эти установки аналогичны тем, что используются для PtSetResources(); см. главу "Управление ресурсами в исходном коде приложения".

Вы можете задать принимаемого по умолчанию родителя (используемого, если аргумент parent в вызове функции PtCreateWidget() равен Pt_DEFAULT_PARENT), вызвав функцию PtSetParentWidget(). Чтобы назначить для виджета другой контейнер, вызовите функцию PtReparentWidget().

Вот несколько заметок относительно виджетов, создаваемых в исходном коде приложения:

  • Виджет не реализуется, пока не реализуется контейнерный виджет. Если контейнер уже реализован, Вы можете вызвать функцию PtRealizeWidget(), чтобы реализовать новый виджет.

  • Если Вы создали виджет в модуле PhAB и затем уничтожили модуль, виджет тоже будет уничтожен. В следующий раз, когда модуль будет создан, он появится таким, каким он был задан в PhAB.

  • если Вы сохранили в виджете глобальный указатель, убедитесь, что при уничтожении виджета Вы сбросили указатель в NULL. Это легко сделать в ответной реакции Pt_CB_DESTROYED виджета. Ошибка, заключающаяся в несбрасывании глобального указателя (и проверки его перед использованием), является часто встречающимся источником проблем с виджетами, созданными через программный код.

Задание порядка виджетов

Порядок, в котором виджетам даётся фокус, зависит от порядка, в котором они были созданы или от порядка виджетов, заданного в PhAB (см. "Задание порядка виджетов" в главе "Создание виджетов в PhAB"). Самым задним виджетом является первый в установленном порядке перехода, самый передний является последним.

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

  • PtWidgetInsert()

Вставить виджет в иерархию семейства виджетов

  • PtWidgetToBack()

Переместить виджет за спину всех своих братьев

  • PtWidgetToFront()

Переместить виджет впереди всех своих братьев

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

В ответной реакции потери фокуса используйте функцию PtContainerGiveFocus(), чтобы передать фокус нужному виджету, и возвращайте для ответной реакции Pt_END, чтобы воспрепятствовать передаче фокуса первоначальной цели изменения фокуса.

 Ответная реакция Pt_CB_LOST_FOCUS вызывается во второй раз, когда фокус перемещается от виджета к новой цели. Чтобы исключить бесконечную петлю, используйте статическую переменную для указания того, что эта ответная реакция уже перенаправила фокус.