void CExeBinderDlg::OnDropFiles(HDROP hDropInfo)
{// TODO: 在此添加消息处理程序代码和/或调用默认值TCHAR lpszFile[MAX_PATH + 1] = {0};UINT numFiles;POINT dragPt;numFiles = DragQueryFile(hDropInfo, 0xFFFF, NULL,0);DragQueryFile(hDropInfo, 0, lpszFile, MAX_PATH);DragQueryPoint(hDropInfo, &dragPt);DragFinish(hDropInfo);do{CWnd *pWnd = ChildWindowFromPoint(dragPt);if(pWnd == NULL)break;TCHAR chClassName[64];if(!GetClassName(pWnd->m_hWnd, chClassName, 64))break;if(_tcscmp(chClassName, _T("Edit")) != 0)break;pWnd->SetWindowText(lpszFile);}while(0);CDialogEx::OnDropFiles(hDropInfo);
}

--------------------------------------------------------------------------------------------------------------------------

使用过QQ的人都知道,只要把文件拖拽到消息框中就可以传送文件了。那么这种功能是如何实现的呢?其实很简单,只需要响应一个WM_DROPFILES消息就可以了。

在基于对话框的程序中,默认是没有这个消息的,按下Ctrl+W,弹出类向导对话框,选择Class Info标签,在Message fileter下拉列表中选择Window,然后再点击Message Maps标签,就出现WM_DROPFILES消息了,添加该消息的响应函数:
     void CTestDlg::OnDropFiles(HDROP hDropInfo)
     {
              // TODO: Add your message handler code here and/or call default
              CDialog::OnDropFiles(hDropInfo);
     }
     另外,要让对话框能够接受文件拖拽,还需要设置对话框属性。在对话框上点击右键,选择Properties->Extended Styles,点选Accept files选项即可。

要获得当前拖拽的文件的完整文件名(含路径),只需要一个函数:
        UINT DragQueryFile(
            HDROP hDrop,
            UINT iFile,
            LPTSTR lpszFile,
            UINT cch
        );
     参数解释:
        hDrop: HDROP标识符,即响应函数中的hDropInfo参数
        iFile: 待查询的文件索引号,从0开始。可以同时拖拽多个文件,因此就需要一个索引号来进行区分。如果该参数为0xFFFFFFFF,则该函数返回拖拽的文件的个数
        lpszFile: 用于存放文件名的缓冲区首地址
        cch: 缓冲区长度
        返回值:文件名长度

另外,查询完成后需要释放系统分配内存,使用下面这个函数:
        VOID DragFinish(
            HDROP hDrop
        );

下面是一个完整的代码示例,将文件拖拽到对话框上后会弹出消息框显示完整文件名:
        void CTestDlg::OnDropFiles(HDROP hDropInfo)
        {
                  // TODO: Add your message handler code here and/or call default
                 UINT count;
                  char filePath[200];

count = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);
                  if(count)
                  {        
                           for(UINT i=0; i<count; i++)
                           {
                                    int pathLen = DragQueryFile(hDropInfo, i, filePath, sizeof(filePath));
                                    AfxMessageBox(filePath);
                           }
                  }

DragFinish(hDropInfo);

CDialog::OnDropFiles(hDropInfo);
        }

同理,如果只有把文件拖拽到特定的控件中时才有响应,只需要把该控件的Accept files样式勾选上即可。

MFC拖拽文件到任意EDIT控件相关推荐

  1. MFC中窗口实现拖拽文件功能

    MFC窗口拖拽文件功能指的是用鼠标将文件拖拽入窗口后,在窗口中可以获取拖拽文件的绝对路径,如图1所示. 图1 文件拖拽功能 实现窗口的拖拽文件功能,首先要将窗口注册为放置拖拽文件的目标,之后在窗口中响 ...

  2. MFC编程 -- 实现拖拽文件获取路径

    一.设置界面,拖拽一个编辑框到窗口,设置好大小,将接收文件属性改为true 二.源代码 1.添加消息事件 case WM_DROPFILES:return 拖拽文件(hwndDlg, (HDROP)w ...

  3. Java 拖拽文件到文本框

    Java中如何把文件拖拽到文本框呢? 先看一个例子:     核心代码: Java代码   /*** * 拖拽文件到文本框 * @param component */ public void drag ...

  4. vue 拖拽元素到任意位置

    vue 拖拽元素到任意位置 使用vue-drag-it-dude组件 npm install vue-drag-it-dude --save 参考地址:https://github.com/xzqyu ...

  5. H5中的拖拽文件上传-----------------需修改,需测试

    一:介绍 1.内容摘要 2.主要设计的技术 3.drag与drop事件 4.drag与drop的部分重要代码 5.File Api 6.formData 二:程序演示 1. 1 <!DOCTYP ...

  6. MFC EDIT控件的使用记录

    mfc和qt不同,mfc没有单行edit控件,而qt有,下面我就来介绍mfc如何将edit设置为单行控件 CFont * f; f = new CFont; f->CreateFont( 50, ...

  7. php 拖动多个文件上传,dropzone拖拽文件上传一次上传多个文件的方法

    用dropzone插件拖拽文件上传默认情况是把一个文件拖到浏览器后就立即自动上传,参考前文<用dropzone插件拖拽文件上传>,如果需要一次上传多个文件怎么办?本文将介绍其实现方法. d ...

  8. Win7下拖拽文件的bug

    今天突然发现,在Win7用管理员身份运行,拖拽文件到窗体上,既然不响应消息, 而用普通方式运行,一切正常,不知道是什么原因. 代码如下: void CPeInfoDlg::OnDropFiles(HD ...

  9. win10安装vmware tools + 无法拖拽文件解决

    1.加载VMware Tools安装光盘 打开虚拟机VMware Workstation,启动 Ubuntu 系统 菜单栏 - 虚拟机 - 安装VMware Tools. 2.将安装文件提取到本地磁盘 ...

最新文章

  1. phpstudy如何升级php,phpstudy如何升级phpmyadmin?
  2. WebService入门教程_HTTP协议学习
  3. Android 读取文件内容
  4. 砂.随笔.二十.微笑
  5. Iterator模式
  6. 搭载第四代自研神龙架构 阿里云发布RDMA增强型实例等多款新品
  7. HttpClient调用http接口(POST)
  8. 程序员很平凡,但从事着不平凡的工作!
  9. MyBatis3:SQL映射
  10. Logisim元件用法详解三:Plexers 复用器
  11. 关于hashcode和equals方法
  12. linux c 开发
  13. 软件项目管理 --SVN目录结构
  14. 音频文件编辑 android,音频剪辑编辑APP
  15. 窄带高清赋能体育赛事,世界杯高清直播背后的技术变革
  16. mac 卸载php版本,mac 系统下删除旧的php版本安装最新的php版本及Xdebug
  17. 【AWS云从业者基础知识笔记】——模块3:全球基础设施和可靠性
  18. 带七段式数码显示管的自动售卖机设计(verilog自学笔记之有限状态机的设计)
  19. 读Redis对比数据库数据进行稽核
  20. Mac OS X 工具技巧:一文搞定个性化命令行窗口(iTerm2 + zsh + oh-my-zsh 配置Powerline风格)

热门文章

  1. 编写业务层和持久层事务控制代码并配置spring的ioc
  2. 静态static关键字修饰成员方法
  3. SpringBoot_web开发-【实验】-登陆拦截器
  4. SpringMVC中向服务器传输数据(解决get、post、delete、put请求乱码问题)
  5. spring配置详解-属性注入(构造函数)
  6. SpringBoot 配置环境属性
  7. c语言进程调度报告,进程调度(C语言实现).doc
  8. JavaFX 中的像素、分辨率与缩放比
  9. 210305设计共享内存
  10. webpack 4.0 小记