[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
- [ATL/WTL]_[初级]_[拖放文件到窗口]
- [ATL/WTL]_[初级]_[环境搭建]
- [ATL/WTL]_[初级]_[窗口如何实现WM_MOUSELEAVE和WM_MOUSEHOVER]
- [ATL/WTL]_[初级]_[Win32窗口自定义消息处理过程]
- [ATL/WTL]_[初级]_[SDI程序关闭的注意事项]
- [ATL/WTL]_[初级]_[常用的界面对象操作]
- [ATL/WTL]_[初级]_[Windows消息循环初解]
- [ATL/WTL]_[初级]_[选择目录对话框]
- [Cocoa]_[初级]_[文件拖放操作]
- [ATL/WTL]_[中级]_[保存CBitmap到文件-保存屏幕内容到文件]
- [ATL/WTL]_[初级]_[Win32实现Cocoa的dispatch_async到主线程的异步消息处理]
- [ATL/WTL]_[初级]_[CBitmap复制图片-截取图片-平铺图片]
- [ATL/WTL]_[初级]_[转发消息让CStatic支持点击消息操作]
- [ATL/WTL]_[初级]_[关于CEdit不识别WM_KEYDOWN的问题]
- [ATL/WTL]_[初级]_[关于graphics.DrawImage绘图时显示不正常的问题]
- [ATL/WTL]_[初级]_[如何使用GetOpenFileName多选文件-根据文件名长度计算lpstrFile长度]
- [ATL/WTL]_[中级]_[使用GDIPlus剪切和缩放图片]
- 拖放文件到窗口实现播放媒体文件
- js发送post请求
- localStorage作为简单数据库来利用
- AutoRun 免疫程序的编写
- ios 隐藏navigationbar 最少代码
- Java线程(一):线程安全与不安全
- [ATL/WTL]_[初级]_[拖放文件到窗口]
- Android开发性能优化
- 实现跨域的N种方法
- IdHTTP.post超时导致整个线程停止问题解决
- Apple免费加急审核流程
- 快速Android开发系列网络篇之Retrofit
- Android IntentService详解
- iOS-CATransiton动画效果
- Fragment与Activity通信 Android