SDI和MDI獲得文檔和視圖對象的方法

一.因爲對於SDI程序,主框架窗口就是文檔框窗(如果這個也不知道,就要查看一下MFC下的單文檔的構成原理了).           下面所說的是關於單文檔的. 

例子: 在CMainFrame框架中如何得到視圖類的指針.可以 先得到框架指針,然後調用 GetActiveView 函數指向當前活動視. C...View * pView;  pView=(C...View*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveView();當然這些也許都知道是這麼用的,但真正的m_pMainWnd和AfxGetApp()是什麼意思也許有的人不明白. 大家也許都知道如何在App中獲得MainFrame指針(框架類): CWinApp 中的 m_pMainWnd變量就是CMainFrame的指針.所以在別的類下也可以先得到m_pMainWnd,就得到了MainFrame的指針. 所以得到視圖類的指針,必先得到CFrameWnd的指針m_pMainWnd,然後在調用FrameWnd下的GetActiveView 就指向當前活動視圖. 

m_pMainWnd的由來: 每一個MFC應用程序都有一個CWinApp派生類的對象。這個對象對應着程序的主線程。而 CWinApp 類中有一個 CWnd * m_pMainWnd 成員變量。這個成員變量記錄了應用程序的主窗口。 當你新建一個MFC應用程序的時候,在 InitInstance虛函數裏都會出現對 m_pMainWnd 賦值的語句.唯一的例外是單文檔界面的MFC應用程序,你無法在 InitInstance 函數裏看到這段代碼,因爲它已經被隱藏在 ProcessShellCommand 這個函數裏了。由此你就可以下結論:只要創建自己的窗口類,就要把這個類的對象賦值給 m_pMainWnd .而這個成員只能在C...APP類中才可以使用,所以怎樣使用這個CWinApp類裏的CWnd 類型的變量來得到主框架窗口的指針呢? AfxGetApp函數纔可以 , 因爲AfxGetApp()得到的是CWinApp類的對象,且AfxGetApp返回值爲CWinApp對象指針,就是MFC生成的C**App.cpp中定義的那個對象(對象theApp的指針)。 因爲你是在自己創建的項目中得到CWndApp成員函數或者成員變量,所以你必須強制轉換爲你自己的項目中的類,才能找到成員函數或者變量. 注: 在單文檔中,獲得視圖指針的最簡單的方法還是 ((C**View *)CFrameWnd::GetActiveView()) 
    2.當然在FrameWnd中也可以得到文檔類的指針:  
CMyDocument* pDoc; 

 pDoc=(CMyDocument*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveDocument();          

3. 由上面可以知道:在View中怎樣獲得MainFrame指針 CMainFrame *pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;

注: 從視圖類中獲得主窗口類指針:用函數:CWnd::GetParentFrame()或AfxGetMainWnd()也 可達到目的。GetParentFrame()的工作原理是在父窗口鏈中搜索,直到找到CFrameWnd或其派生類爲止,並返回其指針。

((CMainFrame *)CWnd::GetParentFrame()) 或者 ((CMainFrame *)AfxGetMainWnd())          
二: 當然對於MDI程序,由於子窗口才是文檔框窗,因此首先要用GetActiveFrame()取得活動子框架窗口,然後通過該子窗口獲取活動視圖和文檔:

CMDIChildWnd* pChild=

(CMDIChildWnd*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveFrame(); 

取得活動視圖: CMyView* pView=(CMyView*)pChild->GetActiveView();

取得活動文檔: CMyDocument* pDoc=pChild->GetActiveDocument();

注: 也可以用這種方法來得到多文檔中的視圖指針

 //獲得活動子框架窗口 CMDIChildWnd* pChild=(CMDIChildWnd*)GetActiveFrame(); //或: CMDIChildWnd* pChild=MDIGetActive();

 //獲得活動子窗口的活動視圖 

CMyView* pView=(CMyView*)pChild->GetActiveView();

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