关于MFC对话框文件拖拽效果

冰缘666呀 2014-07-24 08:42:17
小弟头一次在CSDN上发帖,实在是碰到棘手问题。
话不多说,直奔主题。
最近在做一个MFC的项目,项目需求是要实现文件拖拽效果,在文件从对话框拖拽到本地的时候要显示图标,文件从本地拖拽到软件接收文件对话框的时候也要显示图标。

其实这个效果跟windows的资源管理器鼠标移动文件夹一样,效果图如下:


从软件内往外拖的效果实现了,其实就是设置一个CImageList变量 把要移动的图标保存下来 跟随鼠标移动,但是从外往里拖的效果没有实现。对话框或者List Control控件设置成Accept File属性之后默认显示的只是个虚框。

卡在这很久了 于是鼓起勇气发一贴求助。
...全文
306 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qingtianweichong 2015-09-08
  • 打赏
  • 举报
回复
用com,支持拖放的要实现IDropTarget
冰缘666呀 2014-08-01
  • 打赏
  • 举报
回复
刷下 有解答的么
冰缘666呀 2014-07-29
  • 打赏
  • 举报
回复
fishion 2014-07-24
  • 打赏
  • 举报
回复
用COleDropTarget的OnDragEnter方法处理下看看 http://www.cnblogs.com/henryzc/articles/279801.html 在里面调用下面的方法获取文件的一些信息,用于获取图标之类的 UINT nFileCount = 0; HDROP hDropFiles = NULL; HGLOBAL hMemData = NULL; if(pDataObject->IsDataAvailable(CF_HDROP)) { hMemData = pDataObject->GetGlobalData(CF_HDROP); hDropFiles = (HDROP)GlobalLock((HGLOBAL)hMemData); //锁定内存块 if(hDropFiles != NULL) { char chTemp[_MAX_PATH+1] = {0}; nFileCount = DragQueryFile(hDropFiles, 0xFFFFFFFF, NULL, 0); for(UINT nCur=0; nCur < nFileCount; nCur++) { ZeroMemory(chTemp, _MAX_PATH+1); DragQueryFile(hDropFiles, nCur, (LPTSTR)chTemp, _MAX_PATH+1); } } GlobalUnlock(hMemData); return TRUE; } else { return FALSE; }
凌乱哥 2014-07-24
  • 打赏
  • 举报
回复
凌乱哥 2014-07-24
  • 打赏
  • 举报
回复
我记得这个问题有人发过了,好像是未果
HUSTYZHY 2014-07-24
  • 打赏
  • 举报
回复
同求。。。。。。
冰缘666呀 2014-07-24
  • 打赏
  • 举报
回复
引用 8 楼 fishion 的回复:
[quote=引用 7 楼 u014728666 的回复:] [quote=引用 4 楼 fishion 的回复:] 用COleDropTarget的OnDragEnter方法处理下看看 http://www.cnblogs.com/henryzc/articles/279801.html 在里面调用下面的方法获取文件的一些信息,用于获取图标之类的 UINT nFileCount = 0; HDROP hDropFiles = NULL; HGLOBAL hMemData = NULL; if(pDataObject->IsDataAvailable(CF_HDROP)) { hMemData = pDataObject->GetGlobalData(CF_HDROP); hDropFiles = (HDROP)GlobalLock((HGLOBAL)hMemData); //锁定内存块 if(hDropFiles != NULL) { char chTemp[_MAX_PATH+1] = {0}; nFileCount = DragQueryFile(hDropFiles, 0xFFFFFFFF, NULL, 0); for(UINT nCur=0; nCur < nFileCount; nCur++) { ZeroMemory(chTemp, _MAX_PATH+1); DragQueryFile(hDropFiles, nCur, (LPTSTR)chTemp, _MAX_PATH+1); } } GlobalUnlock(hMemData); return TRUE; } else { return FALSE; }
COLE的话 实现了 CListCtrl在控件内部移动 但是实现不了 向外移动。。还有就是从本地文件夹向控件移动文件 也实现不了[/quote] 往外移动的时候调用SetCapture,往内移动的时候通过OnDropEnter,两种方法都给鼠标添加一个模拟的窗口来展现文件图标可以吧[/quote]但是在往内移动的时候 只是个虚线框 图标不见了。。。。。
fishion 2014-07-24
  • 打赏
  • 举报
回复
引用 7 楼 u014728666 的回复:
[quote=引用 4 楼 fishion 的回复:] 用COleDropTarget的OnDragEnter方法处理下看看 http://www.cnblogs.com/henryzc/articles/279801.html 在里面调用下面的方法获取文件的一些信息,用于获取图标之类的 UINT nFileCount = 0; HDROP hDropFiles = NULL; HGLOBAL hMemData = NULL; if(pDataObject->IsDataAvailable(CF_HDROP)) { hMemData = pDataObject->GetGlobalData(CF_HDROP); hDropFiles = (HDROP)GlobalLock((HGLOBAL)hMemData); //锁定内存块 if(hDropFiles != NULL) { char chTemp[_MAX_PATH+1] = {0}; nFileCount = DragQueryFile(hDropFiles, 0xFFFFFFFF, NULL, 0); for(UINT nCur=0; nCur < nFileCount; nCur++) { ZeroMemory(chTemp, _MAX_PATH+1); DragQueryFile(hDropFiles, nCur, (LPTSTR)chTemp, _MAX_PATH+1); } } GlobalUnlock(hMemData); return TRUE; } else { return FALSE; }
COLE的话 实现了 CListCtrl在控件内部移动 但是实现不了 向外移动。。还有就是从本地文件夹向控件移动文件 也实现不了[/quote] 往外移动的时候调用SetCapture,往内移动的时候通过OnDropEnter,两种方法都给鼠标添加一个模拟的窗口来展现文件图标可以吧
冰缘666呀 2014-07-24
  • 打赏
  • 举报
回复
引用 4 楼 fishion 的回复:
用COleDropTarget的OnDragEnter方法处理下看看 http://www.cnblogs.com/henryzc/articles/279801.html 在里面调用下面的方法获取文件的一些信息,用于获取图标之类的 UINT nFileCount = 0; HDROP hDropFiles = NULL; HGLOBAL hMemData = NULL; if(pDataObject->IsDataAvailable(CF_HDROP)) { hMemData = pDataObject->GetGlobalData(CF_HDROP); hDropFiles = (HDROP)GlobalLock((HGLOBAL)hMemData); //锁定内存块 if(hDropFiles != NULL) { char chTemp[_MAX_PATH+1] = {0}; nFileCount = DragQueryFile(hDropFiles, 0xFFFFFFFF, NULL, 0); for(UINT nCur=0; nCur < nFileCount; nCur++) { ZeroMemory(chTemp, _MAX_PATH+1); DragQueryFile(hDropFiles, nCur, (LPTSTR)chTemp, _MAX_PATH+1); } } GlobalUnlock(hMemData); return TRUE; } else { return FALSE; }
COLE的话 实现了 CListCtrl在控件内部移动 但是实现不了 向外移动。。还有就是从本地文件夹向控件移动文件 也实现不了
冰缘666呀 2014-07-24
  • 打赏
  • 举报
回复
引用 2 楼 dingxz105090 的回复:
我记得这个问题有人发过了,好像是未果
这么回复吧。。。这个不知道怎么实现的
冰缘666呀 2014-07-24
  • 打赏
  • 举报
回复
..汗。。。不知道如何回复消息。@dingxz105090 360网盘实现了这种效果。但是向itool之类的软件 使用的也是accept files这个属性 显示的只是个虚线框。所以 有点难办。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧