假设在一个对话框程序中,有两个文本框(IDC_EDIT_FILE1和IDC_EDIT_FILE2)和两个按钮(IDC_BTN_1和IDC_BTN_2),这两个文本框中要输入两个不同的文件名称,从而完成相应的操作(如比较两个文件的差异),我们不得不通过两个按钮来实现两次“打开文件”的过程(相信我,这个功能经常会使用到的)。此时,我们可以使用OnDropFiles功能。

以下从不同角度(对话框、文本框)来完成这个工作。不管从何种角度,让我们先来了解一下OnDropFiles到底是何物。OnDropFiles是WINDOWS窗口的WM_DROPFILES消息的消息响应函数,值得注间的是,对于基于对话框的程序,默认是没有此消息项的(它隐身了),也就不能正确响应这个消息。在开始之前,我们先让这个消息对基于对话框的程序显现出来:“类向导”->“类信息”,在Message Filter选项中选择Window, 确认后,再在“Message Maps”中就会出现WM_DROPFILES了:

既然提到了OnDropFiles,函数DragQueryFile()函数不得不提。通常,在OnDropFiles函数中,我们通常都会不止一次地使用到这个函数,它能获取拖曳到当前窗口(对话框、文本框)中的文件数量及文件名称,以下是此函数的简单说明:

UINT DragQueryFile(
                 HDROP hDrop,
                   UINT iFile,
                   LPTSTR lpszFile,
                   UINT cch
              );
其中,参数说明如下:

hDrop  :用于区分”包含被拖拽文件名称结构”的句柄。 即存放所拖放文件名称的数据结构的句柄,也就是文件名缓冲区的句柄;
iFile  :文件索引编号(用于指明所要查询文件的序号, 如果拖进多个文件,则索引编号从零开始),如果iFile值为 0xFFFFFFFF 时,返回的是拖曳到窗体上的文件的个数。如果iFile值在0和拖拽文件总数之间时,DragQueryFile拷贝与文件名存储缓冲区大小适应的文件名称到缓冲区中;
lpszFile : 函数返回时,用于存储拖拽文件名称的缓冲区指针。文件名称是一个以空终止“”结尾的字符串。如果此参数是NULL,DragQueryFile函数返回拖拽的文件数目。函数DragQueryFile得到的文件名,是带完整路径的文件名;
    cch    : 存储拖拽文件名称缓冲区的大小,即lpszFile指针所指缓冲区的字符数。

返回值说明如下:

1、如果函数拷贝文件名称到缓冲区中,返回值就是拷贝的字符数,不包括终止的NULL字符; 
  2、如果文件索引值是0xFFFFFFFF,则返回值是被拖拽的文件总数,注意文件索引变量的值将保持不变,依然为0xFFFFFFFF;
  3、如果文件索引值在0和拖拽文件总数之间时,并且lpszFile值为NULL时 ,返回值是存储此被拖拽文件的名称所需要的缓冲区大小值,此值是不包括终止NULL字符的字符数。(此种用法很少用,一般会直接用MAX_PATH宏定义就可以了,不必要知道文件名的真正字数)。

实际中常会用到以下两种情况:

1、获取文件数目:

UINT iFileCount;

iFileCount = ::DragQueryFile(hDropInfo, 0xffffffff, NULL, 0);

2、获取指定索引的文件名:

char file_name[MAX_PATH];

::DragQueryFile(hDropInfo, iFileCount - 1, file_name, MAX_PATH);

一、对话框实现WM_DROPFILES消息

1、打开对话框属性,选中“接收文件”选项(如此对话框才会响应WM_DROPFILES消息),如下图所示:

2、为对话框增加WM_DROPFILES响应函数,即OnDropFiles(),如下图所示:

3、为OnDropFiles添加代码(弹出消息框,逐个显示每个文件名)

void CAboutDlg::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);

}

4、编译运行。

这样,将文件拖放到对话框的任何地方,都可以将该文件名显示在IDC_EDIT_FILE1对话框中了。当然了,只要再CDragFileDlg类中再增加一个计数变量,就可以为另一个对话框实现类似功能了。但是,在这里,我们会使用另外一种方法完成IDC_EDIT_FILE2的这种功能的添加。

二、文本框实现WM_DROPFILES消息

1、为IDC_EDIT_FILE2添加“接收文件”属性,此操作同对话框相应操作相同;

2、新建类CFileEdit,基类为CEdit,如下图所示:

3、为新类CFileEdit定义WM_DROPFILES消息响应,此操作与对话框相应操作相同,只是在类向导中指定类为CFileEdit,而不是之前的CDragFileDlg;

4、书写CFileEdit类的OnDropFiles函数,代码如下:

5、为IDC_EDIT_FILE2指令Control型变量,并选定类型为CFileEdit,而不是CEdit,如下图所示:

6、编译运行。

这样,第二个文本框的功能也完成了。

其实,这两种方法从原理上来说是相同的,只是对象不同而已,在实际应用中,你可以选择任意一种就可以了。对于我个人而言,可能会更偏爱第二种作法。

转载于:https://www.cnblogs.com/pythonschool/archive/2012/12/14/2818420.html

VC实现文件拖拽获取文件名相关推荐

  1. VB 窗体实现文件拖拽获取路径方法

    Private Sub Form_Load()     Form1.OLEDropMode = 1 End Sub Private Sub Form_OLEDragDrop(Data As DataO ...

  2. js控制文件拖拽,获取拖拽内容。

    在用户拖拽文件到浏览器的某个元素上时,js可以监听到与拖拽相关的事件,并对拖拽结果进行处理,本文讨论下和拖拽文件相关的一些问题,不过没有处理太多关于兼容性的问题. 拖拽事件 js能够监听到拖拽的事件有 ...

  3. js控制文件拖拽,获取拖拽内容

    在用户拖拽文件到浏览器的某个元素上时,js可以监听到与拖拽相关的事件,并对拖拽结果进行处理,本文讨论下和拖拽文件相关的一些问题,不过没有处理太多关于兼容性的问题. 拖拽事件 js能够监听到拖拽的事件有 ...

  4. 将文件拖拽到.py文件上以处理它(从DropHandler说起)

    原来在Win7下写了一个python程序用来处理文本(txt)文件. 通过捕捉sys.argv文件来获取输入txt文文件的名称.升级到win10后发现通过拖拉txt文件到py文件上的方法失效了.拖拽后 ...

  5. 收藏个支持进度条与文件拖拽上传的js File Uploader

    File Uploader:支持进度显示与文件拖拽的多文件上传前端JS脚本 分类: JavaScript 2012-03-11 19:20 2028人阅读 评论(11) 收藏 举报 目录(?)[+] ...

  6. QT上实现文件拖拽功能

    转自于QT上实现文件拖拽功能 声明dragEnterEvent和dropEvent事件函数,对窗口的拖拽行为进行处理 // 由MainWindow来截取拖拽事件 ①ui->lineEdit-&g ...

  7. 利用JavaFx开发RIA桌面应用-文件拖拽

    转载请注明来源-作者@loongshawn:http://blog.csdn.net/loongshawn/article/details/53023429 1 背景 给JavaFx中的TextFie ...

  8. html5之多文件拖拽上传预览

    最近对于html5预览功能很是感兴趣,特地拿出来研究一小下,并以一个小项目举例讲解. h5中的input有个type=file 就是文件上传控件,有个属性multiple就是h5新增的支持多选上传文件 ...

  9. 今天的码农女孩做了关于文件操作和文件拖拽的笔记 2022/1/21

    文件操作和文件拖拽 文件操作: js有两种机制:一个是事件机制,一个是io机制 文件操作对象: Blob通过二进制数据读取 file读取单个文件对象 fileList读取多个文件对象 fileRead ...

  10. VB 获取路径名各部分 (获取文件路径,获取文件名,获取文件扩展名)自编

    '====================获取路径名各部分:  如: c:\dir1001\aaa.txt '============获取路径路径 c:\dir1001\ '============获 ...

最新文章

  1. ICLR 2019 | 基于复杂空间关系旋转的知识表示方法
  2. 视频制作中的绿幕与拜耳阵列
  3. java雪崩_【并发编程】java 如何解决redis缓存穿透、缓存雪崩(高性能示例代码)...
  4. 行列式(determinant)的物理意义及性质
  5. 命名集 —— 绰号昵称篇
  6. springboot vue组件写的个人博客系统
  7. 人脸识别Python教学
  8. 网络远程控制原理及技术实现
  9. 全国计算机一级考试wps教程,全国计算机等级考试一级教程:计算机基础及WPS Office应用(2013年版)...
  10. MySQL入门笔记整理
  11. 小布语音下载安装_oppo语音助手小布小冰安装包app
  12. iOS 14 Beta 5 来了,修复游戏闪退问题了,还有着几个变化!
  13. 转载和积累系列 - 为什么 HashMap 加载因子是0.75?而不是0.8,0.6?
  14. 记录Spring cloud alibaba Nacos学习
  15. 我的世界工业时代java_我的世界:利用这些道具就能进入“工业时代”?萌新可以试一试!...
  16. java导出excel模板数据
  17. 三阶四阶魔方自动复原程序(Java)
  18. unity发布ios高通AR的问题
  19. JS 实现 Div 向上浮动
  20. 使用润乾报表的常见问题

热门文章

  1. NWT纪事:说是闷声发大财,不干活就发财了?
  2. 一个CPU核可以设计为两个以上的线程
  3. 上海项目危机经历与感想
  4. GDI+中的图片处理类Image或Bitmap
  5. C# 获取当前程序集版本号,获取当前编译时间
  6. MFC程序通过命令行窗口输出cout等语句
  7. mysql的bht_BHT
  8. anguarjs 图片预览_第865期【软件】最新图片排版神器 轻松打造完美排版!
  9. [转] 常用Loss函数
  10. AIX添加ASM的裸盘