0

我编写了一个包含 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;
}
4

0 回答 0