1,SDI应用程序文档类由CDocument类派生,一个文档类可以有一个或多个由CView类派生的视图类。
2,重要成员函数:
1)CView::GetDocument
CDocument* GetDocument( ) const;
//文档对象是用来保存数据的,而视图对象则是用来显示数据的。
//一个视图对象只有一个与之相关连的文档对象。
//Return A pointer to the CDocument object associated with the view.Return NULL if the view is not attached to a document.
//Call this function to get a pointer to the view’s document. This allows you to call the document’s member functions.
2)CDocument::UpdateAllViews
void UpdateAllViews( CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL );
//当文档数据发生修改的时候,调用该函数通知所有的视图对所显示的数据进行相应得更新。
//pSender:Points to the view that modified the document, or NULL if all views are to be updated.
//如果在派生文档类中调用UpdateAllViews函数,则pSender应该设置为NULL;如果UpdateAllViews函数在派生视图类成员函数中调用,则pSender参数应该设置成this(如:GetDocument()->UpdateAllViews(this);)
3)CView::OnUpdate
virtual void OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint );
//当应用程序调用了CDocument::UpdateAllViews函数时,会调用OnUpdate函数更新视图显示。
//通常视图类OnUpdate函数先对文档进行访问,读取文档的数据,然后对视图的数据成员或控制进行更新,以反应文档的变化。
//可以利用OnUpdate函数使视图的某部分无效,以触发视图的OnDraw函数调用,从而利用文档数据来重绘对应的视图窗口。
//默认的OnUpdate函数使得整个窗口矩形无效。
//当程序调用CDocument::UpdateAllViews函数,如果pSender参数指向了某个特定的视图对象,则除了该指定的视图之外,文档的所有其它视图的OnUpdate函数都会被调用。
4)CView::OnInitialUpdate
virtual void OnInitialUpdate( );
//当应用程序被启动,或当用户从File菜单选择了New时候,或当用户从File菜单选择了Open时候,该虚函数都会被自动调用。
//CView基类中的OnInitialUpdate函数除调用OnUpdate函数中没做其它任何事情。如果在派生类中重载该函数一定要调用基类的OnInitialUpdate函数,或调用派生类的OnUpdate函数。
//当应用程序启动时,框架调用视图类的OnCreate函数之后立即调用OnInitialUpdate函数。OnCreate函数只能被调用一次,而OnInitialUpdate可以被调用多次。
//可以通过在派生重载OnInitialUpdate函数,在其中对视图对象进行初始化。
5)CDocument::OnNewDocument
virtual BOOL OnNewDocument( );
//Called by the framework as part of the File New command. The default implementation of this function calls the DeleteContents member function to ensure that the document is empty and then marks the new document as clean. Override this function to initialize the data structure for a new document. You should call the base class version of this function from your override.
//If the user chooses the File New command in an SDI application, the framework uses this function to reinitialize the existing document, rather than creating a new one. If the user chooses File New in a multiple document interface (MDI) application, the framework creates a new document each time and then calls this function to initialize it. You must place your initialization code in this function instead of in the constructor for the File New command to be effective in SDI applications.
3,简单文档视图交互应用程序步骤(单文档单视图):
1)在派生文档类中定义文档的数据成员,用以保存程序中数据。为了方便派生视图类的访问可以将这些数据成员定义成公有类型或将派生视图类定义为派生文档类的友元类。
2)在派生视图类中对OnInitialUpdate虚成员函数进行重载。当文档数据被初始化或被从磁盘中读出后,框架会自动调用OnInittialUpdate函数。该函数对视图进行更新,以便放映出当前的文档数据。
3)在派生视图类中,让窗口消息控制函数和命令消息控制函数直接读取和更新文档数据成员,利用GetDocument函数对文档对象进行访问。
对应事件发生次序:
程序启动: CMyDocument对象被创建->CMyView对象被创建->视图窗口被创建->CMyView::OnCreate函数被调用(如果被映射)->CMyDocument::OnNewDocument函数被调用->CMyView::OnInitialUpdate函数被调用->视图对象被初始化->视图窗口无效->CMyView:OnDraw函数被调用
用户编辑数据: CMyView类中函数对CMyDocument数据成员进行更新
退出程序: CMyView对象被删除->CMyDocument对象被删除
4,CFormView类
CFormView类具有许多无模式对话框的特点,其派生类也和相应的对话框资源相联系,也支持DDX和DDV等。
CFormView类对象可以直接接收来之本身的控制通告消息,也可接收来自框架窗口的命令消息。(同时具有许多无模式类对话框和视图类特征)。
派生层次:CView|CScrolView|CFromView
CFormView类虽然不是从CDialog类派生,但是围绕对话框创建,因而可以使用许多CDialog类成员函数。(这时只需将CFormView指针强制转换成CDialog类指针即可)如:((CDialog*)this)->GotoDlgCtrl(GetDlgItem(IDC_NAME));
5,高级文档视图交互应用程序步骤(单文档多视图):
编写多视图应用程序,只要对其中某一视图编辑改变了文档,则其它的文档需要随之更新,以反映出文档的变化。
步骤:
1)在派生文档类中定义需要的数据成员。同时设计访问该数据成员的方法,或将视图类设计成文档类的友元类。
2)在派生视图类中,利用向导重载OnUpdate虚成员函数。当文档数据被修改后,应用程序框架会自动调用该函数。利用重载的OnUpdate函数来完成视图的更新,以反映当前的文档数据。
3)对所有的命令消息判断其哪些是针对文档的哪些是针对视图的,然后将其映射到相应的类中。
4)在派生视图类中,允许对文档数据进行更改,在退出之前,一定要调用CDocument::UpdateAllViews函数更新其它的视图。使用CView::GetDocument获取相关联的文档对象指针。
5)在派生文档类中,允许对文档数据进行修改,修改后退出前要调用UpdateAllViews函数更新与其关联的所有视图。
对应发生的事件次序:
应用程序启动:CMyDocument对象被创建->CMyView对象被创建->其它视图对象被创建->视图窗口被创建->CMyView::OnCreate函数被调用(如果被映射)->CMyDocument::OnNewDocument函数被调用->CMyView::OnInitialUpdate函数被调用->调用CMyView::OnUpdate->初始化视图
用户编辑数据: 视图类中函数对CMyDocument数据成员进行更新
退出时候调用CDocument::UpdateAllViews函数更新其它的视图
退出程序: 视图对象被删除->CMyDocument对象被删除