码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-12-25 10:09:47      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:


场景:

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: 注意, 一定要调用来释放内存, 不然会有内存泄漏.




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

标签:

原文地址:http://blog.csdn.net/infoworld/article/details/50401019

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!