MFC 多視圖之間的通信

之前以爲單文檔多視圖通信,尤其是視圖中又包含對話框等等控件的時候,就非得通過文檔類做中介,或者只能由視圖傳給屬於自己的對話框控件,實際上只要兩行代碼就可以在工程的任意地方獲取任意視圖的指針!

單文檔多視圖之間的通信
一、一個視圖獲取另一個視圖的指針

這個問題糾結了整整一天,查了很多資料,最後總算是有結果了
總結一下要實現一個視圖獲取另一個視圖的指針有兩種方法
(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));*/
  }
 } 
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章