5 important member functions:
- CView::GetDocument 得到与视图唯一对应的文档。GetDocument 不是虚函数,会用派生类来替代
- CDocument::UpdateAllViews 通知所有视图,文档数据发生变化,以便更新显示的数据。
GetDocument()->UpdateAllViews(this);
其中的非空参数阻止应用程序框架通知当前视图。还有可选的提示参数,来为视图提供与应用程序有关的消息,一时视图能够决定更新视图的那部分。这是高级用法
UpdateAllViews是通过OnUpdate来通知视图的
- CView::OnUpdate 虚函数。
- CView::OnInitialUpdate 虚函数。OnInitialUpdate的基类版本只是调用OnUppdat。如果在派生视图类中重载了OnInitialUpdate,要确保视图类调用了基类的OnInitialUpdate函数或派生类的OnUpdate
可以使用派生类的OnInitialUpdate初始化视图对象。如果在视图类中映射了OnCreate,则当应用程序框架在调用OnCreate之后立即调用OnInitialUpdate。OnCreate只调用一次,而OnInitialUpdate可以调用很多次
- CDocument::OnNewDocument 虚函数。
文档视图的事件发生的次序
- 应用程序启动
- 构造CMyDocument对象
- 构造CMyView对象
- 创建View窗口
- 调用CMyView::OnCreate(if已经映射)
- 调用CMyDocument::OnNewDocument
- 调用CMyView::OnInitialUpdate
- 初始化View对象
- 使View窗口无效
- 调用CMyView::OnDraw
- 用户编辑数据
- CMyView函数更新CMyDocument的数据成员
- 用户退出应用程序
- 删除CMyView
- 删除CMyDocument
SDI中的相互关系
- CTestDocViewSDIApp::InitInstance()中
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate( //
IDR_MAINFRAME,
RUNTIME_CLASS(CTestDocViewSDIDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CTestDocViewSDIView));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);在调用AddDoctemplate和文档模版的构造函数后,就建立了类之间的相互关系,这些类包括包括应用程序类、文档类、视图窗口类和主框架窗口类。
一个SDI应用程序只能有一个模版(和相关的类组),当SDI应用程序运行时,只能有一个文档对象和一个主框架窗口对象
MDI中的相互关系
- CTestDocViewMDIApp::InitInstance()中
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_TestDocViewTYPE,
RUNTIME_CLASS(CTestDocViewDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CTestDocViewView));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
- m_pMainWnd 指向CMainFrame。我们可以通过调用AfxGetApp得到CMainFrame
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
m_pMainWnd = pMainFrame;
拆分窗口与多个视图
- 有待学习