MFC单文档打开文件
- 格式:doc
- 大小:30.50 KB
- 文档页数:2
用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++关于文件的读写操作以及文件的打开和保存通过近来的学习,总结一下关于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文件读取技术(1)计算机是如何管理自身所存放着大量的信息的呢?windows 的磁盘管理程序为我们提供了一套严密而又高效的信息组织开工--- 硬盘上的信息是以文件的形式被管理的。
面向存储的文件技术什么是文件?计算机中,一篇文章、一幅图画、一个程序、一首歌曲等都是以文件的形式存储在磁盘上的,每个文件都有一个文件名。
计算机就是对文件按名存取的。
文件名的格式如下:主文件名 . 扩展名文件名由主文件名和扩展名两部分组成,中间用小圆点隔开,其中扩展名可以省略。
而扩展名是用来区分文件类型的。
Windows 为了区分文件的类型,一些软件系统会自动给文件加上“ .wps ”扩展名;画图程序画的图像文件一般为“ .bmp ”等。
在windows 中,主文件名可以由英文字符、汉字、数字以及一些符号等组成,但不能使用+<>*?\ 等符号。
什么是文件夹?在计算机中存放着数以万计的文件,为了便于管理这些文件,就像我们把文件分类放到不同的抽屉中便于查阅一样,在计算机中也有像抽屉的东西,它就是文件夹。
文件夹也要有一个名字,取名的原则与文件的取名类似,只是不用再区分文件夹的类型,当文件夹多了以后,还可以把某些文件夹归到一个大文件夹中去。
久而久之,就构成了计算机中庞大的磁盘文件结构。
为什么要在程序中使用文件?通常,程序中的数据在程序运行结束后,就会从内存中清除,再次运行程序时不会自动出现。
在编制程序的过程中不可避免地会遇到将某些数据永久保存的问题,当关闭程序后,依然可以使用这些数据,这时就需要进行文件操作。
文件类型Visual c++ 处理的文件通常分为两种:文本文件:只可被任意文本编辑器读取ASCII 文本。
二进制文件:指对包含任意格式或无格式数据的文件的统称。
这里只介绍文本文件的读写,INI 文件也属于文本文件的范畴,且INI 文件的结构和用途与普通的文本文件不同,所以会单独介绍。
打开文件操作步骤: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编写打开文件夹对话框类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多文档和单文档视结构★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★//这一页的代码最重要了,呵呵……什么都在这里面呢;单文档新建: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⽂件读写操作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 使用对话框里面打开多个文件在使用的时候,用一个数组开辟一个大的空间,保存文件的路径,然后在其他地方使用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 (*.*)|*.*||";文件类型说明和扩展名间用| 分隔,同种类型文件的扩展名间可以用; 分割,每种文件类型间用| 分隔,末尾用|| 指明。
关于利用单文档菜单调用窗口
第、先创建一个单文档应用程序,名为:。
、打开视图,右击文件夹,选择"插入",插入一个对话框。
、双击对话框空白处,弹出" "窗口,选择单选项" ",弹出" "窗口,在框中输入"",单击""。
其中""为"类的缩写,""是你自己起的名字。
、打开视图中的文件夹,双击"",展开"文件"菜单,右击"新建"菜单项,选择"属性",查看其为""。
、在窗口对话框中右键,选择“类向导”,弹出" "窗口,在第一个选项卡下选择:为""
:为""
:为""
单击" ",在弹出的窗口中单击"",返回" "窗口,单击" ",在函数中添加如下代码:;
(())
();
并在本窗口顶部添加代码:"" 用以包含对话框头文件。
、运行查看结果。
MFC⽂件读取MFC⽂件读取MFC⽂件读取技术(1)计算机是如何管理⾃⾝所存放着⼤量的信息的呢?windows 的磁盘管理程序为我们提供了⼀套严密⽽⼜⾼效的信息组织开⼯--- 硬盘上的信息是以⽂件的形式被管理的。
⾯向存储的⽂件技术什么是⽂件?计算机中,⼀篇⽂章、⼀幅图画、⼀个程序、⼀⾸歌曲等都是以⽂件的形式存储在磁盘上的,每个⽂件都有⼀个⽂件名。
计算机就是对⽂件按名存取的。
⽂件名的格式如下:主⽂件名 . 扩展名⽂件名由主⽂件名和扩展名两部分组成,中间⽤⼩圆点隔开,其中扩展名可以省略。
⽽扩展名是⽤来区分⽂件类型的。
Windows 为了区分⽂件的类型,⼀些软件系统会⾃动给⽂件加上“ .wps ”扩展名;画图程序画的图像⽂件⼀般为“ .bmp ”等。
在windows 中,主⽂件名可以由英⽂字符、汉字、数字以及⼀些符号等组成,但不能使⽤+<>*?\ 等符号。
什么是⽂件夹?在计算机中存放着数以万计的⽂件,为了便于管理这些⽂件,就像我们把⽂件分类放到不同的抽屉中便于查阅⼀样,在计算机中也有像抽屉的东西,它就是⽂件夹。
⽂件夹也要有⼀个名字,取名的原则与⽂件的取名类似,只是不⽤再区分⽂件夹的类型,当⽂件夹多了以后,还可以把某些⽂件夹归到⼀个⼤⽂件夹中去。
久⽽久之,就构成了计算机中庞⼤的磁盘⽂件结构。
为什么要在程序中使⽤⽂件?通常,程序中的数据在程序运⾏结束后,就会从内存中清除,再次运⾏程序时不会⾃动出现。
在编制程序的过程中不可避免地会遇到将某些数据永久保存的问题,当关闭程序后,依然可以使⽤这些数据,这时就需要进⾏⽂件操作。
⽂件类型Visual c++ 处理的⽂件通常分为两种:⽂本⽂件:只可被任意⽂本编辑器读取ASCII ⽂本。
⼆进制⽂件:指对包含任意格式或⽆格式数据的⽂件的统称。
这⾥只介绍⽂本⽂件的读写,INI ⽂件也属于⽂本⽂件的范畴,且INI ⽂件的结构和⽤途与普通的⽂本⽂件不同,所以会单独介绍。
一、C语言的文件操作通过FILE结构体实现。
1、文件的打开C语言中对文件进行操作必须首先打开文件,打开文件主要涉及到fopen函数。
fopen函数的原型为FILE*fopen(const char*path,const char*mode)示例:FILE*pFile=fopen(“1.txt”,”w”);其中path为文件路径,mode为打开方式。
1)对于文件路径,只需注意若未明确给出绝对路径,则默认该文件在工程的目录下。
若需给出绝对路径,则注意转义字符'\',比如有文件test.txt存放在C 盘根目录下,则文件路径参数值应为C:\\test.txt。
2)对于mode,主要由r,w,a,+,b,t六个字符组合而成。
r:只读方式,文件必须存在;w:只写方式,若文件存在,则原有内容会被清除;若文件不存在,则会建立文件;a:追加方式打开只写文件,只允许进行写操作,若文件存在,则添加的内容放在文件末尾;若不存在,则建立文件;+:可读可写;b:以二进制方式打开文件;t:以文本方式打开文件(默认方式下以文本方式打开文件)。
下面是常见的组合:r:以只读的方式打开文件,只允许读,此文件必须存在,否则返回NULL,打开成功后返回文件指针,位置指针指向文件头部;r+:以可读可写的方式打开文件,允许读写,此文件必须存在,否则返回NULL,打开成功后返回文件指针,位置指针指向文件头部;rb+:以可读可写、二进制方式打开文件,允许读写,此文件必须存在,否则返回NULL,打开成功后返回文件指针,位置指针指向文件头部;rt+:以可读可写、文本方式打开文件,允许读写,此文件必须存在,否则返回NULL,打开成功后返回文件指针,位置指针指向文件头部;w:以只写的方式打开文件,只允许写,若文件存在,文件中原有内容会被清除;若文件不存在,则创建文件,打开成功后返回文件指针,位置指针指向文件头部;w+:以读写的方式打开文件,允许读写,若文件存在,文件中原有内容会被清除;若文件不存在,则创建文件,打开成功后返回文件指针,位置指针指向文件头部;a:以追加、只写的方式打开文件,只允许写。
关于MFC利用单文档菜单调用窗口第1、先创建一个单文档应用程序,名为:Dialog。
2、打开ResourceView视图,右击Dialog文件夹,选择"插入Dialog",插入一个对话框。
3、双击对话框空白处,弹出"Adding a Class"窗口,选择单选项"Createa new class",弹出"New Class"窗口,在Name框中输入"CCIDD_DIALOG1",单击"OK"。
其中"C"为"类的缩写,"CIDD_DIALOG1"是你自己起的名字。
4、打开ResourceView视图中的Menu文件夹,双击"IDR_MAINFRAME",展开"文件"菜单,右击"新建"菜单项,选择"属性",查看其ID为"ID_FILE_NEW"。
5、在窗口对话框中右键,选择“类向导”,弹出"MFC ClassWizard"窗口,在第一个选项卡下选择Class name:为"CDialogView"Object IDs:为"ID_FILE_NEW"Message:为"COMMAND"单击"Add Function",在弹出的窗口中单击"OK",返回"MFC ClassWizard"窗口,单击"Edit Code",在函数中添加如下代码:CCIDD_DIALOG1 dlg;if(dlg.DoModal()==IDOK)Invalidate();并在本窗口顶部添加代码:#include "CIDD_DIALOG1.h" 用以包含对话框头文件。
基于MFC的单⽂档,多⽂档,对话框应⽤程序基于对话框(3个类):CAboutDlg程序名App程序名Dlg单⽂档(5个类):CAboutDlgCMainFrame程序名App程序名Doc程序名View多⽂档(6个类):CAboutDlgCMainFrame程序名App程序名Doc程序名ViewCChildFrame多⽂档CAboutDlg(“关于”对话框) CAboutDlg() DoDataExchange(CDataExchange* pDX)CChildFrame(⼦框架类) AssertValid() CChildFrame() ~CChildFrame() Dump(CDumpContext& dc) PreCreateWindow(CREATESTRUCT& cs)CMainFrame(主框架类) AssertValid() CMainFrame() ~CMainFrame() Dump(CDumpContext& dc) OnCreate(LPCREATESTRUCT lpCreateStruct) PreCreateWindow(CREATESTRUCT& cs) CStatusBar m_wndStatusBar; CToolBar m_wndToolBar;CMyApp(应⽤程序类) CMyApp() InitInstance() OnAppAbout()CMyDoc(⽂档类) AssertValid() CMyDoc() Serialize(CArchive& ar)CMyView(视图类) AssertValid() CMyView() ~CMyView() Dump(CDumpContext& dc) GetDocument() OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) OnDraw(CDC* pDC) OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) OnPreparePrinting(CPrintInfo* pInfo) PreCreateWindow(CREATESTRUCT& cs)Golbals(全局) theApp -------------------------------------------------------------------------------单⽂档CAboutDlg(“关于”对话框) CAboutDlg() DoDataExchange(CDataExchange* pDX)CMainFrame(主框架类) AssertValid() CMainFrame() ~CMainFrame() Dump(CDumpContext& dc) OnCreate(LPCREATESTRUCT lpCreateStruct) PreCreateWindow(CREATESTRUCT& cs) CStatusBar m_wndStatusBar; CToolBar m_wndToolBar;CMyApp(应⽤程序类) CMyApp() InitInstance() OnAppAbout()CMyDoc(⽂档类) AssertValid() CMyDoc() Serialize(CArchive& ar)CMyView(视图类) AssertValid() CMyView() ~CMyView() Dump(CDumpContext& dc) GetDocument() OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) OnDraw(CDC* pDC) OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) OnPreparePrinting(CPrintInfo* pInfo) PreCreateWindow(CREATESTRUCT& cs)Golbals(全局) theApp-------------------------------------------------------------------------------对话框CAboutDlg(“关于”对话框) CAboutDlg() DoDataExchange(CDataExchange* pDX)CMyApp(应⽤程序类) CMyApp() InitInstance()CMyDlg(对话框类) CMyDlg(CWnd* pParent /*=NULL*/) DoDataExchange(CDataExchange* pDX) OnInitDialog() OnPaint() OnQueryDragIcon() OnSysCommand(UINT nID, LPARAM lParam) HICON m_hIcon;Golbals(全局) theAppCXXXApp是应⽤程序类,负责程序的启动和结束CXXXDlg是主对话框类,程序的主界⾯。
MFC是一个编程框架MFC中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序。
MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法。
AppWizard可以用来生成初步的框架文件。
资源编辑器用于帮助直观的设计用户接口。
ClassWizard用来协助添加代码到框架文件,最后,通过类库实现了应用程序特定的逻辑。
MFC提供了一个Windows应用程序开发模式,对程序的控制主要是由MFC框架完成的。
而且MFC也完成了大部分的功能,预定义或实现了许多事件和消息处理。
框架或者由其本身处理事件,不依赖程序员的代码,或者调用程序员的代码来处理应用程序特定的事件。
1.S DI生成1.步骤dxq2009首先,打开VC++6.0开发环境,然后,选择”File”菜单中的“New”子菜单,在弹出的对话框中选择“MFC AppWizard(exe)”项并在“Progect name”编辑框中输入合适的工程名字Simple1,如图,它的意思是创建一个基于MFC的应用,接着进入正式的创建过程,MFC 应用程序的创建过程有6步(基于对话框)或者6步(SDI或者MDI),下面首先介绍SDI 应用的创建过程。
(1)第一步用于选择应用的结构以及语言等。
如图1,首先确定应用是否需要Doc/View Architecture Support支持,因为不使用该结构的应用不支持从磁盘文件打开文档,也没有派生于类CWnd的窗口客户区。
上面3个单选按钮用于确定创建的应用类型,包括单文档,多文档,对话框,这里选择第一个。
然后从资源列表框选择应用所使用的语言种类,单击“Next”。
图1(2)第二步为用用程序选择4项数据库支持选项之一:如图2.如果选择了数据库支持,那么单击“Data Source”按钮,选择外部的数据库表项,一般按默认即可,单击“Next”。
图2(3)第三步选择希望包含在应用中的复合文档支持项,同时判定是否启用标准的ActiveX 资源,以及是否为应用的菜单条添加额外的自动化命令等,如图4,一般安默认,单击“Next”图4(4)第四步用于选择应用所需的基本用户接口特征,以及所想使用的工具栏类型,如图5,如果想要修改应用所使用的文件名和扩展名,或者想要调整应用的用户接口和框架风格,就单击“Advanced”,然后修改,一般默认,单击“Next”。
在向导创建的应用程序中,程序的默认菜单有“文件”、“编辑”、“视图”和“帮助”。
当运行程序后,打开“文件”菜单中的“打开”命令时,应用程序会自动打开相应的“打开”文件通用对话框。
之所以有这功能,是因为向导创建的应用程序框架中,自动将“打开”菜单命令与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类的引用对象。
MFC文件操作1.文件的查找当对一个文件操作时,如果不知道该文件是否存在,就要首先进行查找。
MFC中有一个专门用来进行文件查找的类CFileFind,使用它可以方便快捷地进行文件的查找。
CString strFileTitle;CFileFind finder;bool bWork=finder.FindFile("C:\\windows\\sysbkup\\*.cab"); while(bWorking){bWorking=finder.FindNextFile();strFileTitle=finder.GetFileTitle();}2.文件的打开/保存对话框让用户选择文件进行打开和存储操作时,就要用到文件打开/保存对话框。
MFC的类CFileDialog用于实现这种功能。
使用CFileDialog声明一个对象时,第一个BOOL型参数用于指定文件的打开或保存,当为TRUE时将构造一个文件打开对话框,为FALSE时构造一个文件保存对话框。
在构造CFileDialog对象时,如果在参数中指OFN_ALLOWMULTISELECT 风格,则在此对话框中选择多个文件。
此时要重点注意为CFileDialog 对象的m_ofn.lpstrFile分配一块内存,用于存储多选操作所返回的所有文件路径名,如果不进行分配或分配的内存过小就会导致操作失败。
CFileDialog dlg(TRUE, NULL, "*.*",OFN_HIDEREADONLY |OFN_ALLOWMULTISELECT, "Data files (*.dat;*.fbf)|*.dat;*.fbf||",this);dlg.m_ofn.lStructSize = 88;dlg.m_ofn.lpstrFile = new TCHAR[64000];memset(dlg.m_ofn.lpstrFile,0,64000);dlg.m_ofn.nMaxFile = 64000;POSITION mPos=mFileDlg.GetStartPosition();Cstring pathName;while(mPos!=NULL){pathName=mFileDlg.GetNextPathName(mPos);}CFileDialog 用于取文件名的几个成员函数:假如选择的文件是C:\WINDOWS\TEST.EXE(1)GetPathName();取文件名全称,C:\WINDOWS\TEST.EXE(2)GetFileTitle();取文件全名:TEST.EXE(3)GetFileName();取回TEST(4)GetFileExt();取扩展名EXE3.文件的读写1.打开/创建文件CFile file;file.Open(_T("test.txt"),CFile::modeCreate|CFile::modeNoTru ncate|CFile::modeReadWrite);文件打开模式可组合使用,用“|”隔开,常用的有以下几种:CFile::modeCreate:以新建方式打开,如果文件不存在,新建;如果文件已存在,把该文件长度置零,即清除文件原有内容。
MFC总结(一):MFC中文件操作、查找与选择总结(1)本文主要涉及以下几个方面,均为在MFC编程中较为常用的:CFile操作、CArchive操作、如何选择文件和文件夹、如何查找文件、获取当前目录、_access函数等。
(一)使用CFile类操作文件CFile类在MFC的文件操作中应该是最常用的了。
主要的成员函数有Open、Close、Write、Read、Seek、SeekToEnd、GetLength、GetPosition,具体用法见MSDN。
(1)文件打开操作:文件打开有两种方式,一种是先定义类对象,在用Open函数打开;一种是在定义类对象时传入文件名和打开方式。
分别如下CFile file;if(!file.Open(lpszFileName, nOpenFlags ))return;或CFile file(lpszFileName, nOpenFlags);(2)文件打开方式:文件打开方式,即上述nOpenFlags的值主要由一些宏定义的值组合而成,具体见MSDN,常用的有如下几种:A. CFile::modeCreate | CFile::modeNoTruncate |CFile::modeWrite,以写文件的方式打开,如果文件不存在,则新建文件,否则打开已有文件进行写入操作,此时不会清空原有文件;B. 将上述CFile::modeWrite更换为CFile::modeRead或者CFile::modeReadWrite可实现读操作或者同时读写。
(3)判断文件结束判断文件是否结束,没有结束则继续读取,否则关闭退出。
这点在编程时常用。
对于CFile常用的判断文件结束的方法是:while(file.GetPosition() < file.GetLength()){ //文件未结束//Add code ....}(4)值得注意的几点:A. 当文件名中包含路径时,要注意使用\\,如C:\\MyFile.DAT,在Unicode下时,需要使用_T("C:\\MyFile.DAT");B. 采用(2)中A方式写文件时,注意使用file.SeekToEnd()将文件指针移至文件尾,再写入,否则会覆盖已有的数据,这点经常被很多初学者忽视;C. 在打开文件后就要紧接着写下Close,养成这样的习惯,避免忘记关闭文件。
紧急求救,请高手指点。
多文档多视图中遇到的问题,关于打开文件的简单问题-mfc教程-VC...设置工程初时时候无cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;而后想在打开文件的时候指定类型,不知道该怎么做。
1、我现在重载了BOOL CBaseEyeDoc::OnOpenDocument(LPCTSTR lpszPathName) 但是发现这么用,无法指定文件类型。
2、另外,我试着在框架类中classwizard了ID_FILE_OPEN,就有了BOOL CMainFrame::OnfileOpen(LPCTSTR lpszPathName) 但是我打开的是图象文件,希望大开后能显示,用框架类打开,不知道怎么通知视图显示。
如果是文档类,我用UpdateAllViews(NULL);就可以了,请高手指点。
答!: 1:我来回答一下第二个问题:1 在CMainFrame中这样得到View的指针:GetActiveView()得到视图的指针,然后进行你的操作2 可以向View发消息,得到View的指针是前提(如上所说)方法挺多的看楼主爱好了呵呵答!: 2:通知视图类画图是哪个函数,是ValidateRect吗?答!: 3:GetActiveView()得到的指针是空的答!: 4:在CMainFrame中OnfileOpen下,得到的视图和文档指针都是空的,为什么答!: 5:在单文档中,结构是:CMainFrame -> CView所以,可以用 CMainFrame::GetActiveView() 获得活动视图在多文档中,结构是:CMainFrame -> 多个CMDIChildWnd -> CView就不能直接用CMainFrame::GetActiveView() 的到 CView 了。
多文档中要分两步:步骤1、通过CMainFrame::MDIGetActive() 得到CMDIChildWnd* ,步骤2、在CMDIChildWnd* 中进行CMDIChildWnd::GetActiveView() 来得到 CView*例如:===========================CMDIChildWnd* pMDIActive = MDIGetActive() ;CView* pView = pMDIActive->GetActiveView() ;==================================。
在向导创建的应用程序中,程序的默认菜单有“文件”、“编辑”、“视图”和“帮助”。
当运行程序后,打开“文件”菜单中的“打开”命令时,应用程序会自动打开相应的“打开”文件通用对话框。
之所以有这功能,是因为向导创建的应用程序框架中,自动将“打开”菜单命令与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);。