MFC OLE拖放实现

最近研究了一下剪贴板,然后根据网上的

http://blog.csdn.net/sendy888/article/details/1747899http://www.360doc.com/content/12/1012/07/7662927_240964665.shtml这两篇文章。

自己写的一个MFC Dialog程序。

第二篇文章中:

        在Windows的资源管理器中,选中一个活多个文件,在文件单击鼠标右键,在弹出菜单中选复制。再切换到另一个目录,单击鼠标右键,点粘贴。接这样执行了一次文件的拷贝操作,那么Windows在拷贝过程中执行了什么操作,是否将整个文件拷贝到剪贴板上了呢?当然没有。实际上,Windows只是将一个文件结构拷贝到了剪贴板,这个结构如下:

       tDropFile+wenjian1文件名+vcNullChar+文件2文件名+vbNullChar....+文件N文件名+vbNullChar,其中tDropFile是一个DROPFILES结构这个结构在Windows API中有定义。在粘贴文件时,利用API函数DragQueryFile就可以获得拷贝到剪贴板的文件全路径名,然后就可以根据获得的文件名执行文件拷贝函数,实现对文件的粘贴操作。

       在应用中发现拷贝到剪贴板的文件结构的最后一个文件名后面跟的是两个NullChar方能成功。

遇到的问题:

文章中-Initialize函数用于注册CListCtrlEx成为拖放接收窗口;但是在CListCtrlEx::Initialize函数中调用 

m_oleDropTarget.Register(this);

不能实现拖入操作,然后在CListCtrlEx::OnCreate中调用,结果成功。

描述:本程序实现的是OLE拖放操作,程序运行生成对话框。

然后向对话框中拖入文件或文件夹,对话框中CListCtrl显示文件的全路径名。(如果拖入两次同一个文件,会显示两个item)

拖出CListCtrl中的一个项目,会实现复制操作。

未解决的问题:

在CListCtrlEx::OnLvnBeginDrag()函数中,使用了GlobalAlloc开辟空间,但是没有释放掉。如果在m_oleDataSource.DoDragDrop返回之后GLobalFree,那么在第二次托出的时候,程序会崩溃(只能去任务管理器中结束了),暂时没有想到是否应该释放(Windows资源管理器不知会释放吗),应该在什么地方释放。

 生成的exe程序下载地址:http://download.csdn.net/detail/hebeixingxs/6522293

源代码下载地址:http://download.csdn.net/detail/hebeixingxs/6522203

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值