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

Следующий пример демонстрирует ответную реакцию Arm (Pt_CB_ARM), которая инициализирует контурное перетаскивание:

/* Запуск перетаскивания виджета */

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

#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 start_dragging( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo ) {

PhDim_t *dimension;

PhRect_t rect;

PhRect_t boundary;

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

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

/* Установка перетаскиваемого прямоугольника в позицию и размеры перетаскиваемого виджета */

PtWidgetExtent (widget, &rect);

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

PtGetResource (ABW_base, Pt_ARG_DIM, &dimension, 0);

boundary.ul.x = 0;

boundary.ul.y = 0;

boundary.lr.x = dimension->w - 1;

boundary.lr.y = dimension->h - 1;

/* Инициализация контурного перетаскивания (Ph_DRAG_TRACK не задано) */

PhInitDrag (PtWidgetRid (ABW_base),

Ph_TRACK_DRAG,

&rect, &boundary,

PhInputGroup( cbinfo->event ),

NULL, NULL, NULL, NULL, NULL );

/* Сохранение указателя на перетаскиваемый виджет */

dragged_widget = widget;

return( Pt_CONTINUE );

}

Вышеописанная ответная реакция добавляется к ответной реакции Arm (Pt_CB_ARM) перетаскиваемого виджета. Это может быть использовано для перетаскивания любого виджета, так что указатель на виджет сохраняется в глобальной переменной dragged_widget.

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

Если Вы хотите использовать непрозрачное перетаскивание, добавьте к вызову PhInitDrag() флаг Ph_DRAG_TRACK():

PhInitDrag( PtWidgetRid (ABW_base),

Ph_TRACK_DRAG | Ph_DRAG_TRACK,

&rect, &boundary,

PhInputGroup( cbinfo->event ),

NULL, NULL, NULL, NULL, NULL );

      1. Обработка событий перетаскивания

Чтобы обработать события перетаскивания (Ph_EV_DRAG), Вам надо определить необработанную (Pt_CB_RAW) или отфильтрованную (Pt_CB_FILTER) ответную реакцию.

 Необработанная или отфильтрованная ответная реакция должна быть определена для виджета, чей регион передаётся функции PhInitDrag(), а не для перетаскиваемого виджета. В данном примере необработанная ответная реакция определена для базового окна.

Как описано в разделе "Обработка событий – необработанные и отфильтрованные ответные реакции" в главе "Редактирование ресурсов и ответных реакций в PhAB", чтобы указать, для каких событий вызываются ответные реакции, Вы используете маску событий. Для перетаскивания событием является Ph_EV_DRAG. Наиболее часто используемыми подтипами для этого события являются:

Ph_EV_DRAG_START

Пользователь начал перетаскивание.

Ph_EV_DRAG_MOVE

Перетаскивание выполняется (только для непрозрачного перетаскивания).

Ph_EV_DRAG_COMPLETE

Пользователь отпустил кнопку мыши.

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