国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

MFC類中獲得其它類指針 

MFC類中獲得其它類指針 

更新時間:2022-05-08 文章作者:未知 信息來源:網絡 閱讀次數:

作者:疙瘩

        當用VC++的Application Wizard生成除了CDialog Basiced以外的應用程序時,將自動產生視圖類、文檔類、主幀窗口類、應用程序類等等。一般來說,程序的核心數據及操作在文檔類中實現。跟界面有關的數據及操作在視圖類中實現。當需要在某個類中使用不屬于該類的數據時,必須要取得該數據所屬類的指針。從視圖類獲得文檔類的指針是很容易的,用GetDocument即可,這在一般的MFC文檔中有介紹,也是編程中極為常用的的操作,比如視圖類在進行重畫等操作時,往往要用到文檔類中的數據。然而只能從視圖類獲得文檔類的指針是遠遠不夠的,每個類都有獲得其它各個類指針的一套方法,現歸納如下: 為方便說明,現假設已用Application Wizard生成一個SDI應用程序Test,包含如一幾個類:

CTestApp,CTestDoc,CTestView,CMainFrm.1.從視圖類獲得文檔類的指針 如前所述,在視圖類中需要引用文檔類的地方之前,使用以下語句:
CTextDoc *pDoc=(CTestDoc*)GetDocument();
以后便可使用pDoc指針訪問文檔類。
        此處的強制類型轉換在Test應用程序中并不必需,因為該程序中只有一個視圖類,并且在Initstance()中用SDI文檔模板進行了裝配,你可以在Test.cpp中的Initstance()方法中看到以下語句:
CSingleDocTemplate *pDocTemplate;
pDocTemplate=new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CTestDoc),RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CTestView));
AddDocTemplate(pDocTemplate);
以及TestView.h中的線上定義:
inline CTestDoc* CTestView::GetDocument()
{ return (CTestDoc*)m_pDocument;}
       簡而言之,就是說CTestView的GetDocument()函數自然而然地認為CTestDoc是與它“相配”的,當生成了一個具有多個視圖類的應用程序時(如用CSplitterWnd)將窗口分為兩欄,但這兩欄并非從同一種視圖類派生就屬于這種情況。具體實現在本文討論范圍之外),只有一個視圖類能與唯一的文檔類用文檔模板進行裝配,那么在另外一個未經裝配的類中要取得文檔類的指針,則需時行強制類型轉換。2.從文檔類取得視圖類的指針 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類。
        有了以上基礎,我們已經可以從文檔類取得任何類的指針。為了方便,我們將其作為一個文檔類的成員函數,它有一個參數,表示要獲得哪個類的指針。實現如下:
CView* CTestDoc::GetVieww(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;}
其中用了兩次視圖類的成員函數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為指針。
        至于強制類型轉換也是為了安全特性考慮的,因為從同一個基類之間的指針類型是互相兼容的。這種強制類型轉換也許并不必要,但能避免一些可能出現的麻煩。3.從一個視圖類取得另一視圖類的指針 綜合1和2,很容易得出視圖類之間互相獲得指針的方法:就是用文檔類作中轉,先用1的方法得到文檔類的指針,再用2的方法,以文檔類的視圖定位函數取得另一個視圖類。同樣,可以實現成一個函數:
(假設要從CTestAView中取得指向其它視圖類的指針)
CView* CTestAView::GetView(CRuntimeClass* pClass)
{ CTestDoc* pDoc=(CTestDoc*)GetDocument();
CView* pView;
POSITION pos=pDoc->GetFirstViewPosition();
while(pos!=NULL){
pView=pDoc->GetNextView(pos);
if(!pView->IsKindOf(pClass))
break;}
if(!pView->IsKindOf(pClass)){
AfxMessageBox("Connt Locate the View.");
return NULL;}
return pView;}
這個函數和2中的GetView()相比,一是多了第一句以取得文檔類指針,二是在GetFirstViewPosition()和GetNextView()前加上了文檔類指針,以表示它們是文檔類成員函數。
有了此函數;當要從CTestAView中取得CTestBView的指針時,只需如下:
CTestBView* pTestbView=(CTestView*)GetView(RUNTIME_CLASS(CTestBView));4. 從主幀窗口類獲得視圖類指針 對本文所舉的Test這各SDI程序來說,這是簡單的,只需用CFrameWnd類的GetActiveView()成員函數即可。格式如下:
CFrameWnd::GetActiveView()
但將此函數應用在MDI應用的CMDIFrameWnd為中時,并不象所想的那樣獲得當前活動子窗口的視圖類,而是返回NULL,這是一個要領性問題。在MDI程序中,CMDIFrameWnd沒有和任何視圖類發生關系,也就是說沒有視圖類直接屬于它,只有子幀窗口類CMDIChildWnd才是所有子窗口視圖類的父窗口。而子幀窗口的父窗口才是CFrameWnd。因此,在MDI程序中獲得活動視圖類的正確方法應為:先獲得活動子幀窗口,再從活動子幀窗口中獲得活動視圖類:
//獲得活動子幀窗口
CMDIChildWnd* pChild=(CMDIChildWnd*)GetActiveFrame();
//或:CMDIChildWnd* pChild=MDIGetActive();
//獲得活動子幀窗口的活動視圖
CMyView* pView=(CMyView*)pChild->GetActiveView();5.從視圖類中獲得主幀窗口類指針:用函數:CWnd::GetParentFrame()或AfxGetMainWnd();
可達到目的。GetParentFrame()的工作原理是在父窗口鏈中搜索,直到找到CFrameWnd或其派生類為止,并返回其指針。用法在InfoViewer中有詳細介紹。6.在任何類中獲得應用程序類
用MFC全局函數AfxGetApp()可做到。7.從應用程序類中獲得主幀窗口類
CWinThread類有一個數據成員叫m_pMainWnd,由于CWinApp類由CWinThread派生而來,我們的應用程序為又由CWinApp派生而來,所以我們的CTestApp類也有一個m_pMainWnd成員,它所指南的即是CMainFrame類。(需進行合適的強制類型轉換)。總結起來有幾點注意:
A.在類A中獲得類B的指針時,類A應包含類B的頭文件。
B.在很多時候要進行強制類型轉換,并要注意括號的括法。
由于派生類和父類指針類型的兼容,使明確區分各個類變得十分重要。在拿不準的時候,最好加上強制類型轉換。 

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        一区二区免费看| 久久久www免费人成精品| 日韩精品专区在线影院观看| 欧美日韩国产一区二区三区地区| 亚洲成a人v欧美综合天堂下载| 久久久精品一品道一区| 欧美亚洲综合一区| www.久久精品| 91一区二区三区在线观看| 日本一区二区成人| www.成人在线| 欧美丝袜第三区| 久久天堂av综合合色蜜桃网| 精品久久久久久综合日本欧美 | 亚洲乱码一区二区三区在线观看| 91亚洲精品乱码久久久久久蜜桃| 亚洲成人中文在线| jizz一区二区| 亚洲激情成人在线| 欧美精品一区二区久久婷婷| 99免费精品在线观看| 国产欧美一区二区三区在线看蜜臀| 蜜臀av性久久久久蜜臀av麻豆 | 国模少妇一区二区三区| 亚洲成人激情社区| 国产福利一区在线| 欧美日韩三级一区| 在线综合+亚洲+欧美中文字幕| 精品成人一区二区三区四区| 午夜国产不卡在线观看视频| 国产精品77777| 欧美三级中文字| 国产精品视频在线看| 日韩激情视频网站| 99视频超级精品| 日韩免费电影一区| 亚洲综合色噜噜狠狠| 成人精品高清在线| 久久色.com| 日韩有码一区二区三区| 99re成人在线| 丁香婷婷综合色啪| 欧美一卡在线观看| 99国产精品久久久久久久久久| 亚洲午夜久久久| 亚洲无线码一区二区三区| 成人午夜精品在线| 日韩欧美在线网站| 日韩精品乱码av一区二区| 成a人片国产精品| 久久综合色8888| 天天综合网 天天综合色| 91香蕉国产在线观看软件| 欧美国产日本韩| 狠狠狠色丁香婷婷综合激情 | 日韩精品一区二区三区中文不卡| 精品无人码麻豆乱码1区2区| 在线成人av网站| 亚洲美女区一区| 成人一区二区三区| 精品国产sm最大网站| 捆绑变态av一区二区三区| 欧美日韩小视频| 亚洲永久精品国产| 91片黄在线观看| 亚洲少妇最新在线视频| 一本一本大道香蕉久在线精品| 国产亚洲美州欧州综合国| 精品一区二区久久| 日韩欧美另类在线| 国产一区二区不卡| 日韩一区二区高清| 日韩激情在线观看| 日韩一级精品视频在线观看| 五月天丁香久久| 欧美久久高跟鞋激| 麻豆国产精品一区二区三区 | 一区二区在线看| 色婷婷av一区二区三区大白胸| 最新日韩在线视频| 欧美怡红院视频| 亚洲与欧洲av电影| 欧美精品v国产精品v日韩精品| 日本不卡123| 久久久久国产一区二区三区四区| 国产成人h网站| 亚洲免费成人av| 欧美日韩国产色站一区二区三区| 6080午夜不卡| 亚洲国产视频一区| 在线精品亚洲一区二区不卡| 一区二区三区欧美在线观看| av动漫一区二区| 一级女性全黄久久生活片免费| 欧美福利一区二区| 国产精品一区一区三区| 日韩中文字幕亚洲一区二区va在线| 欧美久久久久久蜜桃| 国产精品99精品久久免费| 亚洲午夜久久久久久久久电影网| 精品国产99国产精品| www.久久久久久久久| 亚洲成va人在线观看| 日韩精品一区二区三区四区视频| 懂色av一区二区三区免费观看| 亚洲一区二区四区蜜桃| 日韩区在线观看| 97se亚洲国产综合自在线| 日韩成人精品视频| 国产精品久久久久9999吃药| 欧美精品v日韩精品v韩国精品v| 国产伦精品一区二区三区视频青涩| 亚洲欧美日韩在线| 久久综合视频网| 在线观看不卡一区| 裸体一区二区三区| 欧美成人精品二区三区99精品| 懂色一区二区三区免费观看| 亚洲精品国产一区二区三区四区在线| 色吊一区二区三区| 喷水一区二区三区| 中文字幕日韩av资源站| 欧美日韩成人综合天天影院| 午夜久久久久久久久久一区二区| 久久综合狠狠综合久久综合88| 国产a精品视频| 一区二区三区精密机械公司| 精品国产3级a| 欧美人xxxx| 成人一级黄色片| 日韩在线播放一区二区| 亚洲欧洲无码一区二区三区| 日韩一区二区在线播放| www.欧美日韩| 国产一区二区三区四区五区美女 | 久久久噜噜噜久久人人看| 欧美色手机在线观看| 成人精品免费看| 国产大陆亚洲精品国产| 亚洲成人午夜电影| 亚洲成av人片在线观看| 亚洲综合视频在线观看| 国产精品久久久久久久久快鸭 | 国产精品区一区二区三| 91精品国产全国免费观看| 91福利在线免费观看| 国产一区二区在线看| 狠狠狠色丁香婷婷综合激情| 天天爽夜夜爽夜夜爽精品视频| 亚洲一区二区三区中文字幕在线| 亚洲激情五月婷婷| 亚洲精品免费在线观看| 亚洲色图一区二区三区| 亚洲少妇中出一区| 国产精品不卡一区二区三区| 久久99久国产精品黄毛片色诱| 视频在线观看一区| 五月天婷婷综合| 日韩激情视频网站| 精品一区二区日韩| 国产一区在线观看视频| 成人永久看片免费视频天堂| 国产成人精品一区二| 91在线观看污| 成人精品gif动图一区| 99精品热视频| 91久久精品一区二区| 欧美另类videos死尸| 日韩免费观看高清完整版 | 日本v片在线高清不卡在线观看| 奇米精品一区二区三区四区 | 日韩精品亚洲一区| 男女男精品网站| 裸体歌舞表演一区二区| 国产一区二区伦理片| av在线综合网| 欧美性大战久久久久久久蜜臀 | 欧美日韩一区成人| 欧美精品1区2区3区| 欧美一级一级性生活免费录像| 日韩一区二区三区视频| 久久久久久久一区| 国产精品美女久久福利网站| 亚洲一区二区三区小说| 秋霞午夜鲁丝一区二区老狼| 国产精品1区2区3区在线观看| 成人免费高清在线| 欧美三级乱人伦电影| 日韩一区二区三| 亚洲激情第一区| 麻豆国产精品视频| 色婷婷综合久久久中文字幕| 日韩欧美一级在线播放| 国产日韩欧美激情| 亚洲超碰精品一区二区| 国产一区二区免费看| 国产乱人伦精品一区二区在线观看 | 另类专区欧美蜜桃臀第一页| 国产成人高清在线| 日本韩国欧美国产|