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

Если Вы выполняете контурное перетаскивание, подтипом интересующего Вас события является Ph_EV_DRAG_COMPLETE. Когда случается событие, Ваша ответная реакция должна:

  1. Получить данные, связанные с событием. Они представляют из себя структуру PhDragEvent_t, включающую в себе месторасположение перетаскиваемого прямоугольника, в абсолютных координатах. Для более полной информации см. "Справочник библиотечных функций Photon'а".

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

  3. Установить ресурс Pt_ARG_POS виджета в новую позицию.

 Помните, что параметр widget ответной реакции является указателем на контейнер (базовое окно в нашем примере), а не на перетаскиваемый виджет. Убедитесь, что передали правильный виджет функции PtSetResources() или PtSetResource(), когда устанавливали ресурс Pt_ARG_POS.

Например, вот необработанная ответная реакция для контурного перетаскивания, инициализированного выше:

/* необработанная ответная реакция для обработки событий перетаскивания;

Задайте её для базового окна */

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

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

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

#include <Ph.h>

#include <Pt.h>

#include <Ap.h>

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

#include "globals.h"

#include "abimport.h"

#include "proto.h"

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

PhDragEvent_t *dragData;

PhPoint_t new_pos;

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

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

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

if (cbinfo->event->subtype != Ph_EV_DRAG_COMPLETE) {

return (Pt_CONTINUE);

}

/* Получаем данные, связанные с событием */

dragData = PhGetData (cbinfo->event);

/* Прямоугольник в этих данных представляет из себя перетаскиваемый прямоугольник

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

перетаскиваемого региона */

new_pos.x = dragData->rect.ul.x + cbinfo->event->translation.x;

new_pos.y = dragData->rect.ul.y + cbinfo->event->translation.y;

printf ("Новая позиция: (%d, %d)\n", new_pos.x, new_pos.y);

/* Перемещаем виджет */

PtSetResource (dragged_widget, Pt_ARG_POS, &new_pos, 0);

return( Pt_CONTINUE );

}

          1. Непрозрачное перетаскивание

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

if (cbinfo->event->subtype != Ph_EV_DRAG_MOVE) {

return (Pt_CONTINUE);

}

  1. Глава 24. Управление окнами

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

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

  • Флаги управления окнами

  • Уведомительная ответная реакция

  • Получение и установка состояния окна

  • Управление несколькими окнами

  • Функции управления окнами

  • Исполнение самостоятельного приложения

  • Модальные диалоги

 Помните, что оконные и диалоговые модули PhAB'а реализованы как виджеты типа PtWindow. Тип PtWindow имеет много ресурсов, используемых для осуществления взаимодействия с оконным менеджером.

Информацию по регионам оконного менеджера см. в приложении "Архитектура Photon'а". Список относящихся к этому функций см. в разделе "Оконный менеджер" главы "Сводка функций" "Справочника библиотечных функций Photon'а".

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