Буксировку из других приложений можно разделить на буксировку файлов и перемещение выделенной инфрмации из других приложений.
Borland C++ Builder не предоставляет встроенных средств для буксировки файлов из других приложений, но это можно реализовать используя WinAPI.
Прежде всего необходимо сообщить Windows о том, что создаваемое приложение готово обрабатывать файлы, перемещенные методом буксировки из другого приложения. Для этого достаточно включить в обработчик события OnCreate формы функцию WinAPI:
DragAcceptFiles(Handle,true);
Когда перетаскивается файл на приложение и отпускаете кнопку мыши, Windows посылает окну приложения сообщение WM_DROPFILES. Сообщение содержит имя файла. Обработчик этого сообщения нужно включить в разрабатываемое приложение:
public: __fastcall TForm1(TComponent* Owner); private: void __fastcall Response(TWMDropFiles &Message); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_DROPFILES,TWMDropFiles,Response) END_MESSAGE_MAP(TForm);
Здесь предусмотрено, что когда перетаскивается файл на приложение и отпускается кнопка мыши, то приложение вызовет функцию Response(), то есть функцию ответа. Осталось обработать это сообщение.
void __fastcall TForm1::Response(TWMDropFiles& Message) { HDROP hdropHandle=(HDROP)Message.Drop; //Переменная для хранения имени файла char chName[MAX_PATH]; //Число буксируемых файлов int viNumber=DragQueryFile(hdropHandle,-1,NULL,NULL); //Посмотрим, что это именно так Label1->Caption=viNumber; .... Здесь будем добавлять код .... }
При перемещении файла на форму переменная viNumber будет содержать число буксируемых на форму файлов. Теперь можно делать с перетащенными файлами, что угодно.
Добавим код (предварительно поместив на форму компонент ТMemo):
Memo1->Lines->Clear(); for(int i=0;i < viNumber; i++) { DragQueryFile(hdropHandle,i,chName,MAX_PATH); Memo1->Lines->Add(chName); }
Для перетащенного на приложение файла (обычно в этом случае перетаскивается один файл) код для просмотра:
char chName[MAX_PATH]; Memo1->Lines->Clear(); DragQueryFile(hdropHandle,0,chName,MAX_PATH); Memo1->Lines->LoadFromFile(chName);
При перетаскивание на форму более одного файла достаточно поместить на форму второй компонент TMemo и организовать цикл:
Memo1->Lines->Clear(); for(int i=0; i < viNumber; i++) { Memo2->Lines->Clear(); DragQueryFile(hdropHandle,i,chName,MAX_PATH); Memo2->Lines->LoadFromFile(chName); for(int j=0; j < Memo2->Lines->Count; j++) Memo1->Lines->Add(Memo2->Lines->Strings[j]); }
Поместим на форму компонент TMediaPlayer из вкладки System и добавим ниже приведенный код и, как результат - сможем проигрывать медиа файлы, перетащенне на форму.
char chName[MAX_PATH]; DragQueryFile(hdropHandle,i,chName,MAX_PATH); String strEx=ExtractFileExt(chName); if((strEx == ".avi") || (strEx == ".wav") || (strEx == ".mid")) { MediaPlayer1->FileName=chName; MediaPlayer1->Open(); MediaPlayer1->Play(); }
Аналогично, поместив на форму компонент TImage, можно просматривать графические файлы:
if((strEx == ".bmp") || (strEx== ".ico") || (strEx == ".wmf")) Image1->Picture->LoadFromFile(chName);
Любые другие действия выполняются аналогично.
В Borland C++ Builder комонент TRichtEdit в полной мере поддерживает прием перетаскиваемой текстовой информации из других приложений (Word, Excel, Notepad.. ). Используя этот компонент можно организовать транзит данных в другие приложения.
Поместим на форму компоненты TListBox, TRichEdit и создадим обработчик события OnChange (или OnMouseMove) для компонента TRichEdit. Следующий код позволяет принять выделенный текст из другого приложения в компонент TRichEdit и передать его без изменения в TListBox. Сам компонент TRichEdit не требует никаких обработчиков событий для приема текста в свое окно.
void __fastcall TForm1::RichEdit1Change(TObject *Sender) { for(int i=0; i < RichEdit1->Lines->Count; i++) { ListBox1->Items->Strings[i]=RichEdit1->Lines->Strings[i]; //Или ListBox1->Items->Add(RichEdit1->Lines->Strings[i]); } RichEdit1->Lines->Clear(); }
На главную подраздела о буксировке