[ATL/WTL]_[初级]_[拖放文件到窗口]


场景:

1. 软件需要支持从桌面拖动文件到软件里,避免从文件打开窗口选择文件,这样效率快很多,这时就需要窗口支持拖放技术. drag and drop.

2. 软件需要复制文件到远程或设备里,支持拖放的话就很方便.


两种方案:

1. 如果是Windows 窗口程序, 可以使用监听WM_DROPFILES 消息来实现, 这里讲解第一种, 比较方便.

http://blog.csdn.net/laogaoav/article/details/9152181


2. 如果不想监听 WM_DROPFILES 消息,或者是实现 窗口之间拖放,或者把文本拖放到窗口,或者实现一些Shell的操作,需要实现 IDropTarget. 

这种方法更强大, 应用范围更广,但是实现起来也比较复杂,而且由于对COM编程不熟悉,所以暂时不考虑.

https://msdn.microsoft.com/en-us/library/ms679679.aspx


第一种方案的步骤:

1. 窗口在创建后,调用 ::DragAcceptFiles(m_hWnd, bAccept); 设置窗口支持接收拖放文件.

2. 在窗口上监听消息 WM_DROPFILES,并实现消息监听函数.

LRESULT OnDropFiles(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

https://msdn.microsoft.com/en-us/library/windows/desktop/bb774303(v=vs.85).aspx

之后在消息处理函数里实现想要的逻辑.

TCHAR szFilePathName[_MAX_PATH+1] = {0};
HDROP hDrop = (HDROP)wParam;
UINT nFileCount = ::DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
std::vector<std::wstring> paths;
for (UINT nIndex=0 ; nIndex< nFileCount; ++nIndex) 
{ 
	::DragQueryFile(hDrop, nIndex, szFilePathName, _MAX_PATH);
	paths.push_back(szFilePathName);
}
::DragFinish(hDrop);


函数使用查看MSDN即可.


::DragQueryFile : 用来查询拖入的文件路径的.

::DragFinish: 注意, 一定要调用来释放内存, 不然会有内存泄漏.


参考:

http://blog.csdn.net/vcbear/article/details/5990
http://www.codeproject.com/Articles/819/Implementing-a-drop-target
https://msdn.microsoft.com/en-us/library/ms679679.aspx
https://blogs.msdn.microsoft.com/oldnewthing/20100503-00/?p=14183/
http://stackoverflow.com/questions/6702615/how-to-handle-drag-and-drop-to-a-win32-application-icon


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Peter(阿斯拉达)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值