一、文档类处理数据
1、通过消息处理传递数据,并用UpdateAllViews刷新和文档对象关联的所有视图类对象
classCMyDoc :public CDocument { DECLARE_MESSAGE_MAP() public: CString str; afx_msg voidxinjian(); }; BEGIN_MESSAGE_MAP(CMyDoc, CDocument) ON_COMMAND(ID_XJ,xinjian) END_MESSAGE_MAP() void CMyDoc::xinjian() { //模拟接收数据 this->str = "hello word"; //调用视图类onupdate this->UpdateAllViews(NULL); }
2、由于调用了updateallviews函数,所以需要在视图类窗口重写该函数
声明函数
virtualvoidOnUpdate(CView* pSender, LPARAM lHint, CObject* pHint); 实现函数 void CMyView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) { CMyDoc* pDoc =(CMyDoc*) this->m_pDocument; //效果一样 //CMyDoc* pDoc =(CMyDoc*) this->GetDocument(); this->SetWindowText(pDoc->str); }
3、点击新建,运行结果
对象关系图
theApp |->m_pMainWnd ( pFrame ) |->m_pViewActive ( pView ) |->m_pDocument ( 文档类对象地址 ) |->m_viewList
切割视图窗口
1、创建一个对象CSplitterWnd
CSplitterWnd split;
2、在框架窗口声明OnCreateClient函数
virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
3、重写该函数
BOOLCMyFrameWnd::OnCreateClient(LPCREATESTRUCT lpcs,CCreateContext* pContext) { split.CreateStatic(this, 2, 1); split.CreateView(0,0,RUNTIME_CLASS(CMyView),CSize(100,100),pContext); split.CreateView(1, 0, RUNTIME_CLASS(CMyView), CSize(100, 100), pContext); returnTRUE; }
4、运行效果
只刷新一个窗口
1、获取相应视图的对象
void CMyDoc::xinjian() { //模拟接收数据 this->str = "hello word"; //获取链表迭代器m_viewList POSITION pos = GetFirstViewPosition(); //获取第一个视图窗口的对象 CView* pView = GetNextView(pos); //再掉一次获取第二个视图的对象 pView = GetNextView(pos); //填写那个对象不刷新那个对象 this->UpdateAllViews(pView); //调用视图类onupdate,全部刷新 //this->UpdateAllViews(NULL); }
2、运行结果