用CFileDialog选择了一个文件后,使用FILE::fopen打开文件错误,使用 的是相对地址,和王工调试了半天,怎么跟踪也没发现错误,原来如此。。。。。。。。。

CFileDialog文件选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型如下:

CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );参数意义如下:

  • bOpenFileDialog 为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框。
  • lpszDefExt 指定默认的文件扩展名。
  • lpszFileName 指定默认的文件名。
  • dwFlags 指明一些特定风格。
  • lpszFilter 是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。参数格式如:

    "Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。

  • pParentWnd 为父窗口指针。

创建文件对话框可以使用DoModal(),在返回后可以利用下面的函数得到用户选择:

  • CString CFileDialog::GetPathName( ) 得到完整的文件名,包括目录名和扩展名如:c:\test\test1.txt
  • CString CFileDialog::GetFileName( ) 得到完整的文件名,包括扩展名如:test1.txt
  • CString CFileDialog::GetExtName( ) 得到完整的文件扩展名,如:txt
  • CString CFileDialog::GetFileTitle ( ) 得到完整的文件名,不包括目录名和扩展名如:test1
  • POSITION CFileDialog::GetStartPosition( ) 对于选择了多个文件的情况得到第一个文件位置。
  • CString CFileDialog::GetNextPathName( POSITION& pos ) 对于选择了多个文件的情况得到下一个文件位置,并同时返回当前文件名。但必须已经调用过POSITION CFileDialog::GetStartPosition( )来得到最初的POSITION变量。

[一些小心得]

例:

CFileDialog GetFile(TRUE,NULL,NULL,OFN_FILEMUSTEXIST,"Microsoft Excel(*.xls)|*.xls|All Files(*.*)|*.*");

CFileDialog GetFile(打开文件对话框(TRUE),扩展名(NULL),文件名(NULL),风格-文件必须存在(OFN_FILEMUSTEXIST),查看文件类型-EXCEL文件,所有文件(Microsoft Excel(*.xls)|*.xls|All Files(*.*)|*.*);

风格的宏定义

#define OFN_READONLY                 0x00000001

#define OFN_OVERWRITEPROMPT          0x00000002

#define OFN_HIDEREADONLY             0x00000004

#define OFN_NOCHANGEDIR              0x00000008

#define OFN_SHOWHELP                 0x00000010

#define OFN_ENABLEHOOK               0x00000020

#define OFN_ENABLETEMPLATE           0x00000040

#define OFN_ENABLETEMPLATEHANDLE     0x00000080

#define OFN_NOVALIDATE               0x00000100

#define OFN_ALLOWMULTISELECT         0x00000200

#define OFN_EXTENSIONDIFFERENT       0x00000400

#define OFN_PATHMUSTEXIST            0x00000800

#define OFN_FILEMUSTEXIST            0x00001000

#define OFN_CREATEPROMPT             0x00002000

#define OFN_SHAREAWARE               0x00004000

#define OFN_NOREADONLYRETURN         0x00008000

#define OFN_NOTESTFILECREATE         0x00010000

#define OFN_NONETWORKBUTTON          0x00020000

#define OFN_NOLONGNAMES              0x00040000     // force no long names for 4.x modules

#if(WINVER >= 0x0400)

#define OFN_EXPLORER                 0x00080000     // new look commdlg

#define OFN_NODEREFERENCELINKS       0x00100000

#define OFN_LONGNAMES                0x00200000     // force long names for 3.x modules

#define OFN_ENABLEINCLUDENOTIFY      0x00400000     // send include message to callback

#define OFN_ENABLESIZING             0x00800000

#endif

#if (_WIN32_WINNT >= 0x0500)

#define OFN_DONTADDTORECENT          0x02000000

#define OFN_FORCESHOWHIDDEN          0x10000000    // Show All files including System and hidden files

#endif // (_WIN32_WINNT >= 0x0500)

需要注意的是,用了CFileDialog之后,会把程序的当前路径设置成选中文件的路径;

所以,如果程序里有用到IO访问或者数据库访问之类的本地操作时,需要注意你的当前路径用相对路径的话就不是原来你的程序路径了,切记!

CString GetFilePath()
{   

CString m_FilePath;

GetModuleFileName(NULL,m_FilePath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);

m_FilePath.ReleaseBuffer();

int m_iPosIndex;

m_iPosIndex = m_FilePath.ReverseFind('\\');

m_FilePath = m_FilePath.Left(m_iPosIndex);

return m_FilePath;

}

MFC中CFileDialog用法的更多相关文章

  1. MFC中CFileDialog使用方法

    用CFileDialog选择了一个文件后,使用FILE::fopen打开文件错误,使用 的是相对地址.和王工调试了半天,怎么跟踪也没发现错误,原来如此. .... .. . . CFileDialog ...

  2. MFC中CString.Format的用法

    http://www.cnblogs.com/kongtiao/archive/2012/06/13/2548033.html 在MFC程序中,使用CString来处理字符串是一个很不错的选择.CSt ...

  3. MFC中文件对话框类CFileDialog详解及文件过滤器说明

    当前位置 : 首页 » 文章分类 :  开发  »  MFC中文件对话框类CFileDialog详解及文件过滤器说明 上一篇 利用OpenCV从摄像头获得图像的坐标原点是在左下角 下一篇 Word中为 ...

  4. MFC中树控件CTreeCtrl的用法

    树形控件可以用于树形的结构,其中有一个根接点(Root)然后下面有许多子结点,而每个子结点上有允许有一个或多个或没有子结点.MFC中使用CTreeCtrl类来封装树形控件的各种操作.通过调用 BOOL ...

  5. 【转】MFC中调试过程中查看输出信息 -- 不错

    原文网址:http://blog.sina.com.cn/s/blog_4e24d9c501014o39.html 笔记&&方便查阅. ~~~~~~~~~~~~~~~~~~~~~~~~ ...

  6. MFC中线程相关知识

    MFC中把线程分为两种类型,UI线程和工作者线程. MFC中启动一个线程的最好方法是调用AfxBeginThread,有两个版本,一个用于启动Ui线程,另外一个用于启动工作者线程.在MFC程序中,只有 ...

  7. MFC中的CString类使用方法指南

    MFC中的CString类使用方法指南 原文出处:codeproject:CString Management [禾路:这是一篇比较老的资料了,但是对于MFC的程序设计很有帮助.我们在MFC中使用字符 ...

  8. MFC中的一般经验之谈3

    Window消息可以分为三类:(1)标准Window消息(CWnd子类处理),(2)控制通知消息(CWnd子类处理),(3)命令消息(应用中的5类都可以).所有派生自CCmdObjec对象的类都可以处 ...

  9. MFC中的乱起八糟----字符编码:LPTSTR,LPCTSTR, TCHAR等

    注意,编写有 Unicode 意识的代码总是一件好事,比如: CString graycat = CString(_T("Gray")) + _T("Cat") ...

随机推荐

  1. 01 Java 搭建环境

    刚接触 Java 语言,为了方便以后查阅,将学习过程中遇到的知识点记录下来,作为学习笔记使用.在学习过程中 JDK 使用版本为 1.8.0_73,操作系统为 macOS Sierra 10.12.6. ...

  2. ABP官方文档翻译 6.2.1 ASP.NET Core集成

    ASP.NET Core 介绍 迁移到ASP.NET Core? 启动模板 配置 启动类 模块配置 控制器 应用服务作为控制器 过滤器 授权过滤器 审计Action过滤器 校验过滤器 工作单元Acti ...

  3. Python之Suds库调用WCF实现复杂参数序列化

    今年主要做自动化测技术支持工作,最近一直在做接口自动化这块,前些天在研究将web页面模拟http进行接口自动化,这周杭州那边想测试WCF服务,所以这两天一直在探索.遇到的第一个问题就是服务参数传参序列 ...

  4. SSD写入放大问题[转]

    原文地址:http://blog.csdn.net/cywosp/article/details/29812433 之前在SSD(Solid State Drive)上设计并实现缓存系统用于存储数据块 ...

  5. 序列化与transient

    满足下面四个条件中的一个的类就不应该被序列化:  1.一个类与本地代码(native code)有紧密的关系,如java.util.zip.Deflater,这个类中很多都是native的. 2.对象 ...

  6. 二、urllib进阶

    Handler处理器 和 自定义Opener opener是 urllib.request.OpenerDirector 的实例,我们之前一直都在使用的urlopen,它是一个特殊的opener(也就 ...

  7. php+redis 学习 一 连接

    <?php header('content-type:text/html;chaeset=utf-8'); $redis = new Redis(); $redis->connect('1 ...

  8. 随机手机号和身份证号码(python)

    在使用selenium2 python自动化过程中,用户添加的时候程序设置的手机号和身份证号码是唯一的,这方面python代码可以实现,以下是调试成功,可以实现的. 具体代码如下 身份证需要下载dis ...

  9. 关于Apache配置虚拟主机后在局域网中让其他电脑访问

    #-----------adxssp------------# NameVirtualHost *:80 <VirtualHost *:80> ServerName www.b.com D ...

  10. Linux 上 C 程序的内存布局

    在仔细研究这个问题之前,我认为 C 程序在内存中只有代码段,堆和栈三部分构成.前几天面试被问到了这个问题,才发现自己的印象是不完全的. 在本文中通过解析析一个 C 程序中变量和函数的地址来分析 C 程 ...