Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Drag'n'Drop: справка

7.4K
18 января 2007 года
Gole
31 / / 31.10.2005
После продолжительных попыток найти приличную справку по использованию технологии Drag'n'Drop решил больше не мучатся и перевести на русский оригинильную инфу из help-а Borland C++ Builder. Это конечно не фолиант, но для начала думаю кому-то может пригодится.
Сразу оговорюсь, возможны некоторые неточности, но в целом перевод вышел читабельный. Разобратся вполне реально.

Начало операции перетаскивания ( drag operation )

Каждый элемент управления имеет свойство DragMode, которое отвечает за интерпретиретацию операции перетаскивания. Если DragMode равен dmAutomatic, перетаскивание начинается автоматически при щелчке мышью по данному элементу управления. Так как dmAutomatic может пересекаться с обычными действиями мыши, может возникнуть необходимость в установке DragMode в dmManual (значение по умолчанию) и инициировать события перетаскивания путем обработки обычных событий мыши..
Для того чтобы «вручную» начать перетаскивание, следует вызвать метод BeginDrag данного элемента управления. BeginDrag принимает булевский параметр Immediate и целочисельный Threshold. Если установить Immediate в true, перетаскивание начинается немедленно. Если же сбросить в false, перетаскивание не начнется до тех пор пока пользователь не перетащит мышь на указанное в Threshold количество пикселей. Если Threshold равен -1, используется значение по умолчанию. Вызов

 
Код:
BeginDrag (false, -1);


Позволяет элементу управления принимать нажатия мыши в «обход» операции перетаскивания.
Инициализацию операции перетаскивания можно также привязать лишь к некоторым событиям мыши путем проверки необходимых параметров и вызова BeginDrag в зависимости их значения. Следующий код обрабатывает событие mouse-down в file list box и вызывает метод BeginDrag только при условии, что была нажата левая кнопка мыши:
Код:
void __fastcallTFMForm::FileListBox1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
  if (Button == mbLeft) // drag only if left button pressed
  {
    TFileListBox *pLB = (TFileListBox *)Sender; // приведение к TFileListBox
    if(pLB->ItemAtPos(Point(X,Y), true) >= 0) // есть ли под курсором
                                              //член   FileListBox-а?
      pLB->BeginDrag(false,-1);                   // если да то перетаскиваем
  }
}


Прием перетаскиваемых объектов

Когда пользователь перетаскивает объект над элементом управления, последний получает сообщение OnDragOver, в этот момент он (элемент управления) должен определится может или нет он принять перетаскиваемый объект в случае drop-а последнего. При перетаскивании курсор изменяется соответствующим образом в зависимости от того, может ли элемент управления принять перетаскиваемый объект или нет. Чтобы принять объект «пролетающий»  над элементом управления, следует написать соответствующий обработчик события OnDragOver.
Вышеупомянутый обработчик события drag-over имеет параметр Accept который обработчик может установить в true если мы хотим чтобы «пролетающий» объект был принят элементом управления. Этот же параметр отвечает за то какой вид принимает курсор при перетаскивании.

Среди других параметров обработчика события drag-over следующие:
- TObject *Source – источник перетаскиваемого объекта
- int X, int Y – текущая позиция курсора.
Следующий код принимает только те объекты источником которых является класс В данном примере tree view принимает только те перетаскиваемые объекты источником которых является класс TFileListBox.
 
Код:
void __fastcallTForm1::TreeView1DragOver(
TObject *Sender, TObject *Source,

  int X, int Y, TDragState State, bool &Accept)
{
  if (Source->InheritsFrom(__classid(TFileListBox)))     Accept = true;
}




Сброс ( Dropping ) объектов

Если элемент управления принимает «сбрасываемый» в него объект, он должен соответствующим образом его обработать. Для этого пишется обработчик события OnDragDrop для того элемента управления который «принимает» перетаскиваемый объект. Как и в обработчике события drag-over, обработчик drag-and-drop имиеет параметры определяющие источник перетаскиваемого объекта и текущие координаты курсора. Последние могут пригодиться скажем для какой либо цветовой индикации при перетаскивании.

В данном примере элемент управления реагирует на то куда бросаются перетаскиваемые объекты.
Код:
void __fastcall TForm1::TreeView1DragDrop(
TObject *Sender, TObject *Source, int X, int Y)
{

  if (Source->InheritsFrom(__classid(TFileListBox)))
  {
    TTreeNode *pNode = TreeView1->GetNodeAt(X,Y); // кидаем pNode
    AnsiString NewFile = pNode->Text + AnsiString("//") +
      ExtractFileName(FileListBox1->FileName);
    MoveFileEx(FileListBox1->FileName.c_str(), NewFile.c_str(),
      MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED); // перемещение файла
  }
}


Завершение операции перетаскивания

Операции перетаскивания завершается тогда, когда перетаскиваемый объект либо успешно сбрасывается либо просто отпускается над соответствующим элементом управления не способным принять подарок. В этот момент источнику перетаскиваемого объекта посылается сообщение end-drag. За обработку данного события отвечает соответствующий обработчик.
Наиболее важным параметром обработчика события OnEndDrag является параметр Target, который определяет элемент управления в который было совершено перетаскивания (если такой вообще имеется). Если Target равен null, это означает что перетаскиваемый объект не был принят. В OnEndDrag также передаются координаты мыши.

В данном примере file list box обрабатывает событие end-drag путем обновления своего списка:
 
Код:
void __fastcallTFMForm::FileListBox1EndDrag(
TObject *Sender, TObject *Target,   int X, int Y)

  if (Target)
    FileListBox1->Update();
};


Изменение вида курсора при перетаскивании

Путем использования параметра DragCursor можно изменить вид курсора при перетаскивании ( только VCL ).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог