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 );
}