转自http://kb.cnblogs.com/a/2357724/和http://blog.csdn.net/godknows007/article/details/6192925 有详细代码

MFC默认会发送ID_FILE_NEW消息,调用CWinAppEx::OnFileNew(),在这个函数里会有m_pDocManager-> OnFileNew(); m_pDocManager是CWinApp对象的一个指向CDocManager对象的指针变量,CMutiDocManager类负责Document的创建和管理。不论ID_FILE_NEW消息和ID_FILE_OPEN消息,CMutiDocManager类都会建立文档对象。如果是ID_FILE_OPEN消息,系统默认会有ON_COMMAND(ID_FILE_OPEN, &CWinAppEx::OnFileOpen) 也就是说会有m_pDocManager-> OnFileOpen();

看一下m_pDocManager-> OnFileNew();这个函数里面主要做什么。里面主要有CMultiDocTemplate::OpenDocumentFile,而这个函数主要是创建ducument、View、FrameWnd对象, 主要有CDocument* pDocument = CreateNewDocument();CFrameWnd* pFrame = CreateNewFrame(pDocument, NULL);SetDefaultTitle(pDocument);pDocument->OnNewDocument();pDocument->OnOpenDocument(lpszPathName)。 CDocTemplate::CreateNewDocument()主要有CDocument* pDocument = (CDocument*)m_pDocClass->CreateObject();AddDocument(pDocument);

看一下m_pDocManager-> OnFileOpen();这个函数里面主要做什么。里面主要有两个函数,其一CDocManager::DoPromptFileName的作用就是弹出文件选择对话框,还有就是AfxGetApp()->OpenDocumentFile(newName);如果要改写有两种办法

第一种:重写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。

注意:不要在CMyApp中添加这两个消息的事件处理,因为系统已经为你做了,你添加了也不会被调用。而且在其他类上添加他们的事件处理函数也只有在新建了文档对象后才有效,也就是如果你把系统默认的新建文档去掉后,第一个打开消息只会是CMyApp或者CWinAppEx的OnFileNew()。如果要改写就只需要把ON_COMMAND(ID_FILE_NEW, &CWinAppEx::OnFileNew 改为ON_COMMAND(ID_FILE_NEW, &CMyApp::OnFileNew 然后中重写OnFileNew()。如果要开始不打开一个文档可以C****App::InitInstance()函数中加入cmdInfo.m_nShellCommand=CCommandLineInfo::FileNothing;

ID_FILE_NEW消息和ID_FILE_OPEN消息相关推荐

  1. 企业微信 接收消息服务器,接收消息与事件

    [TOC] 关于接收消息 为了能够让自建应用和企业微信进行双向通信,企业可以在应用的管理后台开启接收消息模式. 开启接收消息模式的企业,需要提供可用的接收消息服务器URL. 开启接收消息模式后,用户在 ...

  2. 消息积压在消息队列里怎么办

    作者:一条路上的咸鱼 链接:https://www.jianshu.com/p/07b2169bef49 1.大量消息在mq里积压了几个小时了还没解决 场景:几千万条数据在MQ里积压了七八个小时,从下 ...

  3. 消息队列面试连环问:如何保证消息不丢失?处理重复消息?消息有序性?消息堆积处理?...

    大家好,我是 yes. 最近我一直扎在消息队列实现细节之中无法自拔,已经写了 3 篇Kafka源码分析,还剩很多没肝完.之前还存着RocketMQ源码分析还没整理.今儿暂时先跳出来盘一盘大方向上的消息 ...

  4. ucosii事件控制块------消息邮箱与消息队列

    UCOSII 使用叫做事件控制块(ECB)的数据结构来描述诸如信号量.邮箱(消息邮箱)和消息队列这些事件 #define OS_EVENT_EN (((OS_Q_EN > 0u) &&a ...

  5. 【Android 异步操作】Handler 机制 ( Android 提供的 Handler 源码解析 | Handler 构造与消息分发 | MessageQueue 消息队列相关方法 )

    文章目录 一.Handler 构造函数 二.Handler 消息分发 三.MessageQueue 消息队列相关函数 一.Handler 构造函数 一般使用 Handler 时 , 调用 Handle ...

  6. 【Android 异步操作】手写 Handler ( 消息队列 MessageQueue | 消息保存到链表 | 从链表中获取消息 )

    文章目录 一.MessageQueue 消息队列存储消息 二.MessageQueue 消息队列取出消息 三.消息队列完整代码 一.MessageQueue 消息队列存储消息 Message 链表 : ...

  7. java 消息队列_java消息队列

    Java消息服务(Java Message Service,JMS)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信. ...

  8. RocketMQ-初体验RocketMQ(09)-广播消息、延时消息、批量消息

    文章目录 广播消息 广播消息概述 演示步骤 延时消息 概述 使用场景 延时机制 实现原理 示例 批量消息 批量消息概述 示例 代码 广播消息 广播消息概述 广播消息就是向所有用户发送消息. 如果我们希 ...

  9. 计算发送延时与传播延迟_消息队列——延时消息应用解析及实践

    简介:在大部分场景下业务系统如果只需要实现异步解耦.削峰填谷等能力,常规的普通消息就可以满足此类需求.除此之外,在某些特殊的业务场景中,普通消息类型存在无法满足需求的情况.这就需要消息队列服务本身支持 ...

最新文章

  1. android Style(样式)的解析
  2. php mysql备份脚本_MySQL备份脚本,mysql脚本
  3. 什么是Unwind segues,您如何使用它们?
  4. 你在看Netflix,Netflix也在看你
  5. 牛客题霸 NC5 二叉树根节点到叶子节点的所有路径和
  6. ansible inventory 主机清单配置
  7. 腾讯会议开放API接口,为企业打造专属的“腾讯会议”
  8. 可视化查看依赖关系_图可视化分析解决方案KeyLines介绍
  9. 应云而生,原力觉醒——解读云原生基础设施 | 凌云时刻
  10. 嵌入式Linux开发工具
  11. 3dmax:3dmax三维建模中常用的材质、贴图、渲染设置之详细攻略
  12. android studio adb 连接mumu 模拟器
  13. MQTT QoS(服务质量)介绍
  14. 从堂兄平淡人生看人生价值的实现---有感于堂兄54岁成为家乡新闻人物
  15. Oracle数据库实例之进程架构(二)
  16. unity5.6.5适配Android P刘海屏,两侧去黑边
  17. 油猴相关玩法-下载,脚本下载
  18. 软件工程 个人学习笔记(第三章)
  19. 淘宝直通车表格拖动时间段选择插件,纯手写80%还原
  20. c语言洗牌发牌 无大小王 分四堆,C语言入门题

热门文章

  1. NPM酷库049:csv-parse,解析csv文件
  2. 如何提高Python的运行速度?(干货)
  3. linux ubuntu安装pytorch(深度学习环境搭建记录,无sudo权限)踩坑全记录
  4. 微信小程序(九)微信登录(授权)、获取微信登录凭证code、openid
  5. python爬虫能干什么-Python实战:网络爬虫都能干什么?
  6. android 7.0 乐视,感动Cry!乐视手机安卓7.0 ROM横空出世
  7. 人人都可以学会的超级记忆法 - 学习笔记
  8. [ProblemSolving]关于utorrent未响应的解决方法
  9. mc服务器使用腾讯云轻量应用服务器可以吗?
  10. 腕式计算机,讯飞腕式录音笔 R1体验:拯救会议记录小白的办公神器