Форум — Ответы     (  К темам )
 ?  Art: Кто знает, как сделать форму приёмником внешнего Drag-and-Drop'а? (31-03-2003 19:00:41)
Конкретная задача: получить значение ячейки MS Excel, которая была "перетащена" (dragged-and-dropped) в разработанное приложение. Если кто знает, как реализуется внешний drag-and-drop, или где про это прочитать, подскажите, пожалуйста.
 ACD (01-04-2003 03:36:43)
В конструкторе формы — DragAcceptFiles(Handle,true);
В хеддере , например так
public:
void __fastcall onDropFl(TWMDropFiles& Message);

BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DROPFILES,TWMDropFiles,onDropFl);
END_MESSAGE_MAP(TForm)

Далее , в реализуешь это в .cpp
void __fastcall TForm1::onDropFl(TWMDropFiles& Message)
{
char path[MAX_PATH];
HWND hw;
int nFiles;

HDROP drop=(HDROP)Message.Drop;
nFiles=DragQueryFile(drop,-1,NULL,NULL);
for(int i=0;i<nFiles;i++)
{DragQueryFile(drop,i,path,sizeof(path));
...;}

DragQueryPoint(drop,&point);
DragFinish(drop);
}

В коде может быть что-то лишнее — просто скопировал кусок из одного проекта и удалил не относящееся к вопросу.
 ACD (01-04-2003 03:41:16)
Хотя если перетаскивать ячейку Excel то не знаю , что будет в path , и что вообще вернет DragQueryFile.
 Art (01-04-2003 11:12:29)
ACD, cпасибо, конечно, но это не помогает. Ты предлагаешь зарегистрировать приложение как приёмник сообщения WM_DROPFILES функцией DragAcceptFiles, а затем повестить на это сообщение свой обработчик. Это здорово, но мне файлы не нужны (компоненты-приёмники/источники dragged-and-dropped URL, BMP, файлов и папок созданы ещё для Delphi 4 — правда они коряво портируются в C++ Builder 5.0), а нужен мне ЛЮБОЙ DragOver/DragDrop из других приложений.
В WinSigth есть Message wm_dropObject — прямо по соседству с WM_DROPFILES. Одна проблема: я не знаю как зарегистрировать приложение на получение этого сообщения!
HELP!!!!
 ACD (03-04-2003 03:10:34)
Смотрел в MSDN WM_DROPOBJECT не нашел.
Что то есть по IDropTarget Interface :
RegisterDragDrop(),RevokeDragDrop()...
но как это все применить в билдере не известно.
 Art (03-04-2003 12:06:22)
ACD, большое спасибо за такое участие!
Я уже нашёл нужный компонент TTextDropTarget — поставляется с 6-м Builder'ом. Excel при начале Drag'а создаёт свой мультиинтерфейсный DragObject, который в том числе поддерживает CF_TEXT. Теперь экспериментирую, как получить из этого DragObject'а все поддерживаемые им форматы: должно получиться как в офисном PasteSpecial.
Ещё раз спасибо. ;-)