在MFC類中各種類的指針的獲取和應用

 

關於MFC下的文檔和視圖以及框架之間的訪問, 這些問題已經是老生常談了,但我覺得還是都沒有詳細的說明,特

別是對於英語較差的人,我查看了一些blog,總結了一下!希望對和我一樣的人有點幫助!
 一:
      1:   因爲對於SDI程序,主框架窗口就是文檔框窗(如果這個也不知道,就要查看一下MFC下的單文檔的構成原理了).
          下面所說的是關於單文檔的.          
         
        例子:  在CMainFrame框架中如何得到視圖類的指針.
                    可以 先得到框架指針,然後調用 GetActiveView 函數指向當前活動視. 
 

       CView* pView;
                  pView
=(CView*)((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;
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();

 
  1.   從視圖類獲得文檔類的指針 
            在視圖類中需要引用文檔類的地方之前,使用以下語句:
     

CDocument* pDoc=(CDocument*)GetDocument();


     以後便可使用pDoc指針訪問文檔類。
 2.    從文檔類取得視圖類的指針 CDocument類提供了兩個函數用於視圖類的定位:

   GetFirstViewPosition()和GetNextView()

 注意:GetNextView()括號中的參數用的是引用方式,因此執行後值可能改變.GetFirstViewPosition()用於

返回第一個視圖位置(返回的並非視圖類指針,而是一個POSITION類型值),GetNextView()有兩個功能:返回下一個視圖類的指針以及用引用調動的方式來改變傳入的POSITION類型參數的值。很明顯,在Test程序中,只有一個視圖類,因此只需將這兩個函數調用一次即可得到CTestView的指針如下(需定義一個POSITION結構變量來輔助操作):

    CView* pView;
  POSITION pos
=GetFirstViewPosition();
  pView
=GetNextView(pos);

這樣,便可到了C*View類的指針pView.執行完成幾句後,變量pos=NULL,因爲沒有下一個視圖類,自然也沒有下一個視圖類的POSITION.但是之幾條語句太簡單,不具有太強的通用性和安全特徵;當象前面說的那樣,當要在多個視圖爲中返回某個指定類的指針時,我們需要遍歷所有視圖類,直到找到指定類爲止。判斷一個類指針指向的是否某個類的實例時,可用IsKindOf()成員函數時行檢查.

如:

 pView->IsKindOf(RUNTIME_CLASS(CView));


 即可檢查pView所指是否是CView類。
有了以上基礎,我們已經可以從文檔類取得任何類的指針。爲了方便,我們將其作爲一個文檔類的成員函數,它有一個參數,表示要獲得哪個類的指針。實現如下:

其中用了兩次視圖類的成員函數IsKindOf()來判斷,是因爲退出while循環有三種可能:
1.pos爲NULL,即已經不存在下一個視圖類供操作;
2.pView已符合要求。
3.1和2同是滿足。這是因爲GetNextView()的功能是將當前視圖指針改變成一個視圖的位置同時返回當前視圖指針,因此pos是pView的下一個視圖類的POSITION,完全有可能既是pos==NULL又是pView符合需要。當所需的視圖是最後

一個視圖是最後一個視圖類時就如引。因此需採用兩次判斷。
使用該函數應遵循如下格式(以取得CTestView指針爲例):
CTestView* pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView));
RUNTIME_CLASS是一個宏,可以簡單地理解它的作用:將類的名字轉化爲CRuntimeClass爲指針。
至於強制類型轉換也是爲了安全特性考慮的,因爲從同一個基類之間的指針類型是互相兼容的。這種強制類型轉換也許並不必要,但能避免一些可能出現的麻煩

CView* CDocument::GetView(CRuntimeClass* pClass)
 
{ CView* pView;
 POSITION pos
=GetFirstViewPosition();
 
while(pos!=NULL){
 pView
=GetNextView(pos);
 
if(!pView->IsKindOf(pClass))
 
break;}

 
if(!pView->IsKindOf(pClass)){
 AfxMessageBox(
"Connt Locate the View.");
 
return NULL;}

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