VC++的应用程序框架中各类之间的访问方法
Visual C++ 6.0開發(fā)環(huán)境中,我們可以用MFC AppWizard 自動生成一個應用程序
????????????????? 。其中包括了應用類,主邊框窗口類,子邊框窗口類(MDI 應用程序),文檔類
????????????????? 和視 圖類。另外,系統(tǒng)還自動生成了一個文檔模板類對象,它把文檔類,文檔邊
????????????????? 框窗口類(SDI 中的主邊框窗口類或MDI 中的子邊框窗口類),視圖類聯(lián)系在一
????????????????? 起,組成一個有機的整體。
???????????????????? 在一些專業(yè)教材書中,雖然提到了它們之間的關(guān)系,但都沒有全面系統(tǒng)地予
????????????????? 以介 紹。使得初學 VC 的朋友在各類對象之間相互訪問時感到非常困難。筆者經(jīng)
????????????????? 過一段時間 的總結(jié),現(xiàn)將各類對象之間的關(guān)系以及相互之間訪問的方法介紹如下:
???????????????????? 1。應用類對象 :
???????????????????? 應用類對象由應用框架自動生成。雖然在應用類的 cpp 文件中有一個應
????????????????? 用類對象的聲明語句,但該對象卻無法使用。用戶可以通過 CWinApp *
????????????????? AfxGetApp() 全局函數(shù)得到指向應用類對象的指針,由于該函數(shù)返回值為
????????????????? CWinApp * 類型,因此需要進行轉(zhuǎn)換。
?
???????????????????? 用法如下:
???????????????????????? 假設您的應用類名為:CExampleApp。
???????????????????????? CExamlpleApp * p=(CExamlpleApp *)AfxGetApp();
???????????????????????? p 即為指向應用類對象的指針。
???????????????????? 2。主邊框窗口類(CMainFrame):
???????????????????? 主邊框窗口類對象的生成較為復雜,對于 MDI 應用程序,主邊框窗口類對象由應
????????????????? 用類對象在它的 InitInstance()函數(shù)中構(gòu)造生成;對于 SDI 應用程序,主邊框窗口類
????????????????? 對象由文檔模板類構(gòu)造生成。
???????????????????? 用戶可以用下列方式獲得指向主邊框窗口類對象的指針:
??????????????????????? (1).利用全局函數(shù) AfxGetMainWnd().
??????????????????????? (2).通過應用類的 GetMainWnd() 成員函數(shù)或 m_pMainWnd 成員變量。
??????????????????????? (3).對于 MDI 應用程序,還可以通過子邊框窗口類的 GetMIDFrame()成員函數(shù)
????????????????? 得到。
???????????????????? 同理,以上各函數(shù)的返回值也是 CFrameWnd * 類型( SDI 應用程序)或
????????????????? CMDIFrameWnd * 類型( MDI 應用程序),仍需要轉(zhuǎn)換成 CMainFrame * 類型。
???????????????????
????????????????? 注:以下各函數(shù)的返回值均需要轉(zhuǎn)換成相應類的指針類型。下面不再敖述。
????????????????? ? 3. 文檔模板類:
???????????????????? 文檔模板類對象由應用對象在 InitInstance()函數(shù)中構(gòu)造生成。它分為:單文檔
????????????????? 模板類(CSingleDocTemplate)和多文檔模板類(CMultiDocTemplate),分別對應 SDI應
????????????????? 用程序和 MDI應用程序。二者均由CDocTemplate派生。文檔模板類把文檔類,文檔邊框
????????????????? 窗口類(SDI 中的主邊框窗口類或MDI 中的子邊框窗口類),視圖類聯(lián)系為一個有機的
????????????????? 整體。應用類對象通常只生成一個文檔模板類對象 ,不過用戶可以自己生成多個文檔模
????????????????? 板類對象,從而使SDI 也可以打開多個文檔,具有了MDI的特征.所有的文檔模板類對象組
????????????????? 成了一個鏈表,應用類的m_pDocManger 成員變量指向該鏈表。
???????????????????? 用戶可以通過應用類的成員函數(shù) GetFirstDocTemplatePosition()和
????????????????? GetNextDocTemplate(POSITION & pos)來訪問該鏈表:
???????????????????????????? POSITION pos;
???????????????????????????? pos=GetFirstDocTemplatePosition();
???????????????????????????? CDocTemplate * pDocTemplate;
???????????????????????????? pDocTemplate=GetNextDocTemplate(pos);
?????????????????????? pDocTemplate 即是指向第一個文檔模板類對象的指針,用戶還可以繼續(xù)調(diào)用
????????????????? GetNextTemplate()得到下一個文檔模板類對象.
???????????????????? 4。子邊框窗口類(CChildFrame):
???????????????????? 子邊框窗口類是專門針對 MDI 應用程序而言的,它由文檔模板類構(gòu)造生成。對它
????????????????? 的訪問可用以下方式實現(xiàn):
???????????????????? 通過主邊框窗口類的 CFrameWnd * GetActiveFrame() 得到指向該對象的指針。
???????????????????? 5.文檔類:
????????????????????? 文檔類對象由文檔模板類構(gòu)造生成。單文檔模板類只能生成一個文檔類對象,并
????????????????? 用成員變量 m_pOnlyDoc 指向該對象。多文檔模板類可以生成多個文檔類對象,另用成
????????????????? 員變量 m_docList 指向文檔對象組成的鏈表。在 SDI 應用程序中,當我們生成多個單
????????????????? 文檔模板類對象時,就可以打開多個文檔。
????????????????????? 用戶可以通過多文檔模板類對象的成員函數(shù) GetFirstDocPosition() 和
????????????????? GetNextDoc(POSITION &pos) 來訪問文檔對象組成的鏈表:
???????????????????????????? POSITION pos;
???????????????????????????? pos=GetFirstDocPosition();
???????????????????????????? CDocument *pDoc;
???????????????????????????? pDoc=GetNextDoc(pos);
?????????????????????? 另外,文檔類還可以通過其成員函數(shù) CDocTemplate * GetDocTemplate() 返過來
????????????????? 訪問文檔模板類對象.
???????????????????? 對于當前活動的文檔類對象,我們還可以通過以下方式訪問:
???????????????????? (1).通過子邊框窗口(MDI 應用程序)或主邊框窗口(SDI 應用程序)的成員函數(shù)
????????????????? CDocument * GetActiveDocument() 可以得到指向該文檔的指針.
???????????????????? (2).另外視圖類的成員函數(shù) CDocument * GetDocument()以及成員變量
????????????????? m_pDocument 也可以得到指向該文檔的指針.
????????????????????? 6.視圖類:
??????????????????? 視圖類對象是由主邊框窗口(SDI 應用程序)或子邊框窗口(MDI 應用程序)構(gòu)造生成
????????????????? 的.因此它的訪問方式有以下兩種:
???????????????????? (1).對于當前活動的視圖類對象可以由主邊框窗口(SDI 應用程序)或子邊框窗口
????????????????? (MDI 應用程序)的成員函數(shù) CView * GetAcitveView() 來得到該對象的指針.
???????????????????? (2).另外,還可以通過文檔類的成員函數(shù) GetFirstViewPosition() 和
????????????????? CView * GetNextView() 來訪問所有的視圖類對象。
???????????????????? 其用法與上面文檔模板類函數(shù)類似。
???????????????????? 以上各類的成員變量或成員函數(shù)基本上使我們在任何位置都可以訪問到應用程序的
????????????????? 每一個角落,但對于頻繁性地訪問某一固定對象或?qū)\行速度要求較高的場合,我們可以
????????????????? 通過保存該對象的窗口句柄(只限于派生于 CWnd 的類),在需要的時候,通過函數(shù)
????????????????? CWnd::FromHandle(HWND hwnd) 來得到該對象的指針.
轉(zhuǎn)載于:https://www.cnblogs.com/ahuo/archive/2006/12/16/594441.html
總結(jié)
以上是生活随笔為你收集整理的VC++的应用程序框架中各类之间的访问方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 明早1点去青岛,可能要两天不能写博客了
- 下一篇: 犀利的 JavaScript