MFC類中獲得其它類指針_百度文庫_第1頁
MFC類中獲得其它類指針_百度文庫_第2頁
MFC類中獲得其它類指針_百度文庫_第3頁
MFC類中獲得其它類指針_百度文庫_第4頁
MFC類中獲得其它類指針_百度文庫_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、MFC類中獲得其它類指針當(dāng)用VC+的Application Wizard生成除了 CDialog Basiced以外的應(yīng)用程序時(shí),將 自動(dòng)產(chǎn)生視圖類、文檔類、主幀窗口類、應(yīng)用程序類等等。一般來說,程序的核心 數(shù)據(jù)及操作在文檔類中實(shí)現(xiàn)。跟界面有關(guān)的數(shù)據(jù)及操作在視圖類中實(shí)現(xiàn)。當(dāng)需要在 某個(gè)類中使用不屬于該類的數(shù)據(jù)時(shí),必須要取得該數(shù)據(jù)所屬類的指針。從視圖類獲 得文檔類的指針是很容易的,用 GetDocument即可,這在一般的MFC文檔中有介 紹,也是編程中極為常用的的操作,比如視圖類在進(jìn)行重畫等操作時(shí),往往要用到 文檔類中的數(shù)據(jù)。然而只能從視圖類獲得文檔類的指針是遠(yuǎn)遠(yuǎn)不夠的,每個(gè)類都有 獲得其它各

2、個(gè)類指針的一套方法,現(xiàn)歸納如下:為方便說明,現(xiàn)假設(shè)已用 Application Wizard生成一個(gè)SDI應(yīng)用程序Test,包含如 一幾個(gè)類:CTestApp,CTestDoc,CTestView,CMainFrm.字用 71 .從視圖類獲得文檔類的指針字用8如前所述,在視圖類中需要引用文檔類的地方之前,使用以下語句:CTextDoc*pDoc=(CTestDoc*GetDocument(;以后便可使用pDoc指針訪問文檔類。此處的強(qiáng)制類型轉(zhuǎn)換在Test應(yīng)用程序中并不必需,因?yàn)樵摮绦蛑兄挥幸粋€(gè)視圖 類,并且在Initstance(中用SDI文檔模板進(jìn)行了裝配,你可以在 Test.cpp中的 I

3、nitstanceCT法中看到以下語句:CSingleDocTemplate*pDocTemplate;pDocTemplate=newCSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CTestDoc,RUNTIME_ CLASS(CMainFrame,RUNTIME_CLASS(CTestView;AddDocTemplate(pDocTemplate;以及TestView.h中的線上定義:inline CTestDoc*CTestView二GetDocument(return(CTestDoc*m_pDocument;簡(jiǎn)而言之,就是說 CTes

4、tView的GetDocument(函數(shù)自然而然地認(rèn)為 CTestDoc是與 它相配”的,當(dāng)生成了一個(gè)具有多個(gè)視圖類的應(yīng)用程序時(shí)(如用 CSplitterWnd將窗 口分為兩欄,但這兩欄并非從同一種視圖類派生就屬于這種情況。具體實(shí)現(xiàn)在本文討論范圍之外),只有一個(gè)視圖類能與唯一的文檔類用文檔模板進(jìn)行裝配,那么在 另外一個(gè)未經(jīng)裝配的類中要取得文檔類的指針,則需時(shí)行強(qiáng)制類型轉(zhuǎn)換。字用92 .從文檔類取得視圖類的指針字用 7CDocument類提供了兩個(gè)函數(shù)用于視圖類的定位:GetFirstViewPosition(和GetNextView(,具體語法如下:virtual POSITION GetFi

5、rstViewPosition(const;virtual CView*GetNextView(POSITION&rPositionconst;注意:GetNextView(括號(hào)中的參數(shù)用的是引用方式,因此執(zhí)行后值可能改變。GetFirstViewPosition(用于返回第一個(gè)視圖位置(返回的并非視圖類指針,而是一 個(gè)POSITION類型值),GetNextView(有兩個(gè)功能:返回下一個(gè)視圖類的指針以及 用引用調(diào)動(dòng)的方式來改變傳入的 POSITION類型參數(shù)的值。很明顯,在 Test程序 中,只有一個(gè)視圖類,因此只需將這兩個(gè)函數(shù)調(diào)用一次即可得到CTestView的指針如下(需定義一

6、個(gè)POSITION結(jié)構(gòu)變量來輔助操作):CTestView*pTestView;POSITION pos=GetFirstViewPosition(;pTestView=GetNextView(pos;這樣,便可到了 CTestView類的指針pTestView.執(zhí)行完成幾句后,變量pos=NULL, 因?yàn)闆]有下一個(gè)視圖類,自然也沒有下一個(gè)視圖類的POSITION.字用4但是之幾條語句太簡(jiǎn)單,不具有太強(qiáng)的通用性和安全特征;當(dāng)象前面說的那樣,當(dāng) 要在多個(gè)視圖為中返回某個(gè)指定類的指針時(shí),我們需要遍歷所有視圖類,直到找到 指定類為止。判斷一個(gè)類指針指向的是否某個(gè)類的實(shí)例時(shí),可用 IsKindOf(成

7、員函 數(shù)時(shí)行檢查,如:pView->IsKindOf(RUNTIME_CLASS(CTestView;即可檢查pView所指是否是CTestView類。有了以上基礎(chǔ),我們已經(jīng)可以從文檔類取得任何類的指針。為了方便,我們將其作 為一個(gè)文檔類的成員函數(shù),它有一個(gè)參數(shù),表示要獲得哪個(gè)類的指針。實(shí)現(xiàn)如下:CView*CTestDoc:GetVieww(CRuntimeClass*pClassCView*pView;POSITION pos=GetFirstViewPosition(;while(pos!=NULLpView=GetNextView(pos;if(pView->IsKindO

8、f(pClassbreak;字用3if(!pView->IsKindOf(pClassreturn NULL;return pView;其中用了兩次視圖類的成員函數(shù)IsKindOf(來判斷,是因?yàn)橥顺鰓hile循環(huán)有三種 可能:1 .pos為NULL,即已經(jīng)不存在下一個(gè)視圖類供操作;2 .pView已符合要求。3.1和2同是滿足。這是因?yàn)镚etNextView(的功能是將當(dāng)前視圖指針改變成一個(gè)視 圖的位置同時(shí)返回當(dāng)前視圖指針,因此 pos是pView的下一個(gè)視圖類的POSITION, 完全有可能既是pos=NULL又是pView符合需要。當(dāng)所需的視圖是最后一個(gè)視圖 是最后一個(gè)視圖類時(shí)就如

9、引。因此需采用兩次判斷。使用該函數(shù)應(yīng)遵循如下格式(以取得CTestView指針為例):CTestView*pTestView=(CTestView*GetView(RUNTIME_CLASS(CTestView;RUNTIME_CLASS是一個(gè)宏,可以簡(jiǎn)單地理解它的作用:將類的名字轉(zhuǎn)化為 CRuntimeClass 為指針。至于強(qiáng)制類型轉(zhuǎn)換也是為了安全特性考慮的,因?yàn)閺耐粋€(gè)基類之間的指針類型是 互相兼容的。這種強(qiáng)制類型轉(zhuǎn)換也許并不必要,但能避免一些可能出現(xiàn)的麻煩。字 用63 .從一個(gè)視圖類取得另一視圖類的指針字用8綜合1和2,很容易得出視圖類之間互相獲得指針的方法:就是用文檔類作中轉(zhuǎn),先用1

10、的方法得到文檔類的指針,再用 2的方法,以文檔類的視圖定位函數(shù)取得另 一個(gè)視圖類。同樣,可以實(shí)現(xiàn)成一個(gè)函數(shù):(假設(shè)要從CTestAView中取得指向其它視圖類的指針)CView*CTestAView:GetView(CRuntimeClass*pClassCTestDoc*pDoc=(CTestDoc*GetDocument(;CView*pView;POSITION pos=pDoc->GetFirstViewPosition(;while(pos!=NULLpView=pDoc->GetNextView(pos;if(pView->IsKindOf(pClassbreak

11、;if(!pView->IsKindOf(pClass 字用 8return NULL;return pView;這個(gè)函數(shù)和2中的GetView(相比,一是多了第一句以取得文檔類指針,二是在 GetFirstViewPosition(和GetNextView(前加上了文檔類指針,以表示它們是文檔類 成員函數(shù)。有了此函數(shù);當(dāng)要從 CTestAView中取得CTestBView的指針時(shí),只需如下:CTestBView*pTestbView=(CTestView*GetView(RUNTIME_CLASS(CTestBView;字用24 .從主幀窗口類獲得視圖類指針字用5對(duì)本文所舉的Test這

12、各SDI程序來說,這是簡(jiǎn)單的,只需用 CFrameWnd類的 GetActiveView(成員函數(shù)即可。格式如下:CFrameWnd:GetActiveView(但將此函數(shù)應(yīng)用在MDI應(yīng)用的CMDIFrameWnd為中時(shí),并不象所想的那樣獲得當(dāng) 前活動(dòng)子窗口的視圖類,而是返回 NULL ,這是一個(gè)要領(lǐng)性問題。在 MDI程序 中,CMDIFrameWnd沒有和任何視圖類發(fā)生關(guān)系,也就是說沒有視圖類直接屬于 它,只有子幀窗口類CMDIChildWnd才是所有子窗口視圖類的父窗口。而子幀窗 口的父窗口才是CFrameWnd。因此,在MDI程序中獲得活動(dòng)視圖類的正確方法應(yīng) 為:先獲得活動(dòng)子幀窗口,再從

13、活動(dòng)子幀窗口中獲得活動(dòng)視圖類:/獲得活動(dòng)子幀窗口CMDIChildWnd*pChild=(CMDIChildWnd*GetActiveFrame(;或:CMDIChildWnd*pChild=MDIGetActive(;/獲得活動(dòng)子幀窗口的活動(dòng)視圖CMyView*pView=(CMyView*pChild->GetActiveView(;字用75 .從視圖類中獲得主幀窗口類指針:字用3用函數(shù):CWnd二GetParentFrame或 AfxGetMainWnd(;可達(dá)到目的。GetParentFrame(勺工作原理是在父窗口鏈中搜索,直到找到 CFrameWnd或其派生類為止,并返回其指針。用法在 InfoViewer中有詳細(xì)介紹。 字用36 .在任何類中獲得應(yīng)用程序類用MFC全局函數(shù)AfxGetApp(可做到。字用87 .從應(yīng)用程序類中獲得主幀窗口類CWinThread 類有一個(gè)數(shù)據(jù)成員叫 m_pMainWnd,由于 CWinApp 類由 CWinThread

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論