WM_FILE_NEW消息响应原理
当点击“新建”按钮时,会发送WM_FILE_NEW消息,按照消息响应函数的命名规则,
它的响应函数应该叫OnFileNew(),但是在代码中找不到,
通过调试发现,当新建按钮时,程序会调用CGraphicDoc::OnNewDocument(),
WM_FILE_NEW的消息是如何响应的呢?
我们可以在VC++的安装目录下找到一个文件
../Microsoft Visual Studio/VC98/MFC/SRC/APPDLG.CPP
在这个文件中,有一个CWinApp::OnFileNew()函数,它是这样定义的:
Void CWinApp::OnFileNew()
{ if (m_pDocManager !=NULL) m_pDocManager->OnFileNew();}
m_pDocManager是这样定义的:CDocManager * m_pDocManager;
CDocManager 是一个文档管理器,它有一个指针链表,维护一系统的文档模版指针。
接着,我们可以在../Microsoft Visual Studio/VC98/MFC/SRC/DOCMGR.CPP文件中找到
CDocManager::OnFileNew()的定义。
再次按下“新建”按钮时,由于框架类对象和视类对象已经创建了,在单文档中没有必要重复创建,
它会重复利用已经创建好的框架类对象和视类对象。
如果是多文档程序则会重复创建框架类对象、视类对象和文档类对象。
---------------------------------------------------------------------------------
按下“打开”与“保存”按钮时,会执行CGraphicDoc::Serialize方法
在CGraphicDoc类中有个Serialize(CArchive& ar)方法,是文档类提供的用来保存数据和加载数据的函数,其参数就是一个CArchive对象。
注意:如果将一个文件保存之后,马上打开它,程序将不会调用本方法加载数据,
因为当我们保存数据的时候,以前创建的文档类对象与保存的数据关联在一起了,
再次打开刚保存的文件时,MFC框架内部识别出是同一份数据,因为与数据相关的文档类指针已经存在
所以程序不会调用Serialize(CArchive& ar)方法加载相同的数据。