BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_DROPFILES, TWMDropFiles, WMDropFiles);
END_MESSAGE_MAP(TWinControl);
Drag & Drop
У меня такой вопрос:
Вот есть у меня форма на ней ListBox, я хочу чтобы можно было мышкой захватить и перенести какой-нибудь файл на ListBox, а когда отпустить мышку, тот в ListBox добавится полный адрес этого файла !
Благодарю за внимание !!!
Код:
В cpp-файле создаёте этот обработчик:
Код:
void __fastcall TYourFrm::WMDropFiles(TWMDropFiles& Message)
{
// проверяете, что курсор находится над ListBox или там ещё где-нибудь
char fname[MAX_PATH];
int dragcnt = ::DragQueryFile((HDROP)Message.Drop, 0xFFFFFFFF, NULL, 0);
for(int i=0; i<dragcnt; i++)
{
::DragQueryFile((HDROP)Message.Drop, i, fname, MAX_PATH);
AnsiString aFile;
ParseFileName(fname,aFile); // преобразовать ярлык файла в имя файла
if(!aFile.IsEmpty())
{
//делаете тут то, что нужно
}
}
::DragFinish((HDROP)Message.Drop);
}
{
// проверяете, что курсор находится над ListBox или там ещё где-нибудь
char fname[MAX_PATH];
int dragcnt = ::DragQueryFile((HDROP)Message.Drop, 0xFFFFFFFF, NULL, 0);
for(int i=0; i<dragcnt; i++)
{
::DragQueryFile((HDROP)Message.Drop, i, fname, MAX_PATH);
AnsiString aFile;
ParseFileName(fname,aFile); // преобразовать ярлык файла в имя файла
if(!aFile.IsEmpty())
{
//делаете тут то, что нужно
}
}
::DragFinish((HDROP)Message.Drop);
}
В конструкторе формы вызываете функцию ::DragAcceptFiles(Handle,true);
Функции, начинающиеся с "::" - это функции Windows API, помощь по ним ищите в справке или в MSDN.
Функция ParseFileName - Ваша собственная, в которой можно получить имя файла из ярлыка (LNK, shortcut), или ещё каким-либо образом преобразовать строку с именем сброшенного объекта в имя объекта, которое будет отображаться на форме.
Как именно получить имя из ярлыка, смотрите тоже в справку или MSDN (ключевое понятие - интерфейс IShellLink).
Попробую все это понять... :-)