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