Главная » Просмотр файлов » Руководство программиста в Photon

Руководство программиста в Photon (953920), страница 65

Файл №953920 Руководство программиста в Photon (Руководство программиста в Photon) 65 страницаРуководство программиста в Photon (953920) страница 652013-09-22СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 65)

Например, если у Вас есть приложение по имени hello.c, командой на компилирование и линковку с библиотекой совместного доступа является:

qcc -o hello hello.c -lph -lphrender

Чтобы подлинковать статические библиотеки, команда должна быть такой:

qcc -o hello hello.c -Bstatic -lph -lphrender

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

qcc -o hello hello.c lph -Bstatic -lph -Bdynamic -lphrender

Образец приложения

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

/* 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);

}

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

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

PtInit()

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

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

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

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

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

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

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

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

PtSetArg()

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

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

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

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

PtRealizeWidget()

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

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

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

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

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

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

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

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

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

PtMainLoop()

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

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

Подсоединение программного кода приложения к виджету

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

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

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

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

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

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

Ресурс ответной реакции используется для уведомления приложения о том, что у виджета произошло какое-то определённое действие (напр., Вы нажали кнопку). Каждый ресурс ответной реакции представляет некое действие пользователя, которое, по Вашей задумке, может быть интересно приложению.

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

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

Информацию об ответных реакциях см. в разделе "Ответные реакции" главы "Управление виджетами в программном коде приложения".

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

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

Информацию об обработчиках событий см. в разделе "Обработчики событий" в главе "Управление виджетами в программном коде приложения".

Полный пример приложения

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

Вот полный текст программного кода нашего образца программы с этими изменениями:

#include <stdio.h>

#include <stdlib.h>

#include <Pt.h>

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

PtArg_t args[3];

int n;

PtWidget_t *window;

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

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

char Helvetica14[MAX_FONT_TAG];

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

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

n = 0;

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

/* Использовать, если доступен, шрифт 14-пунктовый жирный Helvetica */

if (PfGenerateFontName("Helvetica", 0, 14, Helvetica14) = = NULL) {

perror("Невозможно сгенерировать имя шрифта");

}

else {

PtSetArg(&args[n++], Pt_ARG_TEXT_FONT, Helvetica14, 0);

}

PtSetArg(&args[n++], Pt_CB_ACTIVATE, callbacks, sizeof(callbacks)/sizeof(callbacks[0]));

PtCreateWidget(PtButton, window, n, args);

PtRealizeWidget(window);

PtMainLoop();

return (EXIT_SUCCESS);

} // main()

int push_button_cb(PtWidget_t *w, void *data, PtCallbackInfo_t *cbinfo) {

printf( "Я была нажата\n" );

PtExit( EXIT_SUCCESS );

/* Эта строка никогда не будет исполняться, но она делает счастливым компилятор */

return( Pt_CONTINUE );

}

Приложение 1. Архитектура Photon

В этом приложении представлен технический обзор архитектуры Photon'а. Он включает:

  • Пространство событий

  • События

  • Регионы

  • Типы событий

  • Как владельцы региона уведомляются о событиях

  • Регион устройств

  • Регион драйверов

  • Оконный менеджер Photon'а

Пространство событий

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

Характеристики

Тип файла
Документ
Размер
7,62 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6392
Авторов
на СтудИзбе
307
Средний доход
с одного платного файла
Обучение Подробнее