We were considering how to detect that the drag/drop operation
resulted in a conceptual Move even if the DROPEFFECT_MOVE
was optimized away.
If the drop target is the shell, you can query the
data object for CFSTR_PERFORMEDDROPEFFECT
to see what the performed effect was.
void OnLButtonDown(HWND hwnd, BOOL fDoubleClick,
int x, int y, UINT keyFlags)
{
…
if (dwEffect & DROPEFFECT_MOVE) {
DeleteFileW(wszPath);
}
CheckPerformedEffect(hwnd, pdto);
…
}
Of course, we need that CheckPerformedEffect
function too.
void CheckPerformedEffect(HWND hwnd, IDataObject *pdto)
{
FORMATETC fe = {
(CLIPFORMAT)RegisterClipboardFormat(CFSTR_PERFORMEDDROPEFFECT),
NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
STGMEDIUM stgm;
if (SUCCEEDED(pdto->GetData(&fe, &stgm))) {
if ((stgm.tymed & TYMED_HGLOBAL) &&
GlobalSize(stgm.hGlobal) >= sizeof(DWORD)) {
DWORD *pdw = (DWORD*)GlobalLock(stgm.hGlobal);
if (pdw) {
if (*pdw == DROPEFFECT_MOVE) {
MessageBox(hwnd, TEXT(“Moved”), TEXT(“Scratch”), MB_OK);
}
GlobalUnlock(stgm.hGlobal);
}
}
ReleaseStgMedium(&stgm);
}
}
If the item is dropped on a shell window, the drop target
will set data into the data object under the clipboard format name
CFSTR_PERFORMEDDROPEFFECT.
The data takes the form of a DWORD in an
HGLOBAL, and the value is the actual drop effect
before any optimizations kicked in.
Here, we check whether it was a DROPEFFECT_MOVE and
display a special message if so.
0 comments