My study of VC++ ( Doc&View&FrameWnd refered )

原创 2005年04月29日 00:30:00

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;

拆分窗口与多个视图

  • 有待学习



内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:My study of VC++ ( Doc&View&FrameWnd refered )
举报原因:
原因补充:

(最多只允许输入30个字)