场景:
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: 注意, 一定要调用来释放内存, 不然会有内存泄漏.
时间: 2024-10-22 23:11:40