我编写了一个包含 TListView ( m_ListView
) 的演示。它显示了我在D:\
驱动器上的文件。如果我将 TListItemm_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;
}