Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Литература_1 / photon_old.doc
Скачиваний:
38
Добавлен:
02.04.2015
Размер:
7.88 Mб
Скачать
      1. Оконные флаги уведомления

Ресурс Pt_ARG_WINDOW_NOTIFY_FLAGS определяет, о какой операции управления окнами должно быть уведомлено Ваше приложение. Этот ресурс использует те же самые биты, что и Pt_ARG_WINDOW_MANAGED_FLAGS:

Быть уведомленным, когда:

Установлен этот бит:

Умолчание:

Окно было закрыто (см. ниже)

Ph_WM_CLOSE

Да

Окно получило/потеряло фокус

Ph_WM_FOCUS

Оконное меню было запрошено или выключено

Ph_WM_MENU

Окно было перемещено вперёд

Ph_WM_TOFRONT

Окно было перемещено назад

Ph_WM_TOBACK

Окно переключило консоли

Ph_WM_CONSWITCH

Размеры окна были изменены

Ph_WM_RESIZE

Да

Окно было перемещено

Ph_WM_MOVE

Окно было скрыто или обратно показано

Ph_WM_HIDE

Окно было максимизировано

Ph_WM_MAX

Окно было сделано фоновым

Ph_WM_BACKDROP

Окно было восстановлено

Ph_WM_RESTORE

Была нажата кнопка помощи

Ph_WM_HELP

Да

Окно было сделано принудительно передним или это было отключено

Ph_WM_FFRONT

Принимаемым по умолчанию набором является

Ph_WM_RESIZE | Ph_WM__CLOSE | Ph_WM_HELP.

Когда происходит запрошенное действие, вызывается ответная реакция Pt_CB_WINDOW. См. раздел "Ответная реакция уведомления" ниже. Если Вы установили флаг уведомления Ph_WM_CLOSE, ответная реакция Pt_CB_WINDOW Вашего приложения вызывается, когда кто-то хочет закрыть окно. Ваше приложение не закрывает окно – оно может решить, что его надо оставить открытым. Напротив, ответная реакция Pt_CB_WINDOW_CLOSING вызывается, когда окно удалено (unrealized), но до того, как удалён его регион. На этот момент приложение не может прекратить закрытие окна.

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

    1. Ответная реакция уведомления

Когда происходит действие оконного менеджера, которое занесено в список уведомительных флагов окна (Pt_ARG_WINDOW_NOTIFY_FLAGS), вызывается ответная рекция окна Pt_CB_WINDOW.

Каждой функции ответной реакции, имеющейся в списке этого ресурса, передаётся структура PtCallbackInfo(см. "Справочник виджетов Photon'а"), которая содержит по меньшей мере следующие члены:

reason

Pt_CB_WINDOW

reason_subtype

0 (не используется)

event

Указатель на событие, вызвавшее ответную реакцию

cbdata

Указатель на структуру PhWindowEvent_t (описанную в "Справочнике библиотечных функций Photon'а")

Эти функции ответных реакций должны возвращать Pt_CONTINUE.

          1. Пример: проверка закрытия окна

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

  • Сбросить флаг Ph_WM_CLOSE в ресурсе Pt_ARG_WINDOW_MANAGED_FLAGS. Это укажет оконному менежеру не закрывать окно.

  • Установите флаг Ph_WM_CLOSE в ресурсе Pt_ARG_WINDOW_NOTIFY_FLAGS. Оконный менеджер будет уведомлять Вас, когда пользователь попытается закрыть окно.

  • Добавьте ответную реакцию Pt_CB_WINDOW такого вида:

int window_callback( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo ) {

PhWindowEvent_t *we = cbinfo->cbdata;

char *btns[] = { "&Yes", "&No" };

char Helvetica14[MAX_FONT_TAG];

/* предотвращает предупреждения (варнинги) об отсутствии ссылок */

widget = widget, apinfo = apinfo, cbinfo = cbinfo;

if ( we->event_f == Ph_WM_CLOSE ) {

/* Спросит пользователя, действительно ли лн хочет выйти.

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

switch( PtAlert( ABW_base, NULL, NULL, NULL, "Вы действительно хотите уйти?",

PfGenerateFontName("Helvetica", 0, 14, Helvetica14),

2, btns, NULL, 1, 2, Pt_MODAL ) ) {

case 1: /* да */

PtExit (EXIT_SUCCESS);

break;

case 2: /* нет */

return (Pt_CONTINUE);

}

}

else {

/* Проверка других событий */

}

return( Pt_CONTINUE );

}

Есть весьма существенная разница между событием Ph_WM_CLOSE и ответной реакцией закрытия окна (Pt_CB_WINDOW_CLOSING).

Ответная реакция Pt_CB_WINDOW с событием Ph_WM_CLOSE является просто уведомлением со стороны оконного менеджера Photon'а, что пользователь щёлкнул на кнопке закрытия или выбрал пункт "Close" из меню оконного менеджера Photon'а. Если в ресурсе Pt_ARG_WINDOW_MANAGED_FLAGS сброшен бит Ph_WM_CLOSE, библиотека больше не предпринимает никаких действий.

Закрытие окна (Pt_CB_WINDOW_CLOSING) вызывается, когда окно собирается по какой-либо причине прекратить своё существование (unrealize). Это включает транспортировку в другой Photon и явные вызовы PtDestroyWidget() или PtUnrealizeWidget(). Если в ответной реакции закрытия окна Вы хотите убедиться, что окно действительно уничтожено, установите флаг Pt_DESTROYED в Pt_ARG_FLAGS. Вы можете также использовать ответную реакцию Pt_CB_DESTROYED, чтобы знать, когда окно помечается для уничтожения, или Pt_CB_IS_DESTROYED, чтобы знать, когда оно уничтожается.

Заметьте также, что вызов функции exit() явным образом игнорирует все эти ответные реакции.

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