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

Контурное перетаскивание

Если Вы выполняете контурное перетаскивание, подтипом интересующего Вас события является 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. Yandex.RTB R-A-252273-3
            Yandex.RTB R-A-252273-4