Как отпустить мышь после вызова DoDragDrop
Я написал демо, содержащее TListView (m_ListView
). Он показывает мои файлы на D:\
привод. Если я перетащить TListItem в m_ListView
и брось его на E:\
диск, выбранный файл будет скопирован на E:\
, Это хорошо работает, но что-то не так с концом перетаскивания.
Когда я делаю перетаскивание и отпускаю левую кнопку, когда мышь находится над E:\
, будет тень, как на этой картинке (файл был скопирован!):
Чтобы выполнить другое действие перетаскивания, мне нужно снова щелкнуть мой TListView.
Что я должен сделать, чтобы устранить это?
Я пытался с помощью ReleaseCapture()
, но это не сработало (или я не использовал его правильно).
Основной код:
void _fastcall MC_OLEDragHelper::MyListStartDrag(TObject* vSender, TDragObject*& vDragObject)
{
int tCount = (int)m_ListView->Items->Count;
MT_FileList tFileList;
for(int i=0; i<tCount; i++)
{
TListItem* tItem = m_ListView->Items->Item[i];
if(false == tItem->Selected)
continue;
KKSTR tFileName = m_ListViewDragKit->OnItemDragOut(tItem);
if(true == tFileName.empty())
continue;
tFileList.push_back(tFileName);
}
//Call DoDragDrop
DropFiles(&tFileList, DROPEFFECT_COPY);
return;
}
DropFiles()
функция:
bool MC_OLEDragHelper::DropFiles(MT_FileList* vFileList, DWORD vDesireEffect)
{
if(false == m_Available)
return false;
if(0 == vFileList->size())
return false;
void* tDropfiles = (DROPFILES*)CreateFileDespListItem(vFileList);
FORMATETC tFormatEtc = {CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
STGMEDIUM tStorageMedium = {TYMED_HGLOBAL, {(HBITMAP)tDropfiles}, 0};
m_DragItemList->Add(&tFormatEtc, &tStorageMedium, 1);
DWORD tDropEffect;
DWORD tDragResult = DoDragDrop(m_DragItemList, m_DropSource, vDesireEffect, &tDropEffect);
bool tRetVal = false;
if(tDragResult != DRAGDROP_S_DROP)
goto WORK_END;
if(tDropEffect == DROPEFFECT_NONE)
goto WORK_END;
tRetVal = true;
WORK_END:
ReleaseStgMedium(&tStorageMedium);
DestroyFileDespListItem(HGLOBAL(tDropfiles));
m_ListView->EndDrag(true);
return tRetVal;
}