C++ MFC打开文件的流程
打开文件的步骤如下:
弹出打开文件对话框 -> 获取选择的文件,并将文件显示在视图中。
我们程序中经常需要定制的操作如下:
1. 定制弹出的文件对话框,例如需要修改打开文件的类型或扩展名
2. 定制文件显示的行为
3. 定制文件打开后的行为
1. CWinApp::OnFileOpen
它是ID_FILE_OPEN消息的处理函数,在内部调用CDocManager::OnFileOpen。
下面是CWinApp::OnFileOpen的源码:
1 void CWinApp::OnFileOpen()
2 {
3 ENSURE(m_pDocManager != NULL);
4 m_pDocManager->OnFileOpen(); //CDocManager m_pDocManager;
5 }CDocManager::OnFileOpen的主要作用是弹出文件选择对话框,它的源码如下:
1 void CDocManager::OnFileOpen()
2 {
3 // prompt the user (with all document templates)
4 CString newName;
5 if (!DoPromptFileName(newName, AFX_IDS_OPENFILE,
6 OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, TRUE, NULL))
7 return; // open cancelled
8
9 AfxGetApp()->OpenDocumentFile(newName);
10 // if returns NULL, the user has already been alerted
11 }CDocManager::DoPromptFileName的作用就是弹出文件选择对话框。
写到这里我们已经可以解决第一个问题了---定制文件打开对话框。我们可以选择两种方式:
第一种:重写CWinApp::OnFileOpen
示例如下:
1 CYourApp::OnFileOpen()
2 {
3 CString newName;
4 // 1. 在这里弹出自己的打开文件对话框
5 // 2. 直接调用OpenDocumentFile(newName)
6 OpenDocumentFile(newName);
7 }这种方式的缺点是,如果要定制保存文件对话框,还得重写其他的某个函数,如CDocument::DoSave。
第二种: 重写CDocManager::DoPromptFileName
这种方式会同时改变打开文件对话框和保存文件对话框,因为打开和保存时的对话框都是通过此函数弹出的。
这种方式需要两步:
1. 自定义一个CDocManager的子类,例如,CYourDocManager,在其中重写DoPromptFileName方法
2. 在CYourApp::InitInstance函数中找到AddDocTemplate,并在它的前面加上这样一行:m_pDocManager = new CYourDocManager;
因为在AddDocTemplate中先判断m_pDocManager是否为Null,若为Null则创建一个。我们在它前边将m_pDocManager实例化,
这样之后就会调用我们定制的DoPromptFileName函数了。
2. CWinApp::OpenDocumentFile
在获取要打开文件的路径后框架调用了这个函数,并在这个函数中完成了读取文件数据并显示的操作。
通过跟踪MFC的源码,我们会发现真正打开文件是在CDocument::OnOpenDocument中进行的,
CDocument::OnOpenDocument的默认行为是先调用DeleteContents成员函数来确保文档空白,然后调用Serialize函数读取文件数据。
因此如果你的程序有打开文件的需求,则必须在你的文档类中重写Serialize函数。
上文中,我们已经解决了前两个定制的需求,现在来解决第三个,如果我们在打开文档后需要进行某些操作,如初始化, 我们可以对三个函数进行重写:
1. CDocument::OnOpenDocument
在Document中我们可以获取它关联的View,如果打开文档后需要对View进行某些初始化或者其他的一些初始化,则可以重写这个函数,示例如下:
1 BOOL CMyDoc::OnOpenDocument(LPCTSTR lpszPathName)
2 {
3 if (!CDocument::OnOpenDocument(lpszPathName))
4 return FALSE;
5 // 进行初始化 6 return TRUE;
7 }
也可以对下面两个函数进行重写以进行某些初始化
2. CWinApp::OpenDocumentFile
默认行为:CDocManager::OpenDocumentFile -->CDocument::OnOpenDocument
也就是说它最终还要调用CDocument::OnOpenDocument。 其中,CDocManager::OpenDocumentFile真正创建了Document。
3. CWinApp::OnFileOpen
具体将初始化的代码放在哪里,没有一个统一的标准,对于本人来说,在哪里初始化方便,便把初始化代码放在哪里。
C++ MFC打开文件的流程的更多相关文章
- MFC 打开文件对话框 打开单个文件
CFileDialog的语法: CFileDialog(BOOL bOpenFileDialog,LPCTSTR lpszDefExt=NULL,LPCTSTR lpszFileName=NULL,D ...
- MFC打开文件对话框
{ CString FilePathName; CFileDialog dlg(TRUE);///TRUE为OPEN对话框,FALSE为SAVE AS对话框 if(dlg.DoModal()==IDO ...
- MFC 打开文件夹 调用其他程序 打开文件
ShellExecute(NULL,TEXT("OPEN"),要打开的文件的路径,NULL,NULL,SW_SHOWNORMAL); ShellExecute(NULL, &quo ...
- MFC打开文件选择框和多选框,保存文件夹的选择,保存文件路径的选择
CString defaultDir = "C:\\"; //默认打开的文件路径 CString fileName = ""; //默认打开的文件名 CStri ...
- MFC 打开文件夹选择框并获取文件夹路径
CString FicowGetDirectory() { BROWSEINFO bi; char name[MAX_PATH]; ZeroMemory(&bi, sizeof(BROWSEI ...
- 第一个c程序和vs2017 在打开MFC rc文件时找不到rcdll.dl
第一个c程序 #include<stdio.h> int main() { ; ; printf_s("请输入两个数字:"); scanf_s("%d,%d& ...
- MFC程序打开文件对话框出错的问题解决
前几天从网上下了个图像分析的mfc小程序,是VC6的 用VC6在本地编译生成都没问题.执行起来弹出一个未处理的错误,程序崩溃退出. 想起来原来遇到过打开文件对话框方面的问题,当时项目时间紧张未能深究. ...
- MFC打开/保存文件对话框:CFileDialog
MFC打开/保存文件对话框:CFileDialog CFileDialog 文件选择对话框的使用:首先构造一个对象并提供相应的参数,构造函数原型如下: CFileDialog::CFileDial ...
- MFC 打开外部EXE文件的三种方法
目前知道三种方式:WinExec,ShellExecute ,CreateProcess,别人已经总结的很好了<vc中调用其他应用程序的方法(函数) winexec,shellexecute , ...
随机推荐
- LINUX 下Open cv练习使用小记(1)
首先肯定离不开选一张自己喜欢的图像来显示 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp ...
- springmvc登陆拦截案例
一.web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=&qu ...
- git push error: A Contributor Agreement must be completed before uploading
因为是从官方版本库做的镜像,所以有些权限直接从官方同步到了本地. 今天,有同事执行git push操作,报错: 根据网上搜索的内容,在gerrit.config中[auth]中添加如下内容: [aut ...
- Hyper-v之利用差异磁盘快速创建多个虚拟机
在新建Hyper-v磁盘的时候 有3种选项 其中分别是 固定大小 动态扩展 和 差异(differencing,个人习惯叫 差分) 其中 固定大小是新建的时候 Hyper-v创建一个设置大小值的文件, ...
- sas编程-日期相差计算函数 intnx
sas编程-日期相差计算函数 intnx 示例代码: data _null_; lastdate=intnx('year',today(),-100); format lastdate ...
- 测不准的程序员(Heisenberg Developers)
摘译自http://mikehadlow.blogspot.co.uk/2014/06/heisenberg-developers.html ——“你无法在不改变他们状态的情况下观察一个开发者” ...
- GHOST(幽灵)重大漏洞
cd /usr/local/srcwget https://webshare.uchicago.edu/orgs/ITServices/itsec/Downloads/GHOST.cgcc GHOST ...
- 【练习】移动数据---解决null值
1.创建数据文件: [oracle@host03 ~]$ vi base_data.dat ,zhangfei,zhangyide ,guanyu,guanyunchang ,liubei,liuxu ...
- win7远程桌面恢复全屏状态快捷键
不同的电脑可能有不同的快捷键(有些笔记本电脑甚至没有相应的键值):①台式机:ctrl+alt+break 组合键.②CTRL+ALT+PAGEDOWN 组合键.③有的笔记本没有break键,可以尝试加 ...
- symbol(s) not found for architecture x86_64 之 linker command failed with exit code 1 (use -v to see invocation)解决方案排查
这样的错误 ,我的解决方案是, 第一种: 查看他说在 ****.o 中,你要查看这样的关键点,然后去查看,你 项目中有没有引进这样的文件,在项目中查找,看项目中有没有,如果没有那就是没添加进来,你 ...