引言:没想到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. OllyDbg---call和ret指令

    call和ret call指令 cal指令是转移到指定的子程序处,后面紧跟的操作数就是给定的地址. 例如,call 401362表示转移到地址401362处,调用401362处的子程序,当子程序调用完 ...

  2. FreeRTOS+CubeMX编程实践

    一.关于FreeRTOS 1.什么是FreeRTOS? FreeRTOS是一个轻量级的操作系统.FreeRTOS提供的功能包括:任务管理.时间管理.信号量.消息队列.内存管理.记录功能等,可基本满足较 ...

  3. pip:带你认识一个 Python 开发工作流程中的重要工具

    摘要:许多Python项目使用pip包管理器来管理它们的依赖项.它包含在Python安装程序中,是Python中依赖项管理的重要工具. 本文分享自华为云社区<使用Python的pip管理项目的依 ...

  4. 论文翻译:2021_Towards model compression for deep learning based speech enhancement

    论文地址:面向基于深度学习的语音增强模型压缩 论文代码:没开源,鼓励大家去向作者要呀,作者是中国人,在语音增强领域 深耕多年 引用格式:Tan K, Wang D L. Towards model c ...

  5. 基于 POI 封装 ExcelUtil 精简的 Excel 导入导出

    注 本文是使用 org.apache.poi 进行一次简单的封装,适用于大部分 excel 导入导出功能.过程中可能会用到反射,如若有对于性能有极致强迫症的同学,看看就好. 序 由于 poi 本身只是 ...

  6. UML的三项基础

    UML的定义 UML语义:描述基于UML的精确元模型定义. UML表示法:定义UML符号和文本语法提供标准. 五类模型图 用例视图:用例图 逻辑视图:类图.对象图.包图(我把包放在一起的图) 静态视图 ...

  7. 【导包】使用Sklearn构建Logistic回归分类器

    官方英文文档地址:http://scikit-learn.org/dev/modules/generated/sklearn.linear_model.LogisticRegression.html# ...

  8. .NET Core 企业微信消息推送

    接口定义 应用支持推送文本.图片.视频.文件.图文等类型.请求方式:POST(HTTPS)请求地址: https://qyapi.weixin.qq.com/cgi-bin/message/send? ...

  9. 函数式接口和@FunctionalInterface

    函数式接口的特点 接口有且仅有一个抽象方法 允许定义静态方法和默认方法(这两个都不是抽象方法) 允许java.lang.Object中的public方法(因为任何一个函数式接口的实现,默认都继承了Ob ...

  10. Python技法:实用运维脚本编写(进程/文件/目录操作)

    Python在很大程度上可以对shell脚本进行替代.笔者一般单行命令用shell,复杂点的多行操作就直接用Python了.这篇文章就归纳一下Python的一些实用脚本操作. 1. 执行外部程序或命令 ...