MFC 多视图之间的通信

来源:互联网 发布:imap端口号 编辑:程序博客网 时间:2024/06/09 21:19

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

单文档多视图之间的通信
一、一个视图获取另一个视图的指针

这个问题纠结了整整一天,查了很多资料,最后总算是有结果了
总结一下要实现一个视图获取另一个视图的指针有两种方法
(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

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


二、通过文档类进行通信 下面是最简单的通过文档来获取视图中的信息

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

原创粉丝点击