Как отпустить мышь после вызова 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;
}

0 ответов

Другие вопросы по тегам