初識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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章