0

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;
}
4

0 に答える 0