logo search
Литература_1 / photon_old

Обработчики события – необработанные и отфильтрованные ответные реакции

Виджетный класс PtWidget предоставляет для обработки событий такие ответные реакции:

Pt_CB_FILTER

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

Pt_CB_RAW

Эти ответные реакции вызываются после того, как виджет обработал событие, даже если методы виджетного класса это событие поглощают.

Эти ответные реакции вызываются каждый раз, когда принимается событие Photon'а, совпадающее с маской событий (предоставленной приложением). Поскольку все классы виджетов библиотеки виджетов Photon'а являются потомками класса PtWidget, эти ответные реакции могут использоваться любым виджетом библиотеки виджетов Photon'а.

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

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

Каждый раз, когда поступает событие Photon'а, оно спускается по иерархии семейства виджета до тех пор, пока виджет его не поглотит. (Когда виджет обработал событие и исключил взаимодействие другого виджета с этим событием, говорят, что первый виджет поглотил событие).

В основном ответные реакции Pt_CB_FILTER вызываются при проходе вниз по иерархии, а ответные реакции Pt_CB_RAW – при проходе вверх. Каждый виджет обрабатывает событие подобным образом:

  1. Ответные реакции Pt_CB_FILTER виджета вызываются, если тип события совпадает с маской ответной реакции. Код возврата ответной реакции указывает, что произошло с событием:

Pt_CONSUME

Событие поглощено, без обработки методами класса виджета.

Pt_PROCESS

Методам класса виджета было позволено обработать событие.

Pt_IGNORE

Событие проигнорировало виджет и всех его потокомков, как будто их и не существовало.

  1. Если виджет чувствителен к событию и разрешена ответная связь Pt_CB_FILTER, метод виджетного класса обрабатывает событие. Метод класса может поглотить событие.

  1. Если виджет поглотил событие, вызываются ответные реакции Pt_CB_RAW – если тип события совпадает с маской ответной реакции. Необработанные ответные реакции родителей виджета не вызываются.

  1. Если виджет не поглотил событие, событие проходит на потомков виджета, если таковые имеются.

  1. Если никакой виджет не поглотил событие, оно проходит обратно по иерархии семейства, и вызывается каждая ответная реакция Pt_CB_RAW виджета (если тип события совпадает с маской ответной реакции). Значение, возвращаемое ответной реакцией Pt_CB_RAW виджета, указывает, что произошло с событием:

Pt_CONSUME

Событие поглотилось, и при прохождении наверх к родителю виджета никакие другие необработанные ответные реакции не вызывались

Pt_CONTINUE

Событие прошло наверх к родителю виджета

 Если виджет отключён (напр., в его флагах Pt_ARG_FLAGS выставлен флаг Pt_BLOCKED), необработанные и отфильтрованные ответные реакции не вызываются. Вместо них вызываются (если имеются) ответные реакции Pt_CB_BLOCKED виджета.

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

  1. Вызываются ответные реакции Pt_CB_FILTER окна, но событие не поглощается. Методы класса виджета тоже не поглощают событие.

  2. Событие проходит к панели. Ни её ответные реакции Pt_CB_FILTER, ни её методы класса не поглощают событие.

  3. Событие проходит к кнопке. Её ответные реакции Pt_CB_FILTER не поглощают событие, но это делают методы её класса; вызывается соответствующая ответная реакция (напр., Pt_CB_ACTIVATE).

  4. Для события вызывается ответная реакция Pt_CB_RAW кнопки.

  5. Ответные реакции Pt_CB_RAW панели и окна не вызываются, поскольку кнопка поглотила событие.

Если ответная реакция Pt_CB_FILTER панели указывает проигнорировать событие:

  1. Окно обрабатывает событие, как и раньше

  2. Ответная реакция Pt_CB_FILTER панели указывает проигнорировать событие, так что панель и все её потомки пропускаются.

  3. Больше виджетов в семье нет, так что вызывается ответная реакция Pt_CB_RAW окна.

Более подробно о добавлении обработчиков событий смотри в: