MFC中窗口实现拖拽文件功能
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中窗口实现拖拽文件功能相关推荐
- MFC中listctrl图片拖拽效果
CEffectList继承基类clistctrl 程序运行效果如下,使用的VS2013 要注意的地方,假如要将控件拖出窗口以外的地方,需要修改拥有拖拽窗口的属性:m_pDragImageList-&g ...
- 将OSG嵌入QT窗口系统中,实现拖拽界面
将OSG嵌入QT窗口系统中,实现拖拽界面 一.原理 OSG底层使用的是OpenGL图形系统,QT也增加了对OpenGL的支持,因此,可以通过QT的OpenGL模块,实现将OSG窗口嵌入到QT中,这样可 ...
- H5中的拖拽文件上传-----------------需修改,需测试
一:介绍 1.内容摘要 2.主要设计的技术 3.drag与drop事件 4.drag与drop的部分重要代码 5.File Api 6.formData 二:程序演示 1. 1 <!DOCTYP ...
- 在VMware中安装新版Ubuntu后,无法跨虚拟机复制粘贴和拖拽文件的解决方法
首先确保已经安装了VMware Tools: sudo apt install open-vm-tools 然后发现还是不能复制粘贴和拖拽文件?原因是Ubuntu(22.04,20.04等)默认启用了 ...
- js实现弹出窗口的拖拽功能
弹出窗口的拖拽 拖拽功能运用到的有 onmousedown 事件,onmousemove 事件以及 onmouseup 事件 弹出窗口基本步骤: 1.点击点击弹出窗口按钮弹出窗口: 2.窗口弹出后,鼠 ...
- MFC编程 -- 实现拖拽文件获取路径
一.设置界面,拖拽一个编辑框到窗口,设置好大小,将接收文件属性改为true 二.源代码 1.添加消息事件 case WM_DROPFILES:return 拖拽文件(hwndDlg, (HDROP)w ...
- LINUX:Ubuntu重装虚拟机后无法拖拽文件的解决方法
花了3小时尝试了网络上绝大部分方法解决无法拖拽文件的问题,在最后发现只是在错误的地方拖动文件,才导致一直不成功.在这里将安装vmtools遇到的问题和解决方法罗列出来供参考. 目录 实际解决方法(基于 ...
- win10安装vmware tools + 无法拖拽文件解决
1.加载VMware Tools安装光盘 打开虚拟机VMware Workstation,启动 Ubuntu 系统 菜单栏 - 虚拟机 - 安装VMware Tools. 2.将安装文件提取到本地磁盘 ...
- dialog弹框通过自定义指令实现可拖拽位移功能
给dialog弹框加上自定义指令,实现可拖拽功能 1.在utils文件夹内新建directives.js文件,代码如下 import Vue from 'vue'// v-dialogDrag: 弹窗 ...
最新文章
- EMC开发实习生电面经验
- 10句“金玉良言”,助你面试成功!
- (转)Android中截取当前屏幕图片
- C#中在多个地方调用同一个触发器从而触发同一个自定义委托的事件
- 性价比超高的云服务器
- 【Linux】工作管理
- 斐波那契数列python递归 0、1、1、2、3_python实现斐波那契数列的多种方式
- 2019年3月计算机考试操作,2019年3月计算机二级C++操作练习题(一)
- 调制的缺点_论文 | 下篇:中点箝位型光伏并网逆变器调制策略及效率对比
- python里怎么读取文件-python怎么读取文本文件
- 刷了大量面试题后,我还是被面试官吊打了!
- em算法详细例子及推导_EM算法详解
- linux学习笔记1(第一本笔记)
- ailed to send crash report due to a network error: SocketException: OS Error: 信号灯超时时间已到 , errno = 12
- 用于机器学习的数据库--UCI数据库
- PCB的IPC标准是什么
- DDD(Domain-Driven Design)领域驱动架构介绍
- WLAN配置三层旁挂直接转发
- 简单ELT ( 内含系统计算器)
- html pdf支持css%写法吗,HTML2PDF不支持的字符:打破,所有的CSS(Html2pdf doesn't supp