VC++的應用程序框架中各類之間的訪問方法

Visual C++ 6.0開發環境中,我們可以用MFC AppWizard 自動生成一個應用程序
。其中包括了應用類,主邊框窗口類,子邊框窗口類(MDI 應用程序),文檔類
和視 圖類。另外,系統還自動生成了一個文檔模板類對象,它把文檔類,文檔邊
框窗口類(SDI 中的主邊框窗口類或MDI 中的子邊框窗口類),視圖類聯繫在一
起,組成一個有機的整體。
在一些專業教材書中,雖然提到了它們之間的關係,但都沒有全面系統地予
以介 紹。使得初學 VC 的朋友在各類對象之間相互訪問時感到非常困難。筆者經
過一段時間 的總結,現將各類對象之間的關係以及相互之間訪問的方法介紹如下:
1。應用類對象 :
  應用類對象由應用框架自動生成。雖然在應用類的 cpp 文件中有一個應
用類對象的聲明語句,但該對象卻無法使用。用戶可以通過 CWinApp *
AfxGetApp() 全局函數得到指向應用類對象的指針,由於該函數返回值爲
CWinApp * 類型,因此需要進行轉換。
用法如下:
假設您的應用類名爲:CExampleApp。
CExamlpleApp * p=(CExamlpleApp *)AfxGetApp();
p 即爲指向應用類對象的指針。
2。主邊框窗口類(CMainFrame):
  主邊框窗口類對象的生成較爲複雜,對於 MDI 應用程序,主邊框窗口類對象由應
用類對象在它的 InitInstance()函數中構造生成;對於 SDI 應用程序,主邊框窗口類
對象由文檔模板類構造生成。
用戶可以用下列方式獲得指向主邊框窗口類對象的指針:
(1).利用全局函數 AfxGetMainWnd().
(2).通過應用類的 GetMainWnd() 成員函數或 m_pMainWnd 成員變量。
(3).對於 MDI 應用程序,還可以通過子邊框窗口類的 GetMIDFrame()成員函數
得到。
同理,以上各函數的返回值也是 CFrameWnd * 類型( SDI 應用程序)或
CMDIFrameWnd * 類型( MDI 應用程序),仍需要轉換成 CMainFrame * 類型。


注:以下各函數的返回值均需要轉換成相應類的指針類型。下面不再敖述。


  3. 文檔模板類:
文檔模板類對象由應用對象在 InitInstance()函數中構造生成。它分爲:單文檔
模板類(CSingleDocTemplate)和多文檔模板類(CMultiDocTemplate),分別對應 SDI應
用程序和 MDI應用程序。二者均由CDocTemplate派生。文檔模板類把文檔類,文檔邊框
窗口類(SDI 中的主邊框窗口類或MDI 中的子邊框窗口類),視圖類聯繫爲一個有機的
整體。應用類對象通常只生成一個文檔模板類對象 ,不過用戶可以自己生成多個文檔模
板類對象,從而使SDI 也可以打開多個文檔,具有了MDI的特徵.所有的文檔模板類對象組
成了一個鏈表,應用類的m_pDocManger 成員變量指向該鏈表。
用戶可以通過應用類的成員函數 GetFirstDocTemplatePosition()和
GetNextDocTemplate(POSITION & pos)來訪問該鏈表:
POSITION pos;
pos=GetFirstDocTemplatePosition();
CDocTemplate * pDocTemplate;
pDocTemplate=GetNextDocTemplate(pos);
pDocTemplate 即是指向第一個文檔模板類對象的指針,用戶還可以繼續調用
GetNextTemplate()得到下一個文檔模板類對象.
4。子邊框窗口類(CChildFrame):
子邊框窗口類是專門針對 MDI 應用程序而言的,它由文檔模板類構造生成。對它
的訪問可用以下方式實現:
通過主邊框窗口類的 CFrameWnd * GetActiveFrame() 得到指向該對象的指針。
5.文檔類:
文檔類對象由文檔模板類構造生成。單文檔模板類只能生成一個文檔類對象,並
用成員變量 m_pOnlyDoc 指向該對象。多文檔模板類可以生成多個文檔類對象,另用成
員變量 m_docList 指向文檔對象組成的鏈表。在 SDI 應用程序中,當我們生成多個單
文檔模板類對象時,就可以打開多個文檔。
用戶可以通過多文檔模板類對象的成員函數 GetFirstDocPosition() 和
GetNextDoc(POSITION &pos) 來訪問文檔對象組成的鏈表:
POSITION pos;
pos=GetFirstDocPosition();
CDocument *pDoc;
pDoc=GetNextDoc(pos);
另外,文檔類還可以通過其成員函數 CDocTemplate * GetDocTemplate() 返過來
訪問文檔模板類對象.
對於當前活動的文檔類對象,我們還可以通過以下方式訪問:
(1).通過子邊框窗口(MDI 應用程序)或主邊框窗口(SDI 應用程序)的成員函數
CDocument * GetActiveDocument() 可以得到指向該文檔的指針.
(2).另外視圖類的成員函數 CDocument * GetDocument()以及成員變量
m_pDocument 也可以得到指向該文檔的指針.
6.視圖類:
視圖類對象是由主邊框窗口(SDI 應用程序)或子邊框窗口(MDI 應用程序)構造生成
的.因此它的訪問方式有以下兩種:
(1).對於當前活動的視圖類對象可以由主邊框窗口(SDI 應用程序)或子邊框窗口
(MDI 應用程序)的成員函數 CView * GetAcitveView() 來得到該對象的指針.
(2).另外,還可以通過文檔類的成員函數 GetFirstViewPosition() 和
CView * GetNextView() 來訪問所有的視圖類對象。
其用法與上面文檔模板類函數類似。
以上各類的成員變量或成員函數基本上使我們在任何位置都可以訪問到應用程序的
每一個角落,但對於頻繁性地訪問某一固定對象或對運行速度要求較高的場合,我們可以
通過保存該對象的窗口句柄(只限於派生於 CWnd 的類),在需要的時候,通過函數
CWnd::FromHandle(HWND hwnd) 來得到該對象的指針.  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章