引言:没想到2022年还有很多工业软件公司依然使用MFC,微软也一直在更新MFC的库,这次使用MFC封装的CFileDialog类,写一个获得选定文件路径,名称,扩展名的程序。

个人技术博客(文章整理+源码): https://zobolblog.github.io/LearnWinAPI/

最终效果:

1.CFileDialog的使用

CFileDialog是MFC对windows api的FileDialog的简单封装,增加了一些接口,他的构造函数只有一个:

explicit 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);

第1个参数bOpenFileDialog为TRUE则表示打开文件对话框,为FALSE则表示保存文件对话框。它也是我们必须填写的,其他的都有默认值。

第2个参数lpszFileName指定默认的文件扩展名。就是txt,exe这类。

第3个参数lpszFileName指定默认的文件名。一般是保存文件框用的。

第4个参数dwFlags 指明一些特定风格,比如多选对话框,可读文件,隐藏文件不显示。

第5个参数lpszFilter是过滤器意思,写法国内的博客很乱,但其实微软官方给了一种很易读的写法。

static TCHAR BASED_CODE szFilter[] = _T("Chart Files (*.xlc)|*.xlc|")

_T("Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|")

_T("*.xlc; *.xls|All Files (*.*)|*.*||");

第6个参数pParentWnd指定父窗口的指针。

第7个参数dwSize是指OPENFILENAME结构的大小,这此值取决于操作系统版本。MFC使用此参数确定要创建的适当类型的对话框。默认大小0表示MFC代码将根据运行程序的操作系统版本确定要使用的正确对话框大小。

第8个参数bVistaStyle,默认都是true。它实际上是因为微软在vs2008后,设计了新的对话框风格。所以就用一个bool类型,表示新旧风格。(微软就不考虑用宏或者枚举,万一以后又出一个第3风格版本呢。。)

2.DoModal()函数

  就像QT里面的show函数一样,虽然CFileDialog dlg在内存中创造了一个对话框对象,但是显示出来给人看,还需要专门的函数DoModal()。

  “Call this function to display the Windows common file dialog box and allow the user to browse files and directories and enter a filename.”调用此函数可显示Windows公用文件对话框,允许用户浏览文件和目录并输入文件名。

3.DoModal()函数的返回值IDOK和IDCANCEL

  在窗口的生命周期结束后,domodal还会返回一个值,告诉我们一些情况。但是MFC的设计在这里非常的烦人,单纯的IDCANCEL只能告诉我们出现了问题。至于是什么问题还需要调用一个CommDlgExtendedError函数才可以知道。(至于这里为什么不设计成返回一个结构体,直接包含错误信息,估计是90年代开发MFC的时候,计算机性能不够?)

源码:

    CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("All FILE|*.*|"),NULL,NULL,1);

    if (dlg.DoModal() != IDOK)
{
CommDlgExtendedError();
}
else {
CString filePathName = dlg.GetPathName();
CString fileName = dlg.GetFileName(); // return only filename
CString fileExt = dlg.GetFileExt(); // return only ext
CString fileTitle = dlg.GetFileTitle(); // return file title
}

效果:

4.使用CFileDialog打开文件对话框,获得文件路径 -windows编程的更多相关文章

  1. 3.C++逐行读取txt文件数据,利用getline -windows编程

      引言:今天学会了getline的用法,顺手编写一个逐行读取txt文件的程序.关于getline的用法可以看我之前的博客:2.C++标准库函数:getline函数 定界流输入截取函数 -zobol的 ...

  2. c# 打开、保存文件对话框 和 文件夹选择对话框

    1. OpenFileDialog openImageDialog = new OpenFileDialog(); openImageDialog.Filter = "Image Files ...

  3. 【QT】打开文件对话框,选择路径下文件

    0.头文件中加入 public: QString fileName; public slots: void showImage(); 1.添加两个头文件 #include<qfiledialog ...

  4. python利用文件对话框获取文件路径

    一.单文件 python3: import tkinter as tk from tkinter import filedialog root = tk.Tk() root.withdraw() fi ...

  5. MFC 文件对话框

    文件对话框的分类 文件对话框分为打开文件对话框和保存文件对话框,相信大家在Windows系统中经常见到这两种文件对话框.例如,很多编辑软件像记事本等都有"打开"选项,选择" ...

  6. MFC编程入门之十七(对话框:文件对话框)

    上一讲介绍的是消息对话框,本节讲解文件对话框.文件对话框也是很常用的一类对话框. 文件对话框的分类 文件对话框分为打开文件对话框和保存文件对话框,相信大家在Windows系统中经常见到这两种文件对话框 ...

  7. VS2010/MFC对话框:文件对话框

    文件对话框 上一讲介绍的是消息对话框,本节讲解文件对话框.文件对话框也是很常用的一类对话框. 文件对话框的分类       文件对话框分为打开文件对话框和保存文件对话框,相信大家在Windows系统中 ...

  8. VS2010/MFC编程入门之十七(对话框:文件对话框)

    上一讲鸡啄米介绍的是消息对话框,本节讲解文件对话框.文件对话框也是很常用的一类对话框. 文件对话框的分类       文件对话框分为打开文件对话框和保存文件对话框,相信大家在Windows系统中经常见 ...

  9. QT学习 之 对话框 (四) 字体对话框、消息对话框、文件对话框、进程对话框(超详细中文注释)

    QMessageBox类: 含有Question消息框.Information消息框.Warning消息框和Critical消息框等 通常有两种方式可以来创建标准消息对话框: 一种是采用“基于属性”的 ...

随机推荐

  1. 第一阶段:Java基础之异常和处理

    文章目录 Java中异常处理机制的简单和应用 一.异常的体系结构&分类 二.问题扩展 三.应用场景 Java中异常处理机制的简单和应用 异常也是一种对象,Java中有很多异常类,并且定义了基类 ...

  2. Struts2-向值栈中存放数据

    1.第一种 获取值栈对象,调用值栈对象里面的set方法(该方法添加的是一个Map集合) //第一种方式,使用值栈对象获取对象里面的set方法 //1.获取值栈对象 ActionContext cont ...

  3. linux下elf二进制文件怎么回事(ls,vmstat等命令)

    这个实验有两个目的: 1.linux的可执行命令例如:ls .cd等都是二进制elf格式文件等,后面的逻辑是什么,我们怎么窥探底层内容. 2.ELF可执行文件默认从地址0x080480000开始分配 ...

  4. 时间篇之centos6下修复的ntp操作(ntpd和ntpdate两个服务区别)

    系统采样,本采样和命令都是在centos6.4的系统中进行 主要比较centos7和centos6之间的差异,因为大部分都开始采用centos7但是有些老系统还采用centos6,这样我们就需要熟悉c ...

  5. 《手把手教你》系列基础篇(九十)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-中篇(详解教程)

    1.简介 上一篇宏哥介绍是如何使用logback将日志输出到控制台中,但是如果需要发给相关人需要你拷贝出来,有时候由于控制台窗口的限制,有部分日志将会无法查看,因此我们还是需要将日志输出到文件中,因此 ...

  6. 基于全志A40i开发板——Linux-RT内核应用开发教程(1)

    目录 1 Linux-RT内核简介 3 2 Linux系统实时性测试 3 3 rt_gpio_ctrl案例 10 4 rt_input案例 15 本文为Linux-RT内核应用开发教程的第一章节--L ...

  7. Fastjson tomcat-dhcp链

    Fastjson tomcat-dbcp链 这条链可直接回显,可以解决fastjson在内网的情况,因为很多实战的时候,fastjson的应用部署在内网,只映射一个端口出来,导致前面学习的jdbcRo ...

  8. 树莓派开发笔记(十二):入手研华ADVANTECH工控树莓派UNO-220套件(一):介绍和运行系统

    前言   树莓派也可以做商业应用,工业控制,其稳定性和可靠性已经得到了验证,故而工业控制,一些停车场等场景也有采用树莓派作为主控的,本片介绍了研华ADVANTECH的树莓派套件组UNO-220-P4N ...

  9. HCNP Routing&Switching之端口隔离

    前文我们了解了组播路由协议稀疏模式中的RP相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16154347.html:今天我们来聊一聊二层交换机中有关v ...

  10. cnvd进阶学习

    说明 cnvd相对在src漏洞平台中还是比较具备含金量的.今天证书的申请标准就不说了,总归网上都有,主要是想分享下怎么去挖漏洞. 咱们这里只讲通用型漏洞,事件型的暂时我也没挖到.挖通用型漏洞主要方法就 ...