MFC 多视图之间的通信

之前以为单文档多视图通信,尤其是视图中又包含对话框等等控件的时候,就非得通过文档类做中介,或者只能由视图传给属于自己的对话框控件,实际上只要两行代码就可以在工程的任意地方获取任意视图的指针!

单文档多视图之间的通信
<http://topic.csdn.net/u/20091002/12/44e64420-3c37-4632-b120-674ac31dbf9e.html>
<http://www.ciscosky.org/program/visualc/WenDangYuShiTuDeJianLiHeGuanLian.htm>
http://www.pcnetfan.com/viewnews-32679.html

一、一个视图获取另一个视图的指针(0531)
这个问题纠结了整整一天,查了很多资料,最后总算是有结果了
总结一下要实现一个视图获取另一个视图的指针有两种方法
(1)
CMainFrame* pMainFrame=(CMainFrame*)this->GetParent()->GetParent(); //定位主窗口
DevListView* p=(DevListView*)pMainFrame->m_wndSplitter1.GetPane(0,0); //定位视图窗口view4
(2)
CMainFrame* pMainFrame=(CMainFrame*)AfxGetMainWnd(); //定位主窗口
DevListView* devListView=(DevListView*)pMainFrame->m_wndSplitter1.GetPane(0,0); //定位视图窗口view4

第一种方法在我的程序里没语法错误,运行的时候崩溃,第二种是好的,究竟是什么原因,偶也不知道
其实不一定是视图类可以获取,项目里面任意一个类都可以用这种方法来获取任何一个视图类的指针


二、通过文档类进行通信 下面是最简单的通过文档来获取视图中的信息
http://blog.sina.com.cn/s/blog_56191bed010009s1.html
class CTestDoc : public CDocument
{
public:
CStringArray infoArray[4];//列表数组
bool add;//添加标志
};
在设置值的函数中
例如如下的双击函数中
void DeviceView::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
//ShellExecute(NULL,_T("open"),DEFAULTPATH,NULL,NULL,SW_SHOWNORMAL);
CTestDoc* pDoc =(CTestDoc*)GetDocument();//获取文档指针
pDoc->infoArray[0].InsertAt(0,DEFAULTPATH);
pDoc->add=true;//添加了数据
pDoc->UpdateAllViews(NULL);//更新所有视图
*pResult = 0;
}
在需要信息的视图中
void DeviceInfoView::OnInitialUpdate()//初始化
{
CListView::OnInitialUpdate();
CListCtrl& listctrl=GetListCtrl();//获取列表视控件
listctrl.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_UNDERLINEHOT);//|LVS_EX_GRIDLINES
//CString m_ColumnLabelStr[] ={"设备名称","设备描述"};//表头字段

m_DevInfoImageList.Create(32,32,ILC_COLOR32,10,30);//创建图像列表
listctrl.SetImageList(&m_DevInfoImageList,LVSIL_NORMAL);
listctrl.SetBkColor(RGB(255,255,255));

int i=0;
listctrl.InsertItem(i,DEFAULTPATHTEST);
// TODO: 在此添加专用代码和/或调用基类
}
更新获取需要的值
void DeviceInfoView::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/)
{
// TODO: 在此添加专用代码和/或调用基类
CTestDoc* pDoc =(CTestDoc*)GetDocument();//获取文档指针
if(pDoc->add)//添加了数据
{
CListCtrl& listctrl=GetListCtrl();//获取列表控件
listctrl.DeleteAllItems();//删除所有项
for(int i=0;i<pDoc->infoArray[0].GetSize();i++)//列表框中插入数据
{
listctrl.InsertItem(i,pDoc->infoArray[0].GetAt(i));
/*listctrl.SetItemText(i,1,pDoc->infoArray[1].GetAt(i));
listctrl.SetItemText(i,2,pDoc->infoArray[2].GetAt(i));
listctrl.SetItemText(i,3,pDoc->infoArray[3].GetAt(i));*/
}
}
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值