轉自http://www.cnblogs.com/areliang/archive/2011/11/17/2252901.html
MainFrame: 主框架類
Dlg 是Dialog 的縮寫,表示對話框本身
App類就是這個SDI作爲"程序"的入口,有點像c的Main函數,它不是從CWND中派生出來的。App表示應用程序本身。
View表示視圖類,負責顯示數據,提供編輯數據、修改數據的功能。它是指編輯區裏面的事就是那塊白色的中間區域,負責繪製和響應一些消息
Doc表示文檔類,提供對數據的保存和加載。有點像數據庫,保存着編輯數據,用於view的Redraw的時候用,還有保存文件。
一般動態的編輯數據都放在Doc裏面。他也不是從CWND中派生出來的,沒有繼承MessageBox函數,可以用AfxMessageBox函數。
1) 在View中獲得Doc指針
2) 在App中獲得MainFrame指針
3) 在View中獲得MainFrame指針
4) 獲得View(已建立)指針
5) 獲得當前文檔指針
6) 獲得狀態欄與工具欄指針
7) 獲得狀態欄與工具欄變量
8) 在Mainframe獲得菜單指針
9) 在任何類中獲得應用程序類
10) 從文檔類取得視圖類的指針(1)
11) 在App中獲得文檔模板指針
12) 從文檔模板獲得文檔類指針
13) 在文檔類中獲得文檔模板指針
14) 從文檔類取得視圖類的指針(2)
15) 從一個視圖類取得另一視圖類的指針
VC中編程對於剛剛開始學習的同學,最大的障礙和問題就是消息機制和指針獲取與操作。其實這些內容基本上是每本VC學習工具書上必講的內容,而且通過MSDN很多問題都能解決。下面文字主要是個人在編程中指針使用的一些體會,說的不當的地方請指正。一般我們使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,無論是多文檔還是單文檔,都存在指針獲取和操作問題。下面這節內容主要是一般的框架,然後再講多線程中的指針使用。使用到的類需要包含響應的頭文件。首先一般獲得本類(視,文檔,對話框都支持)實例指針this,用this的目的,主要可以通過類中的函數向其他類或者函數中髮指針,以便於在非本類中操作和使用本類中的功能。
1) 在View中獲得Doc指針
CYouSDIDoc *pDoc=GetDocument();一個視只能有一個文檔。
2) 在App中獲得MainFrame指針
CWinApp 中的 m_pMainWnd變量就是MainFrame的指針
也可以: CMainFrame *pMain =(CMainFrame *)AfxGetMainWnd();
3) 在View中獲得MainFrame指針
CMainFrame *pMain=(CmaimFrame *)AfxGetApp()‐>m_pMainWnd;
4) 獲得View(已建立)指針
CMainFrame *pMain=(CmaimFrame *)AfxGetApp()‐>m_pMainWnd;
CyouView *pView=(CyouView *)pMain‐>GetActiveView();
5) 獲得當前文檔指針
CDocument * pCurrentDoc =(CFrameWnd *)m_pMainWnd‐>GetActiveDocument();
6) 獲得狀態欄與工具欄指針
CStatusBar * pStatusBar=(CStatusBar *)AfxGetMainWnd()‐>GetDescendantWindow(AFX_IDW_STATUS_BAR);
CToolBar * pToolBar=(CtoolBar *)AfxGetMainWnd()‐>GetDescendantWindow(AFX_IDW_TOOLBAR);
7) 如果框架中加入工具欄和狀態欄變量還可以這樣
(CMainFrame *)GetParent()‐>m_wndToolBar;
(CMainFrame *)GetParent()‐>m_wndStatusBar;
8) 在Mainframe獲得菜單指針
CMenu *pMenu=m_pMainWnd‐>GetMenu();
9) 在任何類中獲得應用程序類
用MFC全局函數AfxGetApp()獲得。
10) 從文檔類取得視圖類的指針
我是從http://download.cqcnc.com/soft/program/article/vc/vc405.html學到的,
從文檔獲得視圖類指針目的一般爲了控制同一文檔的多個視圖的定位問題,我的體會
特別是文字處理CEditView當產生多個視圖類時,這個功能是非常需要的。
CDocument類提供了兩個函數用於視圖類的定位:
GetFirstViewPosition()和GetNextView()
virtual POSITION GetFirstViewPosition() const;
virtual CView* GetNextView(POSITION& rPosition) const;
注意:GetNextView()括號中的參數用的是引用方式,因此執行後值可能改變。
GetFirstViewPosition()用於返回第一個視圖位置(返回的並非視圖類指針,而是一
個POSITION類型值),GetNextView()有兩個功能:返回下一個視圖類的指針以及用
引用調用的方式來改變傳入的POSITION類型參數的值。很明顯,在Test程序中,只有
一個視圖類,因此只需將這兩個函數調用一次即可得到CTestView的指針如下(需定
義一個POSITION結構變量來輔助操作):
CTestView* pTestView;
POSITION pos=GetFirstViewPosition();
pTestView=GetNextView(pos);
這樣,便可到了CTestView類的指針pTestView.執行完幾句後,變量pos=NULL,因爲沒
有下一個視圖類,自然也沒有下一個視圖類的POSITION.但是這幾條語句太簡單,不
具有太強的通用性和安全特徵;當象前面說的那樣,當要在多個視圖爲中返回某個指
定類的指針時,我們需要遍歷所有視圖類,直到找到指定類爲止。判斷一個類指針指
向的是否某個類的實例時,可用IsKindOf()成員函數時行檢查,如:
pView‐>IsKindOf(RUNTIME_CLASS(CTestView));
即可檢查pView所指是否是CTestView類。
有了以上基礎,我們已經可以從文檔類取得任何類的指針。爲了方便,我們將其作
爲一個文檔類的成員函數,它有一個參數,表示要獲得哪個類的指針。實現如下:
其中用了兩次視圖類的成員函數IsKindOf()來判斷,是因爲退出while循環有三種
可能:
1.pos爲NULL,即已經不存在下一個視圖類供操作;
2.pView已符合要求。
1和2同是滿足。這是因爲GetNextView()的功能是將當前視圖指針改變成一個視圖
的位置同時返回當前視圖指針,因此pos是pView的下一個視圖類的POSITION,完全
有可能既是pos==NULL又是pView符合需要。當所需的視圖是最後一個視圖是最後一
個視圖類時就如引。因此需採用兩次判斷。
使用該函數應遵循如下格式(以取得CTestView指針爲例):
CTestView* pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView));
RUNTIME_CLASS是一個宏,可以簡單地理解它的作用:將類的名字轉化爲
CRuntimeClass爲指針。至於強制類型轉換也是爲了安全特性考慮的,因爲從同一個
基類之間的指針類型是互相兼容的。這種強制類型轉換也許並不必要,但能避免一
些可能出現的麻煩。
3.從一個視圖類取得另一視圖類的指針 綜合1和2,很容易得出視圖類之間互相獲得
指針的方法:就是用文檔類作中轉,先用1的方法得到文檔類的指針,再用2的方法,
以文檔類的視圖定位函數取得另一個視圖類。同樣,可以實現成一個函數:
(假設要從CTestAView中取得指向其它視圖類的指針)
這個函數和2中的GetView()相比,一是多了第一句以取得文檔類指針,二是在
GetFirstViewPosition()和GetNextView()前加上了文檔類指針,以表示它們是文檔
類成員函數。有了此函數;當要從CTestAView中取得CTestBView的指針時,只需如
下:CTestBView* pTestbView=(CTestView*)GetView(RUNTIME_CLASS(CTestBView));