初识MFC文档视图程序中多视图间的数据交互

MFC的文档/视图结构一直有些不想触及,因为以前在看《MFC Windows程序设计》一书的时候,被搞得晕头转向的。


最近又在MFC下折腾了,折腾了一天做了个分隔窗口的单文档视图程序,分隔出了2个窗口,每个窗口都放了一个CFormView视图。接着就需要考虑这两个CFormView视图之间的数据交互了。


举个简单的例子(在单文档视图程序中),比如我在View1中点击一个按钮,设置View2中CEdit的值。


要实现这个功能,有一个简便的方法,就是直接在View1中先获取文档指针,接着用文档指针遍历查找出View2的视图指针,然后修改CEdit的值。


不过MFC的文档视图程序应该不是这么玩的,应该考虑把程序中的数据都放在文档中,比如我们说到的这个例子,可以在文档中创建一个变量m_szText来存放CEdit的值。


当在View1中需要修改View2中Cedit的值时,首先在View1中获取文档指针,接着修改文档中m_szText的值,然后用UpdateAllView函数通知View2视图更新。


当使用文档类的UpdateAllView函数后,需要更新的视图会响应OnUpdate消息。


此时我们就可以在View2视图的OnUpdate中更新CEdit的值了。


下面来看看实例代码:


1. 在View1中的按钮点击消息


void CView1::OnBtnTestClick()
{


    //获取文档指针
    CMainDoc *pDoc = GetDocument();


    //修改文档中保存CEdit控件值的变量
    pDoc->m_szText = L"测试123";


    //这里的this指针不是告诉文档要更新哪个视图

    //而是告诉文档在哪个视图中更改了文档数据
    pDoc->UpdateAllViews( this );


}


2. 在View2的OnUpdate重载函数中更改CEdit的值


void CView2::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
    // TODO: 在此添加专用代码和/或调用基类
    CMainDoc *pDoc = ( CMainDoc * ) GetDocument();


    //m_szEdtText是与CEdit关联的变量

    m_szEdtText = pDoc->m_szText;


    //拷贝控件关联变量中的值到控件,并显示

    UpdateData( FALSE );
}

发布了64 篇原创文章 · 获赞 11 · 访问量 14万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章