Буксировку из других приложений можно разделить на буксировку файлов и перемещение выделенной инфрмации из других приложений.
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();
}
На главную подраздела о буксировке