MFC窗口拖拽文件功能指的是用鼠标将文件拖拽入窗口后,在窗口中可以获取拖拽文件的绝对路径,如图1所示。

图1 文件拖拽功能

实现窗口的拖拽文件功能,首先要将窗口注册为放置拖拽文件的目标,之后在窗口中响应拖拽消息,获取拖拽文件的绝对路径。

1将窗口注册为放置文件的目标

将窗口注册为放置文件目标的方法有两种:一种是通过MFC资源编辑器实现,另一种方法是通过代码实现。

1.1通过MFC资源编辑器实现

在VS2015中创建一个基于对话框的MFC程序。接下来在VS2015的资源视图中,选择MFC程序的主对话框,然后在右侧的“属性”选项中将对话框的“Accept Files”属性设置为True,表示将对话框注册为放置拖放文件的目标,如图2所示。

图2 修改对话框Accept Files属性

1.2通过代码实现

在对话框的OnInitDialog()函数中通过CWnd类的DragAcceptFiles()函数将对话框注册为放置拖放文件的目标。该函数的格式为

void DragAcceptFiles( BOOL bAccept = TRUE );

该函数的参数bAccept 为 TRUE 时表示对话框接收拖拽的文件, bAccept 是 FALSE 时表示不接受拖拽的文件。

2.文件拖拽消息的响应函数

在将窗口注册为放置文件的目标后,该窗口就可以接收文件拖拽的消息了,该消息为WM_DROPFILES。

2.1 添加消息响应函数

在VS2015资源管理器中选中窗口,之后在右侧的“属性”中选择“消息”,为WM_DROPFILES消息添加响应函数OnDropFiles(),如图3所示。当将文件拖拽入对话框时,OnDropFiles()函数就会被调用。

图3 添加WM_DROPFILES消息响应函数

2.2 定义消息响应函数

在OnDropFiles()函数中,获取拖拽文件的绝对路径,并在编辑框中显示出来。通过DragQueryFile()函数获取文件的绝对路径,该函数的格式为

UINT DragQueryFile(_In_  HDROP  hDrop,_In_  UINT   iFile,_Out_ LPTSTR lpszFile,UINT   cch
);

其中,参数hDrop 包含了拖拽文件的信息; iFile 指定了查询文件的索引号; lpszFile 是保存文件绝对路径的缓冲区; cch 是缓冲区的大小。如果成功获取拖拽文件的信息,则返回非零值。

在使用DragQueryFile()函数时,首先通过该函数获取拖拽文件的数量,之后遍历每个拖拽文件。一般来说,每次只拖拽一个文件。

2.2.1 获取拖拽文件的数量

通过DragQueryFile()函数获取拖拽到窗口上的文件的数量。

int count_droppedfile = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);

其中,DragQueryFile() 函数的第二个参数设置为 0xFFFFFFFF 即 -1 时,该函数的返回值即为拖拽文件的数量。

2.2.2 拖拽文件绝对路径的显示

在“2.2.1 获取拖拽文件的数量”中获取了拖拽文件的数量之后,接下来遍历拖拽到窗口的文件,获取文件的绝对路径,并且在窗口的Edit控件中显示出来。

(1)为Edit控件添加成员变量

要想在Edit控件中显示拖拽文件的绝对路径,就要为该控件添加成员变量。如图4所示。

图4 为Edit控件添加变量

以上方法为窗口的编辑框控件添加了一个名为m_EditCtrl_FilePath的变量,该变量的类别为Control。

(2)显示绝对路径

在对话框类的OnDropFiles()函数中,有如下代码

for (int i = 0; i < count_droppedfile; ++i)
{
wchar_t filepath[MAX_PATH] = { 0 };
if (DragQueryFile(hDropInfo, i, filepath, MAX_PATH)>0)
{
m_EditCtrl_FilePath.SetWindowTextW(filepath);
}
}

其中,for 循环的作用是遍历所有的拖拽文件, count_droppedfile 是在“ 2.2.1 获取拖拽文件的数量”中获取的拖拽文件数量;通过 DragQueryFile() 函数获取文件的绝对路径,并且保存在 filepath 中,最后,通过编辑框控件的变量 m_EditCtrl_FilePath 调用 SetWindowTextW() 函数将绝对路径显示出来。

MFC中窗口实现拖拽文件功能相关推荐

  1. MFC中listctrl图片拖拽效果

    CEffectList继承基类clistctrl 程序运行效果如下,使用的VS2013 要注意的地方,假如要将控件拖出窗口以外的地方,需要修改拥有拖拽窗口的属性:m_pDragImageList-&g ...

  2. 将OSG嵌入QT窗口系统中,实现拖拽界面

    将OSG嵌入QT窗口系统中,实现拖拽界面 一.原理 OSG底层使用的是OpenGL图形系统,QT也增加了对OpenGL的支持,因此,可以通过QT的OpenGL模块,实现将OSG窗口嵌入到QT中,这样可 ...

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

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

  4. 在VMware中安装新版Ubuntu后,无法跨虚拟机复制粘贴和拖拽文件的解决方法

    首先确保已经安装了VMware Tools: sudo apt install open-vm-tools 然后发现还是不能复制粘贴和拖拽文件?原因是Ubuntu(22.04,20.04等)默认启用了 ...

  5. js实现弹出窗口的拖拽功能

    弹出窗口的拖拽 拖拽功能运用到的有 onmousedown 事件,onmousemove 事件以及 onmouseup 事件 弹出窗口基本步骤: 1.点击点击弹出窗口按钮弹出窗口: 2.窗口弹出后,鼠 ...

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

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

  7. LINUX:Ubuntu重装虚拟机后无法拖拽文件的解决方法

    花了3小时尝试了网络上绝大部分方法解决无法拖拽文件的问题,在最后发现只是在错误的地方拖动文件,才导致一直不成功.在这里将安装vmtools遇到的问题和解决方法罗列出来供参考. 目录 实际解决方法(基于 ...

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

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

  9. dialog弹框通过自定义指令实现可拖拽位移功能

    给dialog弹框加上自定义指令,实现可拖拽功能 1.在utils文件夹内新建directives.js文件,代码如下 import Vue from 'vue'// v-dialogDrag: 弹窗 ...

最新文章

  1. EMC开发实习生电面经验
  2. 10句“金玉良言”,助你面试成功!
  3. (转)Android中截取当前屏幕图片
  4. C#中在多个地方调用同一个触发器从而触发同一个自定义委托的事件
  5. 性价比超高的云服务器
  6. 【Linux】工作管理
  7. 斐波那契数列python递归 0、1、1、2、3_python实现斐波那契数列的多种方式
  8. 2019年3月计算机考试操作,2019年3月计算机二级C++操作练习题(一)
  9. 调制的缺点_论文 | 下篇:中点箝位型光伏并网逆变器调制策略及效率对比
  10. python里怎么读取文件-python怎么读取文本文件
  11. 刷了大量面试题后,我还是被面试官吊打了!
  12. em算法详细例子及推导_EM算法详解
  13. linux学习笔记1(第一本笔记)
  14. ailed to send crash report due to a network error: SocketException: OS Error: 信号灯超时时间已到 , errno = 12
  15. 用于机器学习的数据库--UCI数据库
  16. PCB的IPC标准是什么
  17. DDD(Domain-Driven Design)领域驱动架构介绍
  18. WLAN配置三层旁挂直接转发
  19. 简单ELT ( 内含系统计算器)
  20. html pdf支持css%写法吗,HTML2PDF不支持的字符:打破,所有的CSS(Html2pdf doesn't supp

热门文章

  1. E. Exits in Excess
  2. 用例图(use case diagram)
  3. 8个可以免费下载3D模型的网站,快收藏起来吧~
  4. 谈笑间学会数仓-分层架构
  5. 求三个数的最小公倍数的解法之美
  6. 稳定性资源问题,内存上涨
  7. 关于win 10电脑连接手机热点自动断开的问题
  8. 调用FFmpeg的视频压缩批处理脚本
  9. 《数据结构》:中缀表达式转后缀表达式 后缀表达式的计算
  10. ubuntu 下搭建gitLab