【发布时间】:2014-08-19 19:36:08
【问题描述】:
我有一个 MFC 应用程序 (VS2010),其中包含一个 CScrollView,它使用 COleDropTarget 将自己注册为放置目标。
这行得通,我可以在 OnDrop 方法中检查拖放数据的类型:
BOOL CMyClass::DoDrop(COleDataObject *pDataObject, DROPEFFECT dropEffect, CPoint point)
{
if (pDataObject->IsDataAvailable(CF_DIB))
{
// Do something with DIB
}
else if (pDataObject->IsDataAvailable(CF_ENHMETAFILE) || pDataObject->IsDataAvailable(CF_METAFILEPICT))
{
// Do something with Metafiles
}
else if (pDataObject->IsDataAvailable(CF_HDROP))
{
// Do something with files
}
return FALSE;
}
这很好用。现在,我想将“虚拟文件”放入这个 CScrollView(来自另一个应用程序),但我不知道如何。对于虚拟文件,我的意思是使用 CFSTR_FILECONTENTS/CFSTR_FILEDESCRIPTOR clipbord 格式并在需要时提供实际的数据流。
为剪贴板提供虚拟文件很容易(那里有教程,例如here 或there), 但在接收端(我的 DoDrop 方法)我不知道如何检索数据。
提供虚拟文件的应用程序似乎可以工作(这意味着我可以将它们放到桌面上)。
那么,谁能告诉我如何在我的 MFC DoDrop 方法中从虚拟文件中获取数据?
编辑:好的,以下代码对我有用:
FORMATETC fetc;
// m_cfstrFileContents is CLIPFORMAT retrieved with RegisterClipboardFormat(_T("FileContents"))
fetc.cfFormat=m_cfstrFileContents;
fetc.dwAspect=DVASPECT_CONTENT;
fetc.lindex=0;
fetc.ptd=NULL;
fetc.tymed=TYMED_ISTREAM;
// Get file contents.
STGMEDIUM stgm;
if (!pDataObject->GetData(m_cfstrFileContents, &stgm, &fetc))
{
// We don't have virtual file contents in the clipbord.
return FALSE;
}
COleStreamFile file(stgm.pstm);
DWORD dwLength=file.GetLength();
LPSTR pszString=(LPSTR)_alloca(dwLength+1);
file.Seek(0, CFile::begin);
file.Read(pszString, dwLength);
pszString[dwLength]='\0';
// Either close the stream or release the storage medium, not both!
//file.Close();
ReleaseStgMedium(&stgm);
所以,pszString 真正指向了传输文件的数据,任务完成。
【问题讨论】:
标签: c++ mfc drag-and-drop