问题

最近需要实现文件选择的功能,要求是需要弹出系统标准的文件选择对话框,另外,允许用户选择多个文件。

解决方法

MFC中有一个类CFileDialog就是用来做这件事的,而且功能还挺丰富,今天只是使用它的一小部分特性。

直接上代码

以下代码实现了一个方法,该方法弹出文件选择对话框,允许用户选择多个文件,让点击确定时,以列表的形式,返回用户选择的所有文件。

以下是使用上述方法的客户代码

代码解析

1) CFileDiag有如下几个参数:

CFileDialog(

BOOL bOpenFileDialog,

LPCTSTR lpszDefExt = NULL,

LPCTSTR lpszFileName = NULL,

DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,

LPCTSTR lpszFilter = NULL,

CWnd* pParentWnd = NULL,

DWORD dwSize = 0,

BOOL bVistaStyle = TRUE);

bOpenFileDialog:TRUE: 创建一个打开文件对话框,FALSE: 创建一个文件另存为对话框。

lpszDefExt: 默认文件后缀。如果用户没有输入后缀,则系统会默认追加此后缀。

lpszFileName:初始文件名。文件打开时,默认加载的文件名。

dwFlags:对话框选项,用来定制对话框的各个属性。

lpszFilter:过滤器,形如:”所有文件 (*.*)|*.*|”。

pParentWnd:指定对话框的父窗口。

dwSize:OPENFILENAME结构体的大小。一般指定为0。

bVistaStyle:启用Vista风格,仅对VS2008及以后的版本可用。

2) 使用到的风格OFN_ALLOWMULTISELECT来启用文件的多选。

3) 当用户选择完毕后,使用GetStartPosition和GetNextPathName来遍历所有用户选择的文件路径,这里的路径是文件的全路径。

4) 使用vector用来返回用户选择的文件列表,返回过程可能会涉及一些对象的拷贝构造,但考虑到不是性能攸关的代码中执行,所以这点开销,还是可以接受的。

5) 客户代码中,使用了一个vector的引用来接方法的返回值,这样避免了对象的额外拷贝构造过程。

另一个问题

在一个项目中发现,调试模式下,CFileDialog打开时速度较慢,如果切换到Release模式,就很快能打开。我想这个可能的原因是调试模式的MFC库因为有许多ASSERT之类的检查,所以才会显得比较慢。

总结

1) 使用系统标准的组件设施,有助于提高应用程序界面和操作上的一致性,这样,用户比较容易上手。

2) 在调试模式下加入一些ASSERT,有助于在开发早期暴露出程序的内部错误,这样在Release模式就比较放心一点,而且,更重要的是,性能较之调试模式,有很大的提升。这就像平时练习跑步上在两只脚上绑上沙袋,练得的确很辛苦,但是当歇下沙袋,就会有身轻如燕的感觉。

mfc 监控文件操作_实战经验:使用CFileDialog实现多个文件选择相关推荐

  1. Python_文件操作_深入

    Python_文件操作_深入 按文件中数据的组织形式把文件分为文本文件和二进制文件两大类 文本文件:存储常规字符串,由若干文本行组成,通常每行以换行符'\n'结尾 二进制文件:存储字节串(bytes) ...

  2. python读压缩文件内容_使用Python读写及压缩和解压缩文件的示例

    读写文件 首先看一个例子: f = open('thefile.txt','w') #以写方式打开, try: f.write('wokao') finally: f.close() 文件的打开方式: ...

  3. Python基本语法_文件操作_读写函数详解

    目录 目录 软件环境 file文件对象 open文件操作 读文件 read读取所有文件内容 readline获取一行内容 readlines读取所有文件内容 readreadlinereadlines ...

  4. python读写文件操作_详解Python文件读写操作

    读文件 打开文件(文件需要存在)#打开文件 f = open("data.txt","r") #设置文件对象 print(f)#文件句柄 f.close() # ...

  5. C++基础部分_C++文件操作_二进制文件的读操作---C++语言工作笔记079

    然后我们再来看一下c++中的文件操作,如何来读取一个二进制文件,上一节我们写入了一个二进制文件,把一个person类对象写入到了一个person.txt文件中.然后这次我们把上一节,写入的person ...

  6. C++基础部分_C++文件操作_文件的读取操作---C++语言工作笔记077

    上一篇文章,我们实现了文件的写入操作,现在,我们来看文件的,读取操作. 可以看到这个文件是,前面我们写入的文件 我们开始写代码,读取文件内容.按照上面的流程来读取文件 首先我们引入fstream这个, ...

  7. C++_基础部分_C++文件操作_文件的写入操作---C++语言工作笔记076

    从现在开始我们就来接触一个新的c++中的内容,用c++来操作文件,这里包含了 文件的读操作,写操作...等等 然后我们再来,去看看c++中,如何对文件进行操作. 上面,是介绍了一些文件操作的,

  8. hdfs java api 读写文件操作_第十讲:通过JavaAPI对HDFS读写

    上一讲我们通过java api 接口对虚拟机里面的hdfs进行了新建文件夹.下面我们要进行其他的操作: 注,以下的所有内容都是在第九讲的代码的基础上的. 1.删除hdfs上面的文件夹 2.删除dhfs ...

  9. Python之文件操作_读取_编码_os模块

    目录 前言 一.文件基本操作 1.什么是文件 2.操作文件的步骤 3.文件的路径 4.open函数操作权限总结 5.文件读取 6.with-open-as 7.文件定位读取 8.文件编码 二.OS模块 ...

最新文章

  1. spi时序图怎么分析,怎么看懂spi时序图
  2. php ci 表单校验,表单验证 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档
  3. Web公路,新手上路!NO.2 [ 基础标签(一)]
  4. Redis 基本数据类型 :String、Hash、List、Set、ZSet
  5. C# Web实时消息后台服务器推送技术-GoEasy
  6. java代码查询索引文件实例_关于使用pdfbox的对PDF文件通过lucene生成索引文件IndexPDFFiles类代码示例...
  7. 【3】测试用例设计-因果图
  8. 监听自身卸载,弹出用户反馈调查
  9. 关于:Google Chrome 官方下载地址
  10. cloc统计代码行数
  11. python爬虫——彼岸图网
  12. 网关gate启动报错Parameter 0 of method modifyRequestBodyGatewayFilterFactory in org.springframework.cloud.g
  13. 转录组测序之各类样品如何取样保存
  14. 手把手教你用tensorflow2.3训练自己的分类数据集
  15. centos7mysql错误代码7_CentOS7下安装mysql5.7及mysql登录错误
  16. 游戏地图主要功能实现
  17. 2020鸿蒙系统pc版,华为将在2020年发布鸿蒙操作系统2.0版,应用于创新国产PC电脑...
  18. Ubuntu 16.04 安装好之后需要做的15件事
  19. Vue面试题你学会多少
  20. Monkey King-左偏树

热门文章

  1. Redux Vuex
  2. DeepMind发布Sonnet 帮你用TensorFlow快速搭建神经网络
  3. 腾讯AI Lab的研究方向
  4. 对象间的联动——观察者模式
  5. Mysql的几个字符串函数【concat、concat_ws、group_concat】
  6. Scala _01介绍安装使用
  7. 【广义找零钱问题】 贪心算法求解进制转换问题
  8. leetcode 58. 最后一个单词的长度(C语言)
  9. java安全编码指南之:锁的双重检测
  10. CentOS 编译Hadoop 2.6 32位