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

Чаще всего при обработке того, что пользователь делает, когда указывает на виджет, Вы будете использовать ответные реакции этого виджета.

          1. Нажатие кнопки

Когда Вы нажимаете на кнопку мыши, Photon генерирует событие Ph_EV_BUT_PRESS для виджета, имеющего в этот момент фокус.

          1. Отпускание кнопки

Когда Вы отпускаете нажатую кнопку, Photon генерирует два события Ph_EV_BUT_RELEASE:

  • Одно событие подтипа Ph_EV_RELEASE_REAL

  • Одно – подтипа Ph_EV_RELEASE_PHANTOM

Когда Вы отпускаете кнопку мыши, реальное отпускание попадает на указатель мыши; фантомное отпускание всегда проходит на тот же регион (и позицию), который получил нажатие кнопки.

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

          1. Несколько щелчков

Нажимаете ли Вы или отпускаете кнопку мыши, событие включает в себя счётчик щелчков. Как Ваше приложение определяет, что Вы щёлкнули, а не выполнили двойной щелчок?

В данных по событию имеется счётчик щелчков, связанный с событиями Ph_EV_BUT_PRESS и Ph_EV_BUT_RELEASE; чтобы получить эти данные, вызовите функцию PhGetData(). Данными для этих событий являются структуры типа PhPointerEvent_t (см. подробнее в "Справочнике библиотечных функций Photon'а"); её член click_count даёт количество Ваших щелчков кнопкой мыши.

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

Ph_EV_BUT_RELEASE с подтипом Ph_EV_RELEASE_ENDCLICK.

Иными словами, первый щелчок генерирует событие Ph_EV_BUT_PRESS и пару событий Ph_EV_BUT_RELEASE (одно реальное REAL и одно фантомное PHANTOM) со счётчиком click_count, установленным в 1. Затем, в зависимости от того, щёлкнул ли пользователь достаточно быстро вновь или нет, Вы получите либо

  • событие Ph_EV_BUT_PRESS и пару событий Ph_EV_BUT_RELEASE со счётчиком click_count, установленным в 2;

либо

  • событие Ph_EV_BUT_RELEASE с подтипом Ph_EV_RELEASE_ENDCLICK.

После второго щелчка Вы либо получаете третий, либо ENDCLICK, и так далее. Но в конечном счёте Вы получаете ENDCLICK – и в следующий раз, когда пользователь щёлкнет, счётчик щелчков вновь равен 1.

          1. Клавиши-модификаторы

Если Вам надо определить, какие клавиши были в событии мыши, вызовите функцию PhGetData(), чтобы получить данные по событию, которые включают события Ph_EV_BUT_PRESS и Ph_EV_BUT_RELEASE. Данными для этих событий является структура типа PhPointerEvent_t (описанная в "Справочнике библиотечных функций Photon'а"); проверьте её член key_mods, чтобы определить клавиши-модификаторы, которые были нажаты.

Например, эта ответная реакция Pt_CB_ACTIVATE предоставляет список клавиш-модификаторов, которые были нажаты, когда была отпущена кнопка мыши:

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

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

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

#include <Ph.h>

#include <Pt.h>

#include <Ap.h>

/* Локальные хеадеры */

#include "abimport.h"

#include "proto.h"

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

PhPointerEvent_t *event_data;

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

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

if (cbinfo->event->type != Ph_EV_BUT_RELEASE) {

printf ("Это не событие Ph_EV_BUT_RELEASE\n");

}

else {

printf ("Это событие Ph_EV_BUT_RELEASE\n");

event_data = (PhPointerEvent_t *) PhGetData (cbinfo->event);

if (event_data->key_mods & Pk_KM_Shift ) printf (" Shift\n");

if (event_data->key_mods & Pk_KM_Ctrl ) printf (" Ctrl\n");

if (event_data->key_mods & Pk_KM_Alt ) printf (" Alt\n");

}

return( Pt_CONTINUE );

}

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