在我的应用程序中,有一个listCtrl控件,保存了一些文件路径和文件类型名.
要实现的功能:我拖动listctrl中的一项,到桌面的快捷方式或着已经运行的程序(程序支持拖曳功能),
程序自动打开当前文件.比如: list控件中,保存了 d:\123.mp3
如果我拖动到桌面的千千静听,就用千千静听打开.
如果拖到暴风,就用暴风播放器打开.
要实现的功能:我拖动listctrl中的一项,到桌面的快捷方式或着已经运行的程序(程序支持拖曳功能),
程序自动打开当前文件.比如: list控件中,保存了 d:\123.mp3
如果我拖动到桌面的千千静听,就用千千静听打开.
如果拖到暴风,就用暴风播放器打开.
http://www.moon-soft.com/doc/32233.htm
拖拽动作本身不是在List控件中默认实现的。 是通过COleDatasource之类的东西实现的,你可以查下相关资料。
自己搞定
重载了一个listCtrl,主要代码
void CMyListCtrl::OnLvnBeginrdrag(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
COleDataSource* pSource = new COleDataSource();
//UINT uDropEffect;
DROPFILES dropFiles;
UINT uGblLen,uDropFilesLen;
HGLOBAL hGblFiles,hGblEffect;
char *szData,*szFileList;
//保存文件全路名,目前是固定第一列存放文件名,以后做个回调函数
CString strFilePath=GetItemText(pNMLV->iItem,1); DWORD *dwDropEffect; //uDropEffect=RegisterClipboardFormat("Preferred DropEffect");
hGblEffect=GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE,sizeof(DWORD));
dwDropEffect=(DWORD*)GlobalLock(hGblEffect);
*dwDropEffect=DROPEFFECT_COPY;
GlobalUnlock(hGblEffect); uDropFilesLen=sizeof(DROPFILES);
dropFiles.pFiles =uDropFilesLen;
dropFiles.pt.x=0;
dropFiles.pt.y=0;
dropFiles.fNC =FALSE;
dropFiles.fWide =TRUE;
UINT uBufLen=strFilePath.GetLength();
uGblLen=uDropFilesLen+uBufLen*2+8; hGblFiles= GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, uGblLen);
szData=(char*)GlobalLock(hGblFiles); memcpy(szData,(LPVOID)(&dropFiles),uDropFilesLen);
szFileList=szData+uDropFilesLen; MultiByteToWideChar(CP_ACP,MB_COMPOSITE,
strFilePath,uBufLen,(WCHAR *)szFileList,uBufLen); GlobalUnlock(hGblFiles); pSource->CacheGlobalData(CF_HDROP, hGblFiles);
pSource->DoDragDrop();
delete pSource;
*pResult = 0;
}