在我的应用程序中,有一个listCtrl控件,保存了一些文件路径和文件类型名.
要实现的功能:我拖动listctrl中的一项,到桌面的快捷方式或着已经运行的程序(程序支持拖曳功能),
程序自动打开当前文件.比如: list控件中,保存了 d:\123.mp3
如果我拖动到桌面的千千静听,就用千千静听打开.
如果拖到暴风,就用暴风播放器打开.

解决方案 »

  1.   

    网上有很多例子的:
    http://www.moon-soft.com/doc/32233.htm
      

  2.   

    拖出去的话,用COleDatasource的CacheData即可。距离网上搜索下。
      

  3.   


    拖拽动作本身不是在List控件中默认实现的。 是通过COleDatasource之类的东西实现的,你可以查下相关资料。
      

  4.   

    谢谢大家的热心帮助!!
    自己搞定
    重载了一个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;
    }