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

Следующий пример демонстрирует простейшее приложение, использующее библиотеку виджетов. Программа создаёт окно, содержащее одну кнопку.

/* File: hello.c */

#include <Pt.h>

int main( int argc, char *argv[] ) {

PtWidget_t *window;

PtArg_t args[1];

if (PtInit(NULL) = = -1) PtExit(EXIT_FAILURE);

window = PtCreateWidget(PtWindow, Pt_NO_PARENT, 0, NULL);

PtSetArg(&args[0], Pt_ARG_TEXT_STRING, "Нажмите для выхода", 0);

PtCreateWidget(PtButton, window, 1, args);

PtRealizeWidget(window);

PtMainLoop();

return (EXIT_SUCCESS);

}

      1. Что происходит

Хотя это и простое приложение, в каждом из этих вызовов выполняется масса работы.

          1. PtInit()

Функция PtInit() вызывает функцию PhAttach(), чтобы прикрепить к серверу Photon'а канал, и затем вызывает библиотеки виджета.

          1. PtCreateWidget() – первый вызов

Первый вызов функции PtCreateWidget() создаёт оконный виджет, который взаимодействует с оконным менеджером и служит родителем остальным виджетам, созданным в приложении. Аргументами этой функции являются:

  • класс создаваемого виджета (в нашем случае PtWindow)

  • родитель виджета (Pt_NO_PARENT, поскольку окно не имеет родителя)

  • количество элементов в списке аргументов

  • список аргументов начальных значений для ресурсов виджета

Функция PtCreateWidget() возвращает указатель на созданный виджет. Более подробную информацию см. в разделе "Создание виджетов" в главе "Управление виджетами из программного кода приложения". Более полную информацию о виджетах и их ресурсах см. в "Справочнике виджетов Photon'а".

          1. PtSetArg()

Макрос PtSetArg() устанавливает список аргументов, используемый для инициализации ресурсов кнопки при её создании. Более подробно см. в главе "Управление ресурсами в программном коде приложения".

          1. PtCreateWidget() – второй вызов

Все виджеты приложения – кроме окна верхнего уровня – имеют контейнерный виджет в качестве родителя. Контейнерные виджеты могут содержать в себе другие контейнеры. Создание виджетов в приложении приводит к возникновению иерархии, называемой семейством виджетов.

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

          1. PtRealizeWidget()

Функция PtRealizeWidget() отображает виджет и всех его потомков в семействе виджетов. Наше простое приложение вызывает PtRealizeWidget() для окна верхнего уровня, так что отображаются все виджеты приложения.

Когда виджет реализован, он использует значения своих ресурсов, чтобы определить, насколько большим он должен быть, чтобы отобразить своё содержание. Перед реализацией виджета Вы должны установить все ресурсы, которые могут сказаться на размере. Вы можете изменить некоторые из этих ресурсов уже после того, как виджет реализован, но это будет только тогда, когда виджет определит, что он может или хочет изменить свои размеры, чтобы подстроиться под изменения в значении ресурса.

Вы можете установить флаги изменения размеров, которые виджет использует для того, чтобы определить, подстраивать ли ему или не подстраивать свои размеры в ответ на эти изменения, но заметьте, что если виджет выйдет за пределы размеров, выделенных ему его родителем, он будет отсечён в соответствии с размерами родителя. Не существует механизма, позволяющего виджету договориться со своим родителем о выделении большего пространства. Более подробно об этом см. в главе "Управление геометрией".

Если для корректного отображения требуется регион Photon'а, он создаётся каждый раз при реализации виджета. Регион требуется при любом из следующих условий:

  • Виджет устанавливает курсор

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

  • В ресурсе Pt_ARG_FLAGS установлен флаг Pt_REGION (см. описание PtWidget в "Справочнике виджетов Photon'а").

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

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

          1. PtMainLoop()

Вызов функции PtMainLoop передаёт управление приложениям библиотеки виджетов Photon'а.

Библиотека виджетов ожидает события Photon'а и передаёт их виджетам для обработки. Программный код приложения исполняется только тогда, когда в результате появления события вызываются функции ответных реакций, которые приложение зарегистрировало в виджете для этого события.

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