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

来源:互联网 发布:遗传算法的交叉概率 编辑:程序博客网 时间:2024/05/17 09:36


场景:

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


0 0