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

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

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

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

PpContinueJob(pc);

Завершение работы печати

Когда Вы завершили печать Ваших виджетов, необходимо деактивировать и закрыть контекст печати. Это выполняется вызовами:

PpSuspendJob(pc);

PpEndJob(pc);

Все события прорисовки будут направлены на графический драйвер.

 Вы можете повторно использовать контекст печати для новых работ печати, что позволяет не создавать и не инициализировать его вновь.

Освобождение контекста печати

Когда печать завершена и Вам больше не нужен контекст печати, Вы можете его освободить, что освободит все используемые им ресурсы.

Если Вы хотите запомнить какую-либо информацию из контекста печати для дальнейшего использования, сохраните её, вызвав функцию PpGetPC() перед тем, как освободить контекст печати. Например:

short const *orientation;

...

PpGetPC( pc, Pp_PC_ORIENTATION, &orientation );

Чтобы осободить контекст печати, вызовите:

PpReleasePC( pc );

Пример

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

#include <stdio.h>

#include <stdlib.h>

#include <Pt.h>

PtWidget_t *pane, *window;

PpPrintContext_t *pc;

int quit_cb ( PtWidget_t *widget, void *data, PtCallbackInfo_t *cbinfo) {

PpReleasePC (pc);

exit (EXIT_SUCCESS);

return (Pt_CONTINUE);

} // функции quit_cb()

int print_cb ( PtWidget_t *widget, void *data, PtCallbackInfo_t *cbinfo) {

int action;

/* Вы можете выполнить эти вызовы PpSetPC() просто после создания контекста печати

Его наличие позволяет Вам повторно использовать контекст печати */

PhDim_t size = { 850, 1100 };

PhDim_t size2 = { 200, 150 };

/* Установка разрешения источника пропорционально размеру страницы */

PpSetPC(pc, Pp_PC_SOURCE_SIZE, &size, 0);

/* Раскомментируйте это, чтобы установить размеры источника равными размерам виджета.

При печати виджет будет масштабирован */

/* PpSetPC(pc, Pp_PC_SOURCE_SIZE, &size2, 0); */

action = PtPrintSelection(window, NULL, " Демонстрационный селектор печати ", pc,

Pt_PRINTSEL_DFLT_LOOK);

if (action != Pt_PRINTSEL_CANCEL) {

/* Запуск печати панели окна. Заметьте, что мы используем

один и тот же контекст печати для всех печатных работ */

PpStartJob(pc);

PpContinueJob(pc);

/* Печать виджета */

PpPrintWidget(pc, pane, NULL, NULL, 0);

/* Закрытие контекста печати */

PpSuspendJob(pc);

PpEndJob(pc);

}

return (Pt_CONTINUE);

} // функции print_cb()

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

PtArg_t args[4];

PtWidget_t *print, *quit;

PhDim_t win_dim = { 200, 200 };

PhArea_t pane_area = { {0, 0}, {200, 150} };

PhArea_t print_area = { {30, 170}, {60, 20} };

PhArea_t quit_area = { {110, 170}, {60, 20} };

PhArea_t cir_area = { {35, 20}, {130, 110} };

PhArea_t cir2_area = { {67, 40}, {20, 20} };

PhArea_t cir3_area = { {110, 40}, {20, 20} };

PhArea_t cir4_area = { {85, 80}, {30, 30} };

PtCallback_t callbacks[2] = { {print_cb, NULL}, {quit_cb, NULL} };

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

/* Создание основного окна */

PtSetArg (&args[0], Pt_ARG_DIM, &win_dim, 0);

PtSetArg (&args[1], Pt_ARG_WINDOW_TITLE, "Пример печати", 0);

if ((window = PtCreateWidget(PtWindow, Pt_NO_PARENT, 2, args)) = = NULL)

PtExit(EXIT_FAILURE);

/* Создание контекста печати */

pc = PpCreatePC();

/* Создание панели, которая будет напечатана */

PtSetArg (&args[0], Pt_ARG_AREA, &pane_area, 0);

pane = PtCreateWidget (PtPane, window, 1, args);

/* Помещаем на панель какую-то ерунду для её распечатывания */

PtSetArg (&args[0], Pt_ARG_AREA, &cir_area, 0);

PtCreateWidget (PtEllipse, pane, 1, args);

PtSetArg (&args[0], Pt_ARG_AREA, &cir2_area, 0);

PtSetArg (&args[1], Pt_ARG_FILL_COLOR, Pg_BLACK, 0);

PtCreateWidget (PtEllipse, pane, 2, args);

PtSetArg (&args[0], Pt_ARG_AREA, &cir3_area, 0);

PtSetArg (&args[1], Pt_ARG_FILL_COLOR, Pg_BLACK, 0);

PtCreateWidget (PtEllipse, pane, 2, args);

PtSetArg (&args[0], Pt_ARG_AREA, &cir4_area, 0);

PtCreateWidget (PtEllipse, pane, 1, args);

/* Создание кнопки печати */

PtSetArg(&args[0], Pt_ARG_AREA, &print_area, 0);

PtSetArg(&args[1], Pt_ARG_TEXT_STRING, "Печать", 0);

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

print = PtCreateWidget (PtButton, window, 3, args);

/* Создание кнопки завершения */

PtSetArg(&args[0], Pt_ARG_AREA, &quit_area, 0);

PtSetArg(&args[1], Pt_ARG_TEXT_STRING, "Конец", 0);

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

quit = PtCreateWidget (PtButton, window, 3, args);

PtRealizeWidget(window);

PtMainLoop();

return (EXIT_SUCCESS);

}

Глава 21. "Тащить и бросать"

Технология "тащить и бросать" (drag&drop) позволяет Вам перетаскивать произвольные данные внутри приложения или между приложениями.

 Если Вам надо просто перетаскивать графические объекты, см. раздел "Перетаскивание" в главе "События".

В этой главе обсуждается:

  • Механизм транспортировки

  • Использование "тащить и бросать"

  • Регистрация новых транспортных типов

Механизм транспортировки

Механизм транспортировки в Photon'е позволяет Вам переносить любые данные из одного приложения в другое, даже если приложения принадлежат к различным платформам с отличающимся форматом передачи данных (расположением старшего/младшего байтов). Этот механизм используется как основа технологии "тащить и бросать", но может использоваться и для других целей, таких как конфигурационные файлы.

Имеется два способа транспортировки данных:

Inline

Поточный. Данные пакуются в поток (stream) и отсылаются адресату.

By request

По запросу. Пакуются в поток и отсылаются описания данных. Адресат принимает решение, какой тип (типы) данных ему нужен и отсылает запрос обратно на источник, который затем упаковывает только затребовнные данные.

Для того, чтобы транспортировать данные, механизм транспортировки должен паковать данные в источнике – приложении или виджете – и распаковывать их в адресате. Он должен быть способен опознавать тип данных, чтобы определять, какой вид паковки и распаковки должен быть выполнен. Это выполняется через транспортный реестр.

Существует несколько регистрируемых системой типов, которые появляются после инициализации Photon'овской библиотеки через вызовы PtInit() или PtAppInit() – это для приложений PhAB выполняется автоматически. Регистрируемыми системой типами являются:

  • string

  • raw

  • PhDim

  • PhArea

  • PhPoint

  • PhImage

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

Рис. 21-1. Упакованные данные и заголовки

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

Использование "тащи и бросай"

Этот раздел включает:

  • Запуск "тащи и бросай"

  • Получение событий по "тащи и бросай"

  • Отмена "тащи и бросай"

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

Основными шагами (описанными более подробно в нижеследующих разделах) являются:

  1. Пользователь нажимает кнопку указателя на виджете, который в операции "тащи и бросай" является источником.

  2. В ответной реакции Pt_CB_OUTBOUND виджет-источник пакует данные, предназначенные для перетаскивания, и запускает операцию "тащи и бросай".

  3. Пользователь перетаскивает данные и рашает бросить их на виджет.

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

Виджет-источник может также, если захочет, отменить операцию.

Запуск операции "тащи и бросай"

Чтобы запустить операцию "тащи и бросай", виджет-источник должен запаковать данные, которые будут перетаскиваться, и затем инициализировать операцию "тащи и бросай". Обычно это делается в одной из ответных реакций Pt_CB_OUTBOUND виджета.

 Ответные реакци Pt_CB_OUTBOUND вызываются только в случае, когда у виджета в его флагах Pt_ARG_FLAGS установлен флаг Pt_SELECTABLE.

Выполните следующие шаги:

  1. Если данные не принадлежат к одному из определённых системой типов транспортных данных, создайте для них член транспортного реестра (transport registry entry). Более подробно см. в разделе "Регистрация новых транспортных типов" ниже.

  2. Создайте структуру транспортного управления (типа PtTransportCtrl_t) для использования операцией "тащи и бросай", вызвав функцию PtCreateTransportCtrl(). Структура транспортного управления освобождается автоматически после исполнения операции "тащи и бросай".

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

  • Для каждого фрагмента данных, пакуемых поточно, вызовите функцию PtTransportType().

  • Для каждого фрагмента данных, передаваемых по запросу, вызовите функцию PtTransportRequestable().

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

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

  1. Когда все данные запакованы, вызовите функцию PtInitDnd(), чтобы инициализировать операцию "тащи и бросай".

Пример

Вот пример ответной реакции, инициализирующей операцию "тащи и бросай" для виджета типа PtLabel. Вы можете использовать эту ответную реакцию для ответной реакции Pt_CB_OUTBOUND виджетов типа PtLabel (виджетов-надписей).

 Убедитесь, что во флагах Pt_ARG_FLAGS виджета установлен флаг Pt_SELECTABLE.

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

  • Текст надписи, если он имеется, пакуется как потоковые данные.

  • Образ надписи, если он имеется, пакуется как данные, доступные по запросу. Образ не транспортируется до тех пор, пока адресат не запросит его, но ответная реакция заблаговременно готовит эти данные, так что нам не требуется ответная реакция запроса.

  • Альтернативный текст, используемый при отсутствии образа. Эта строка также представляет собой данные, доступные по запросу, но мы предусматриваем ответную реакцию для упаковки этих данных, если адресат их запросит.

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

/* Стандартные хеадеры */

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

/* Инструментальные хеадеры */

#include <Ph.h>

#include <Pt.h>

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

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

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

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