MFC单文档打开文件
用VC++MFC做文本编辑器(单文档模式)

用VC++MFC做文本编辑器(单文档模式)原来做过一个用对话框实现的文本编辑器,其实用MFC模板里面的单文档模板也可以做,甚至更加方便,适合入门级的爱好者试试,现介绍方法如下:1,首先新建一个工程,选择MFC AppWizard(exe),定名字为:textview_1,程序类型选择单个文档,其他均默认完成。
2,在系统自动生成的CTextview_1Doc类里面增加一个控件,用于文本文档的暂时存放:class CTextview_1Doc : public CDocument{......public:CStringArray m_strContent;}然后在CTextview_1Doc类的Serialize函数里面增加打开、保存文本文件的程序:void CTextview_1Doc::Serialize(CArchive& ar){CString str;if (ar.IsStoring()){// TODO: add storing code hereint nLines = (int)m_strContent.GetSize();for ( int i=0; i<nLines; i++ ){str = m_strContent.GetAt( i );ar.WriteString( str ); // 将字符串集合类对象中文本保存到硬盘}}else{// TODO: add loading code herewhile ( ar.ReadString( str ) ){m_strContent.Add( str ); // 将行文本添加到字符串集合类对象中}}}然后鼠标在CTextview_1Doc 上点击右键,在弹出菜单里面选择:Add Virtual Function,在弹出的窗口中选中DeleteContents,点击“添加和编辑”按钮。
在生成的程序中添加以下代码:void CTextview_1Doc::DeleteContents(){// TODO: Add your specialized code here and/or call the base classm_strContent.RemoveAll(); // 清除集合类对象中的内容CDocument::DeleteContents();}3,在系统自动生成的CTextview_1View类里面增加一个编辑器的控件指针成员,用于在界面中生成文本编辑器:class CTextview_1View : public CView{......public:CEdit* m_ctrlEdit;}该指针成员在类建立时要设置初始化值为NULL,否则运行起来就会出错,如下:CTextview_1View::CTextview_1View(): m_ctrlEdit(NULL) //添加这一行初始化代码{// TODO: add construction code here}用第2点介绍的类似步骤,为CTextview_1View类重写其OnInitialUpdate函数,添加内容如下:void CTextview_1View::OnInitialUpdate(){CView::OnInitialUpdate();// TODO: Add your specialized code here and/or call the base classCRect rcClient;GetClientRect( rcClient ); // 获取当前视图的客户区大小// if ( m_ctrlEdit ) delete m_ctrlEdit;m_ctrlEdit = new CEdit();m_ctrlEdit->Create( ES_MULTILINE | WS_CHILD | WS_VISIBLE| WS_HSCROLL | ES_AUTOHSCROLL // 自动水平滚动| WS_VSCROLL | ES_AUTOVSCROLL , // 自动垂直滚动rcClient, this, 201); // 创建多行编辑控件CTextview_1Doc* pDoc = GetDocument(); // 获取与视图相关联的文档指针// 以下是将文档中的m_strContent内容全部赋给strCString str;int nLines = (int)pDoc->m_strContent.GetSize();for ( int i=0; i<nLines; i++ ){str = str + pDoc->m_strContent.GetAt( i );str = str + "\r\n"; // 换行}m_ctrlEdit->SetTabStops( 16 ); // 设置Tab符大小m_ctrlEdit->SetWindowText( str ); // 将文档内容传给控件}4,现在运行一下,文本编辑器就做好了。
MFC和C++关于文件的读写操作以及文件的打开和保存

MFC和C++关于文件的读写操作以及文件的打开和保存通过近来的学习,总结一下关于C++开发中文件的读写操作以及文件的打开和保存的方法。
一、文件的读写操作:(1)C语言对文件的读写操作在C语言中,对文件的读写操作是用FILE结构体和常用的对文件操作的函数实现的,下面总结一下C语言中对文件操作的常用函数:fopen() 打开以文件名指定的文件fwrite() 写文件fread() 读文件fseek() 移动文件的指针到新的位置通过该函数的参数设定的偏移量和初始位置rewind() 移动文件的指针到文件流的开始位置,在通常情况下可用fseek()实现相同的功能,但二者有区别ftell() 获得当前文件指针的位置,常用该函数获得文件的文件流的长度fflush() 刷新缓冲区中的内容,当文件写入时直接将文件流的内容从缓冲区写入磁盘,当读取文件时直接将磁盘文件写入缓冲区,而不必等程序运行结束或关闭程序。
fclose() 关闭文件memset() 在一段内存块中填充某个给定的值示例代码如下:/*********************************************************** C语言实现文件写操作 ************************************************************/FILE *pFile=fopen("CLanguage.txt","w");fwrite("CLanguage",1,strlen("CLanguage"),pFile);//fseek(pFile,0,SEEK_SET);//fwrite("实现文件写操作",1,strlen("实现文件写操作"),pFile);fclose(pFile);/*********************************************************** C语言实现文件读操作 ************************************************************/FILE *pFile=fopen("CLanguage.txt","r");//char ch[100];//memset(ch,0,100);//fread(ch,1,100,pFile);//MessageBox(ch);char* pBuf;int length;fseek(pFile,0,SEEK_END);length=ftell(pFile);pBuf=new char[length+1];//fseek(pFile,0,SEEK_SET);rewind(pFile);fread(pBuf,1,length,pFile);pBuf[length]=0;MessageBox(pBuf);fclose(pFile);注意:在用C语言实现文件的读操作时,要注意文件的指针位置。
MFC文件读取

MFC文件读取MFC文件读取技术(1)计算机是如何管理自身所存放着大量的信息的呢?windows 的磁盘管理程序为我们提供了一套严密而又高效的信息组织开工--- 硬盘上的信息是以文件的形式被管理的。
面向存储的文件技术什么是文件?计算机中,一篇文章、一幅图画、一个程序、一首歌曲等都是以文件的形式存储在磁盘上的,每个文件都有一个文件名。
计算机就是对文件按名存取的。
文件名的格式如下:主文件名 . 扩展名文件名由主文件名和扩展名两部分组成,中间用小圆点隔开,其中扩展名可以省略。
而扩展名是用来区分文件类型的。
Windows 为了区分文件的类型,一些软件系统会自动给文件加上“ .wps ”扩展名;画图程序画的图像文件一般为“ .bmp ”等。
在windows 中,主文件名可以由英文字符、汉字、数字以及一些符号等组成,但不能使用+<>*?\ 等符号。
什么是文件夹?在计算机中存放着数以万计的文件,为了便于管理这些文件,就像我们把文件分类放到不同的抽屉中便于查阅一样,在计算机中也有像抽屉的东西,它就是文件夹。
文件夹也要有一个名字,取名的原则与文件的取名类似,只是不用再区分文件夹的类型,当文件夹多了以后,还可以把某些文件夹归到一个大文件夹中去。
久而久之,就构成了计算机中庞大的磁盘文件结构。
为什么要在程序中使用文件?通常,程序中的数据在程序运行结束后,就会从内存中清除,再次运行程序时不会自动出现。
在编制程序的过程中不可避免地会遇到将某些数据永久保存的问题,当关闭程序后,依然可以使用这些数据,这时就需要进行文件操作。
文件类型Visual c++ 处理的文件通常分为两种:文本文件:只可被任意文本编辑器读取ASCII 文本。
二进制文件:指对包含任意格式或无格式数据的文件的统称。
这里只介绍文本文件的读写,INI 文件也属于文本文件的范畴,且INI 文件的结构和用途与普通的文本文件不同,所以会单独介绍。
打开文件的MFC对话框应用程序

打开文件操作步骤:1.新建MFC AppWizard [exe] 基本对话框,项目名mfc2.删除对话框模板中原有的“确定”按钮和内容为“TODO: 在这里设置对话控制。
”的StaticText控件。
添加一个按钮(BUTTON),鼠标右键单击该控件,在弹出的下拉菜单中选“属性”,打开属性对话框,将控件ID改为“IDOK”;添加一个静态文本(STATIC),将控件ID改为“IDC_MSG”;3.添加一个编辑框控件,调整适当大小,鼠标右键单击该控件边框,在弹出的下拉菜单中打开属性对话框。
将编辑框控件ID改为“IDC_FILE”。
4. 添加成员变量单击View(查看)>ClassWizard(建立类向导)菜单进入ClassWizard,打开Member Variables选项卡,选中编辑框控件IDC_FILE,单击“Add Variable”按钮,设置对应的变量m_file;选中静态文本控件IDC_MSG,单击“Add Variable”按钮,设置对应的变量m_msg;5. 添加消息映射在ClassWizard对话框中打开Messages Maps选项卡,在Object Ids中选择IDOK,在Messages中单击BN_CLIKED,然后单击按钮“Add Function”,在弹出对话框中单击OK按钮:在Member functions中出现消息映射成员函数OnOK。
6. 添加代码在ClassWizard对话框中的Messages Maps选项卡的Member functions选中OnOK,然后单击Edit Code按钮在OnOK函数体中添加代码:char *fname;ifstream infile;UpdateData(TRUE);fname=(LPSTR)(LPCTSTR)m_file;infile.open(fname,ios::in);float x,s=0;int i=0;if(!infile)m_msg="文件不存在!";else{while(!infile.eof()){infile>>x; //读取数据,每行一个数s+=x;i++;}m_msg.Format("%f",s/i); //输出平均值}UpdateData(FALSE);7. 在项目文件夹里用记事本建立一个文本文件,如a.txt,在文件里输入若干数据(实数),每行一个数,保存后关闭该文件。
mfc打开文件夹

MFC编写打开文件夹对话框类VC 2008-11-28 19:30:10 阅读79 评论0 字号:大中小订阅DirDialog.h//////////////////////////////////////////////////////////////// ////////// DirDialog.h: interface for the CDirDialog class.////////////////////////////////////////////////////////////////// //////#if !defined(AFX_DIRDIALOG_H__62FFAC92_1DEE_11D1_B87A_0060979CDF 6D__INCLUDED_)#defineAFX_DIRDIALOG_H__62FFAC92_1DEE_11D1_B87A_0060979CDF6D__INCLUDED_#if _MSC_VER >= 1000#pragma once#endif // _MSC_VER >= 1000class CDirDialog{public:CDirDialog();virtual ~CDirDialog();int DoBrowse(CWnd *pwndParent);CString m_strPath;CString m_strInitDir;CString m_strSelDir;CString m_strWindowTitle;int m_iImageIndex;};#endif// !defined(AFX_DIRDIALOG_H__62FFAC92_1DEE_11D1_B87A_0060979CDF6D__I NCLUDED_)DirDialog.cpp//////////////////////////////////////////////////////////////// ///////////// DirDialog.cpp: implementation of the CDirDialog class.//////////////////////////////////////////////////////////////// //////#include "stdafx.h"#include "DirDialog.h"#include "resource.h"// local includes for implementation#include <shlobj.h>#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif// Callback function called by SHBrowseForFolder's browse control// after initialization and when selection changesstatic int __stdcall BrowseCtrlCallback(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData){CDirDialog* pDirDialogObj = (CDirDialog*)lpData;if (uMsg == BFFM_INITIALIZED ){if( ! pDirDialogObj->m_strSelDir.IsEmpty() )::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)(LPCTSTR)(pDirDialogObj->m_strSelDir));}::SendMessage(hwnd, BFFM_ENABLEOK, 0, TRUE);return 0;}//////////////////////////////////////////////////////////////// //////// Construction/Destruction//////////////////////////////////////////////////////////////// //////CDirDialog::CDirDialog(){m_strWindowTitle = _T("选择目标文件夹");}CDirDialog::~CDirDialog(){}BOOL CDirDialog::DoBrowse(CWnd *pwndParent/*=NULL*/){if( ! m_strSelDir.IsEmpty() ){m_strSelDir.TrimRight();if( m_strSelDir.Right(1) == "\\" || m_strSelDir.Right(1) == "//" )m_strSelDir =m_strSelDir.Left(m_strSelDir.GetLength() - 1);}LPMALLOC pMalloc;if (SHGetMalloc (&pMalloc)!= NOERROR)return FALSE;BROWSEINFO bInfo;LPITEMIDLIST pidl;ZeroMemory ( (PVOID) &bInfo,sizeof (BROWSEINFO));if (!m_strInitDir.IsEmpty ()){OLECHAR olePath[MAX_PATH];ULONG chEaten;ULONG dwAttributes;HRESULT hr;LPSHELLFOLDER pDesktopFolder;// Get a pointer to the Desktop's IShellFolder interface.if (SUCCEEDED(SHGetDesktopFolder(&pDesktopFolder))){// IShellFolder::ParseDisplayName requires the file name be in Unicode.MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,m_strInitDir.GetBuffer(MAX_PATH), -1,olePath, MAX_PATH);m_strInitDir.ReleaseBuffer (-1);// Convert the path to an ITEMIDLIST.hr =pDesktopFolder->ParseDisplayName(NULL,NULL,olePath,&chEaten,&pidl,&d wAttributes);if (FAILED(hr)){pMalloc ->Free (pidl);pMalloc ->Release ();return FALSE;}bInfo.pidlRoot = pidl;}}bInfo.hwndOwner = pwndParent == NULL ? NULL :pwndParent->GetSafeHwnd();bInfo.pszDisplayName = m_strPath.GetBuffer (MAX_PATH);bInfo.lpszTitle = m_strWindowTitle;bInfo.ulFlags = BIF_RETURNFSANCESTORS| BIF_RETURNONLYFSDIRS| (FALSE/*m_bStatus*/ ? BIF_STATUSTEXT : 0);bInfo.lpfn = BrowseCtrlCallback; // address of callback functionbInfo.lParam = (LPARAM)this; // pass address of object to callback functionif ((pidl = ::SHBrowseForFolder(&bInfo)) == NULL){return FALSE;}m_strPath.ReleaseBuffer();m_iImageIndex = bInfo.iImage;if (::SHGetPathFromIDList(pidl,m_strPath.GetBuffer(MAX_PATH)) == FALSE){pMalloc ->Free(pidl);pMalloc ->Release();return FALSE;}m_strPath.ReleaseBuffer();pMalloc ->Free(pidl);pMalloc ->Release();return TRUE;}调用方法:1、将该类的头文件给包含进来,即#include "DirDialog.h"CDirDialog dlg;if (dlg.DoBrowse(this) == IDOK){//set target pathm_targetpath = dlg.m_strPath;UpdateData(FALSE);}2、选文件夹:CString ShowSelectDirectoryDlg(const CString & strDlgTitle) {char szDir[MAX_PATH];BROWSEINFO bi;ITEMIDLIST *pidl;bi.hwndOwner = this->m_hWnd;bi.pidlRoot = NULL;bi.pszDisplayName = szDir;bi.lpszTitle = strDlgTitle;bi.ulFlags = BIF_RETURNONLYFSDIRS;bi.lpfn = NULL;bi.lParam = 0;bi.iImage = 0;pidl = SHBrowseForFolder(&bi);if(pidl == NULL){return _T("");}if(!SHGetPathFromIDList(pidl, szDir)) {return _T("");}return CString(szDir);}。
MFC多文档和单文档视结构

MFC多文档和单文档视结构★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★//这一页的代码最重要了,呵呵……什么都在这里面呢;单文档新建:CWinApp_________docManager->docSingleTemplate 的OpenDocumentFile函数参数为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。
多文档新建:CWinApp_________docManager->docMultTemplate的OpenDocumentFile函数参数为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。
单文档打开:CWinApp_________docManager中经过一个打开对话框传递参数,中途还调用了APP的OpenDocumentFile,当然如果我们的APP重载了这个函数也要调用我们的但是我们的函数一定别忘记最后返回是调用父类的此函数___________docSingleTemplate的OpenDocumentFile函数参数不为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。
多文档打开:CWinApp_________docManager中经过一个打开对话框传递参数,中途还调用了APP的OpenDocumentFile,当然如果我们的APP重载了这个函数也要调用我们的但是我们的函数一定别忘记最后返回是调用父类的此函数___________docMultTemplate的OpenDocumentFile函数参数不为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。
MFC文件读写操作

MFC⽂件读写操作1、相关类 CFile类 -封装了⽂件句柄以及操作⽂件的API函数 CFileFind类 -封装了⽂件搜索功能2、CFile类的使⽤ 2.1⽂件读写 1)创建或者打开⽂件 CFile::Open virtual BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL ); lpszFileName:指定⽂件的名称; nOpenFlags:指定⽂件共享和访问的⽅式,包括: CFile::modeCreate --创建新⽂件,如果该⽂件已存在,则将它的长度截断为0; CFile::modeNoTruncate --与CFile::modeCreate合⽤,如果要创建的⽂件已存在,它的长度不会被截断; CFile::modeRead --打开⽂件,仅⽤于读操作; CFile::modeReadWrite --打开⽂件,可读可写; CFile::modeWrite --打开⽂件,仅⽤于写操作; CFile::modeNoInherit --禁⽌⼦进程继承该⽂件; CFile::shareDenyNone --打开⽂件,同时并不拒绝其他进程对该⽂件的读取和写⼊访问;如果该⽂件已经被其他进程以兼容模式打开,则函数调⽤失败; CFile::shareDenyRead --打开⽂件,并拒绝其他进程对该⽂件的读取访问; CFile::shareDenyWrite --打开⽂件,并拒绝其他进程对该⽂件的写⼊访问; CFile::shareExclusive --以独占模式打开,拒绝其他进程对该⽂件的读取和写⼊访问; CFile::typeText --设置⽂本模式,带有⼀对回车换⾏字符; CFile::typeBinary --设置⼆进制模式; 2)⽂件读写 CFile::Read virtual UINT Read( void* lpBuf, UINT nCount ); lpBuf:指向⽤来接收从⽂件中读取的数据的缓冲区的指针; nCount:要从⽂件中读取的最⼤字节数; CFile::Write virtual void Write( const void* lpBuf, UINT nCount ); lpBuf:指向将要被写⼊⽂件的数据; nCount:将要写⼊的数据的字节数; CFile::Flush --刷新缓冲区中的数据并将其写⼊磁盘⽂件中 virtual void Flush(); 3)关闭⽂件 CFile::Close() virtual void Close(); 2.2⽂件长度的获取和设置 CFile::GetLength() CFile::SetLength(ULONGLONG dwLen) //⽂件会响应地被扩展或截取 2.3⽂件的指针 CFile::GetPosition() --获得当前⽂件指针的位置 virtual DWORD GetPosition( ) const; CFile::Seek virtual LONG Seek( LONG lOff, UINT nFrom ); lOff:将移动⽂件指针多少个字节数; nFrom:移动⽂件指针的起始位置,包括: CFile::begin CFile::current CFile::end CFile::SeekToBegin() //将⽂件指针移到⽂件开头 CFile::SeekToEnd() //将⽂件指针移到⽂件末尾 2.4⽂件相关属性的读取和设置 1)CFile::GetStatus //获取⽂件的属性信息,成功返回⾮0,失败返回0 Bool GetStatus([LPCTSTR strFileName,]CFileStatus& Status) CFileStatus结构有以下字段: CTime m_ctime --⽂件创建的时间 CTime m_mtime --⽂件最后⼀次修改的时间 CTime m_atime --最后⼀次访问⽂件并读取的时间 LONG m_size --⽂件逻辑长度,以字节数表⽰ BYTE m_attribute --⽂件属性 m_attribute的值包括:normal=0x00 | readOnly=0x01 | hidden=0x02 | system=0x04 | volume=0x08 | directory=0x10 | archive=0x20 Char m_szFullName[_MAX_PATH] --Windows字符集表⽰的全⽂件名 2)CFile::SetStatus //设置⽂件属性信息 SetStatus(LPCTSTR strFileName,CFileStatus& Status) 3)CFile::GetFileName() //获取⽂件名称,包含扩展名(即使被隐藏) 4)CFile::GetFileTitle() //获取⽂件显⽰名称(若系统默认隐藏⽂件扩展名,则不包含扩展名) 5)CFile::GetFilePath() //获取⽂件绝对路径 6)CFile::SetFilePath(strNewFilePathName) 7)CFile::Rename(strOldFileName,strNewFileName) //重命名⽂件,可以利⽤此函数移动⽂件到新的路径下并重命名 8)CFile::Remove(strFileName) //删除指定路径⽂件,可以是相对路径、绝对路径 注意:1、⽂件读写需要异常处理 2、注意⽂件的指针位置 例: if (GetFileAttributes("./1.txt") != INVALID_FILE_ATTRIBUTES) //检测⽂件是否存在{ CFile file; file.Open("1.txt", CFile::modeCreate | CFile::modeWrite);//file.Write("hello world!", strlen("hello world!"));CString str="hello world!";int strLen=str.GetLength(); file.Write(str, strLen); file.Close();}CFile file;if(file.Open("1.txt", CFile::modeRead)){ char *pBuf; DWORD dwFileLen; dwFileLen = file.GetLength(); pBuf = new char[dwFileLen + 1]; pBuf[dwFileLen] = 0; file.Read(pBuf, dwFileLen); file.Close(); MessageBox(pBuf); delete[] pBuf; }3、CFileFind类的使⽤ 3.1开始查找(指定查找的⽬录) CFileFind::FindFile(strFileName,0); //strName为要查找的⽂件名,为NULL表⽰查找“*.*” 成功返回⾮0,失败返回0 3.2查找下⼀个(获取当前⽂件信息,返回下⼀个⽂件是否存在) CFileFind::FindNextFile(); //返回⾮0表⽰还有符合条件的下⼀个⽂件,返回0表⽰已是最后⼀个⽂件 3.3获取/判断⽂件信息 CFileFind::GetCreationTime(); //获取⽂件的创建时间,成功返回⾮0,失败返回0 virtual BOOL GetCreationTime(FILETIME *pFileTime) const; //FILETIME*:容纳时间的结构指针 virtual BOOL GetCreationTime(CTime& refTime) const; //CTime&:容纳时间的对象地址 FILETIME和CTime的相互转换: FILETIME转CTime: 1、CTime对象在初始化时可以传递FILETIME结构 FILETIME ft; CTime time(ft); 2、将FILETIME转换为SYSTEMTIME,然后CTime对象在初始化时可以传递SYSTEMTIME结构 FILETIME ft; SYSTEMTIME st; BOOL bSuccess=::FileTimeToSystemTime(&ft , &st); CTime time(st); CTime转FILETIME: CTime time(CTime::GetCurrentTime()); SYSTEMTIME st; time.GetAsSystemTime(st); FILETIME ft; ::SystemTimeToFileTime(&st,&ft); CFileFind::GetLastAccessTime(); //获取⽂件最后被访问的时间,成功返回⾮0,失败返回0 virtual BOOL GetLastAccessTime(FILETIME *pFileTime) const; virtual BOOL GetLastAccessTime(CTime& refTime) const; CFileFind::GetLastWriteTime(); //获取⽂件最后被修改的时间,成功返回⾮0,失败返回0 virtual BOOL GetLastWriteTime(FILETIME *pFileTime) const; virtual BOOL GetLastWriteTime(CTime& refTime) const; CFileFind::GetRoot(); //获取查找到的⽂件的根⽬录,必须在执⾏FindNextFile()后执⾏该函数,返回CString对象 CFileFind::GetFileName(); //获取查找到的⽂件的全名(包含扩展名),必须在执⾏FindNextFile()后执⾏该函数,返回CString对象 CFileFind::GetFilePath(); //获取查找到的⽂件的绝对路径,必须在执⾏FindNextFile()后执⾏该函数,返回CString对象 CFileFind::GetFileTitle(); //获取查找到的⽂件的名称(若系统默认隐藏⽂件扩展名则不显⽰),必须在执⾏FindNextFile()后执⾏该函数,返回CString对象 CFileFind::GetFileURL(); //获取查找到的⽂件的URL路径,必须在执⾏FindNextFile()后执⾏该函数,返回CString对象 CFileFind::GetLength(); //获取查找到的⽂件的长度DWORD CFileFind::IsArchived(); //判断查找的⽂件属性是否是档案⽂件,必须在执⾏FindNextFile()后执⾏该函数,⾮0表⽰是,0表⽰不是 CFileFind::IsCompressed(); //判断查找的⽂件属性是否是压缩⽂件,必须在执⾏FindNextFile()后执⾏该函数 CFileFind::IsDirectory(); //判断查找的⽂件属性是否为路径⽂件(⽂件夹),必须在执⾏FindNextFile()后执⾏该函数 CFileFind::IsDots(); //判断查找的⽂件属性是否是“.”、“..”,必须在执⾏FindNextFile()后执⾏该函数 CFileFind::IsHidden(); //判断查找的⽂件属性是否为隐藏⽂件,必须在执⾏FindNextFile()后执⾏该函数 CFileFind::IsNormal(); //判断查找的⽂件属性是否为正常⽂件,必须在执⾏FindNextFile()后执⾏该函数 CFileFind::IsReadOnly(); //判断查找的⽂件属性是否为只读⽂件,必须在执⾏FindNextFile()后执⾏该函数 CFileFind::IsSystem(); //判断查找的⽂件属性是否为系统⽂件,必须在执⾏FindNextFile()后执⾏该函数 CFileFind::IsTemporary(); //判断查找的⽂件属性是否为临时⽂件,必须在执⾏FindNextFile()后执⾏该函数 CFileFind::MatchesMask(DWORD dwMask); //判断查找的⽂件的综合属性,必须在执⾏FindNextFile()后执⾏该函数 dwMask参数包括: FILE_ATTRIBUTE_ARCHIVE:档案⽂件 FILE_ATTRIBUTE_COMPRESSED:压缩⽂件 FILE_ATTRIBUTE_DIRECTORY:路径⽂件 FILE_ATTRIBUTE_NORMAL:正常⽂件 FILE_ATTRIBUTE_READONLY:只读⽂件 FILE_ATTRIBUTE_SYSTEM:系统⽂件 FILE_ATTRIBUTE_TEMPORARY:临时⽂件 FILE_ATTRIBUTE_HIDDEN:隐藏⽂件 3.4结束查找 CFileFind::Close();CFileFind fFinder;BOOL bFind = fFinder.FindFile(TEXT("D:/*.*"));while (bFind){bFind = fFinder.FindNextFile();//当前⽂件夹及上层⽂件夹(名称分别为..)-----------------if (fFinder.IsDots()){continue;}//⼦⽂件夹---------------------------------------------if(fFinder.IsDirectory()){CString cstrDirName = fFinder.GetFileName(); //directory nameCString cstrDirPath = fFinder.GetFilePath(); //directory pathcontinue;}//⽂件-------------------------------------------------CString cstrFileName = fFinder.GetFileName(); //file nameCString cstrFilePath = fFinder.GetFilePath(); //file path}fFinder.Close(); 相关问题: CFileFind 类中返回的⽂件顺序与⽂件系统有关,如果是NTFS和CDFS⽂件系统,是以⽂件的字母顺序排列的,FAT⽂件系统下,是以⽂件增加的先后顺序排列的,⽽不是按字母顺序。
MFC 使用对话框里面打开多个文件

MFC 使用对话框里面打开多个文件在使用的时候,用一个数组开辟一个大的空间,保存文件的路径,然后在其他地方使用CVLOADIMAGE来载入图片,但是也可以使用CFileDialog的一个成员变量中取出。
使用中出现的问题有1.在对话框的m_ofn的设置的时候dlg.m_ofn.Flags=OFN_ALLOWMULTISELECT|OFN_EXPLORER|OFN_ENABLEHOOK;//改变对话框的样式,注意的是最后一个OFN_ENABLEHOOK必须加上去不然就会出错了2.空间的开辟足够大以及初始化为空在MFC中使用CFile类和CFileDialog可以很简单的载入和保存文件……CFileDialog文件选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型如下:CFileDialog::CFileDialog(BOOL bOpenFileDialog, //为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框LPCTSTR lpszDefExt = NULL, //默认的文件扩展名LPCTSTR lpszFileName = NULL, //默认的文件名DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, //设定风格LPCTSTR lpszFilter = NULL, //列出可供选择的文件类型和相应的扩展名CWnd* pParentWnd = NULL //父窗口句柄指针);LPCTSTR lpszFilter 参数格式如:"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc;*.xls|All Files (*.*)|*.*||";文件类型说明和扩展名间用| 分隔,同种类型文件的扩展名间可以用; 分割,每种文件类型间用| 分隔,末尾用|| 指明。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在向导创建的应用程序中,程序的默认菜单有“文件”、“编辑”、“视图”和“帮助”。
当运行程序后,打开“文件”菜单中的“打开”命令时,应用程序会自动打开相应的“打开”文件通用对话框。
之所以有这功能,是因为向导创建的应用程序框架中,自动将“打开”菜单命令与CWinApp的OnFileOpen 成员函数相关联。
当用户在通用“打开”文件对话框中指定一个文件后,应用程序将调用文档对象的
CDocument::OnOpenDocument虚成员函数。
该函数将打开文件,并调用DeleteContents清除文档对象的内容,然后创建一个CArchive(归档类)对象用于数据的读取,接着又自动调用Serialize函数。
之后便调用视图对象的CView::OnInitialUpdate虚成员函数。
上述的Serialize函数是一个很特别的函数,它既可以从中读取文档数据,也可以保存文档数据,称为“序列化”函数。
它被添加用户的文档类中,用来根据CArchive内部的一个标志来决定文档数据的流向(读或写),
打开机制:可以看到消息映射ON_COMMAND(ID_FILE_OPEN,CWinApp::OnFileOpen),如果你没有映射ID_FILE_OPEN消息,就会调用CWinApp::OnFileOpen,否则调用你的消息映射函数。
在CWinApp::OnFileOpen中调用CDocManager::OnFileOpen(),这样函数完成以下任务:1。
弹出对话框让用户选择待打开的文件,返回该文件的全路径名称, 供下面函数调用时使用2。
调用应用程序的
OpenDocumentFile(LPCTSTR lpszFileName)。
至此,这个对话框的出处就真相大白了。
文档数据的读操作
对于上述过程,我们所做的仅仅是在文档类的Serialize函数中添加文档数据读取(加载)和存储的代码。
需要说明的是,Serialize函数的参数ar是一个CArchive类的引用对象。
CArchive类提供了“<<”和“>>”运算符,分别可以向文档对象写入数据或从文档对象中读取数据。
它们的含义与C++中的“<<”和“>>”运算符相同,只不过CArchive支持更多的数据类型,如:CObject、CString等。
除此之外CArchive类还提供ReadString和WriteString成员函数来读写文档中的一行文本。
文档数据的显示方法和技巧
用户的视图类是负责显示文档数据的,目前常用的显示方法有二个:一是在视图的客户区中使用编辑控件,二是直接调用CDC类的文本输出函数绘制所有的文本内容。
1.使用编辑控件
“编辑控件”是一个可以让用户从键盘输入和编辑文本的控件,通过它可以输入各种文本、数字或者口令,也可使用它来编辑和修改简单的文本内容。
MFC类CEdit封装了编辑控件的全部操作。
使用编辑控件实现文档数据的显示的思路是,先在视图中创建一个与视图客户区大小相同的编辑控件,然后把文档的文本内容转送到编辑控件中。
2. 直接控制文本的输出(详细)
(1)重写OnOpenDocument函数,读取文本文件到字符串变量
BOOL CMFCDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
// TODO: 在此添加您专用的创建代码
if(lpszPathName!=NULL)
{
CFile pCFile;
int hResult=pCFile.Open(lpszPathName, CFile::modeReadWrite); //以读写方式打开文件
if(hResult != 0)
{
// AfxMessageBox("打开文件成功");
}
//将文件读到str字符串
pCFile.Read(str.GetBuffer(pCFile.GetLength()), pCFile.GetLength());
pCFile.Close();
}
return TRUE;
}
(2)ondraw函数中将文件显示出来
CDC为我们提供了四个输出文本的函数:TextOut、ExtTextOut、TabbedTextOut和DrawText,分别用于不同的场合。
如果想要绘制的文本需要支持Tab符,那么采用TabbedTextOut函数,可以使绘制出来的文本效果更佳;如果要在一个矩形区域内绘制多行文本,那么采用DrawText函数,会更富于效率;如果文本和图形结合紧密,字符间隔不等,并要求有背景颜色或矩形裁剪特性,那么ExtTextOut函数就将是最好的选择。
如果没有什么特殊要求,那使用TextOut函数就显得简练了。
pDC->DrawText(pDoc->str,pDoc->str.GetAllocLength(),CRect(0,0,1000,1000),DT_WORDBREAK);。