在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁面

MFC類中獲得其它類指針 

MFC類中獲得其它類指針 

更新時(shí)間:2022-05-08 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

作者:疙瘩

        當(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è)類都有獲得其它各個(gè)類指針的一套方法,現(xiàn)歸納如下: 為方便說明,現(xiàn)假設(shè)已用Application Wizard生成一個(gè)SDI應(yīng)用程序Test,包含如一幾個(gè)類:

CTestApp,CTestDoc,CTestView,CMainFrm.1.從視圖類獲得文檔類的指針 如前所述,在視圖類中需要引用文檔類的地方之前,使用以下語句:
CTextDoc *pDoc=(CTestDoc*)GetDocument();
以后便可使用pDoc指針訪問文檔類。
        此處的強(qiáng)制類型轉(zhuǎn)換在Test應(yīng)用程序中并不必需,因?yàn)樵摮绦蛑兄挥幸粋(gè)視圖類,并且在Initstance()中用SDI文檔模板進(jìn)行了裝配,你可以在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()函數(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)換。2.從文檔類取得視圖類的指針 CDocument類提供了兩個(gè)函數(shù)用于視圖類的定位:GetFirstViewPosition()和GetNextView(),具體語法如下:
virtual POSITION GetFirstViewPosition() const;
virtual CView* GetNextView(POSITION& rPosition) const;
注意:GetNextView()括號中的參數(shù)用的是引用方式,因此執(zhí)行后值可能改變。
GetFirstViewPosition()用于返回第一個(gè)視圖位置(返回的并非視圖類指針,而是一個(gè)POSITION類型值),GetNextView()有兩個(gè)功能:返回下一個(gè)視圖類的指針以及用引用調(diào)動(dòng)的方式來改變傳入的POSITION類型參數(shù)的值。很明顯,在Test程序中,只有一個(gè)視圖類,因此只需將這兩個(gè)函數(shù)調(diào)用一次即可得到CTestView的指針如下(需定義一個(gè)POSITION結(jié)構(gòu)變量來輔助操作):
CTestView* pTestView;
POSITION pos=GetFirstViewPosition();
pTestView=GetNextView(pos);
        這樣,便可到了CTestView類的指針pTestView.執(zhí)行完成幾句后,變量pos=NULL,因?yàn)闆]有下一個(gè)視圖類,自然也沒有下一個(gè)視圖類的POSITION.但是之幾條語句太簡單,不具有太強(qiáng)的通用性和安全特征;當(dāng)象前面說的那樣,當(dāng)要在多個(gè)視圖為中返回某個(gè)指定類的指針時(shí),我們需要遍歷所有視圖類,直到找到指定類為止。判斷一個(gè)類指針指向的是否某個(gè)類的實(shí)例時(shí),可用IsKindOf()成員函數(shù)時(shí)行檢查,如:
pView->IsKindOf(RUNTIME_CLASS(CTestView));
即可檢查pView所指是否是CTestView類。
        有了以上基礎(chǔ),我們已經(jīng)可以從文檔類取得任何類的指針。為了方便,我們將其作為一個(gè)文檔類的成員函數(shù),它有一個(gè)參數(shù),表示要獲得哪個(gè)類的指針。實(shí)現(xiàn)如下:
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;}
其中用了兩次視圖類的成員函數(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í)就如引。因此需采用兩次判斷。
使用該函數(shù)應(yīng)遵循如下格式(以取得CTestView指針為例):
CTestView* pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView));
RUNTIME_CLASS是一個(gè)宏,可以簡單地理解它的作用:將類的名字轉(zhuǎn)化為CRuntimeClass為指針。
        至于強(qiáng)制類型轉(zhuǎn)換也是為了安全特性考慮的,因?yàn)閺耐粋(gè)基類之間的指針類型是互相兼容的。這種強(qiáng)制類型轉(zhuǎn)換也許并不必要,但能避免一些可能出現(xiàn)的麻煩。3.從一個(gè)視圖類取得另一視圖類的指針 綜合1和2,很容易得出視圖類之間互相獲得指針的方法:就是用文檔類作中轉(zhuǎn),先用1的方法得到文檔類的指針,再用2的方法,以文檔類的視圖定位函數(shù)取得另一個(gè)視圖類。同樣,可以實(shí)現(xiàn)成一個(gè)函數(shù):
(假設(shè)要從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;}
這個(gè)函數(shù)和2中的GetView()相比,一是多了第一句以取得文檔類指針,二是在GetFirstViewPosition()和GetNextView()前加上了文檔類指針,以表示它們是文檔類成員函數(shù)。
有了此函數(shù);當(dāng)要從CTestAView中取得CTestBView的指針時(shí),只需如下:
CTestBView* pTestbView=(CTestView*)GetView(RUNTIME_CLASS(CTestBView));4. 從主幀窗口類獲得視圖類指針 對本文所舉的Test這各SDI程序來說,這是簡單的,只需用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)子幀窗口,再從活動(dòng)子幀窗口中獲得活動(dòng)視圖類:
//獲得活動(dòng)子幀窗口
CMDIChildWnd* pChild=(CMDIChildWnd*)GetActiveFrame();
//或:CMDIChildWnd* pChild=MDIGetActive();
//獲得活動(dòng)子幀窗口的活動(dòng)視圖
CMyView* pView=(CMyView*)pChild->GetActiveView();5.從視圖類中獲得主幀窗口類指針:用函數(shù):CWnd::GetParentFrame()或AfxGetMainWnd();
可達(dá)到目的。GetParentFrame()的工作原理是在父窗口鏈中搜索,直到找到CFrameWnd或其派生類為止,并返回其指針。用法在InfoViewer中有詳細(xì)介紹。6.在任何類中獲得應(yīng)用程序類
用MFC全局函數(shù)AfxGetApp()可做到。7.從應(yīng)用程序類中獲得主幀窗口類
CWinThread類有一個(gè)數(shù)據(jù)成員叫m_pMainWnd,由于CWinApp類由CWinThread派生而來,我們的應(yīng)用程序?yàn)橛钟蒀WinApp派生而來,所以我們的CTestApp類也有一個(gè)m_pMainWnd成員,它所指南的即是CMainFrame類。(需進(jìn)行合適的強(qiáng)制類型轉(zhuǎn)換)。總結(jié)起來有幾點(diǎn)注意:
A.在類A中獲得類B的指針時(shí),類A應(yīng)包含類B的頭文件。
B.在很多時(shí)候要進(jìn)行強(qiáng)制類型轉(zhuǎn)換,并要注意括號的括法。
由于派生類和父類指針類型的兼容,使明確區(qū)分各個(gè)類變得十分重要。在拿不準(zhǔn)的時(shí)候,最好加上強(qiáng)制類型轉(zhuǎn)換。 

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

本類教程下載

系統(tǒng)下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 在线观看日本www| www日韩视频| 青青草视频在线免费播放| 久久久久99精品成人片| 91九色丨porny丨国产jk| 免费看国产曰批40分钟| 日日碰狠狠躁久久躁婷婷| 亚洲一二三区av| 1314成人网| www插插插无码视频网站| 免费在线a视频| 国产色视频在线播放| 91精品国产毛片武则天| 欧美精品99久久| 波多野结衣免费观看| 国产黄页在线观看| 最新中文字幕免费视频| 青娱乐国产精品视频| 久久久久免费看黄a片app| 91在线视频观看免费| 久久久成人精品一区二区三区| 欧美大黑帍在线播放| 国产精品久久a| 青草青青在线视频| 四虎成人在线播放| 日本不卡在线观看视频| 做爰高潮hd色即是空| 免费毛片小视频| japanese在线播放| 欧美在线aaa| 成人免费观看视频在线观看| 五月天六月丁香| 午夜免费福利在线| 5月婷婷6月丁香| 精品无码av无码免费专区| 五月天亚洲视频| 99色精品视频| 欧美视频在线观看网站 | 人妻丰满熟妇av无码区app| 午夜啪啪免费视频| 亚洲精品自拍网| 欧美牲交a欧美牲交aⅴ免费下载| 精品一区二区三区毛片| 九九九九九国产| 天天综合网日韩| 日本www.色| 国产免费人做人爱午夜视频| 国产va亚洲va在线va| 法国空姐在线观看免费| 天天色天天干天天色| 欧美日韩一区二区三区69堂| 能看的毛片网站| 日本成年人网址| 97xxxxx| 日本精品久久久久久久久久 | 久久精品视频16| 国产精品久久久久久久乖乖| 国产成人一二三区| 麻豆一区二区三区在线观看| 日本黄色播放器| 国产高清免费在线| 国产精品一二三在线观看| 欧美精品一区二区性色a+v| 日本黄色播放器| 日本老太婆做爰视频| 久久久久久久香蕉| 成品人视频ww入口| 18禁免费无码无遮挡不卡网站| 啊啊啊一区二区| 黄色一级大片在线观看| 男人舔女人下面高潮视频| 成人免费视频久久| 亚洲高清免费在线观看| 777一区二区| 日本中文字幕在线不卡| 伊人再见免费在线观看高清版| 国产日本在线播放| 免费在线激情视频| 911av视频| 久久久久久www| 欧美 国产 小说 另类| 手机免费av片| 无码人妻精品一区二区三区99v| 日本人妻伦在线中文字幕| 国产午夜福利在线播放| 久草福利视频在线| 日韩精品久久一区二区| 成人一级片网站| 日韩视频在线免费播放| 男人揉女人奶房视频60分| 国产精欧美一区二区三区白种人| 真实国产乱子伦对白视频| 春日野结衣av| 亚洲欧美日韩不卡| av黄色在线网站| japanese在线视频| 韩国一区二区av| 日本道在线视频| 美女一区二区三区视频| a级黄色片免费| 亚洲精品午夜在线观看| 国产欧美日韩小视频| 不卡的在线视频| 东京热加勒比无码少妇| 欧美爱爱视频网站| 精品免费国产一区二区| 99中文字幕在线观看| 国产又黄又猛又粗又爽的视频| 久久久久久久久影视| 黄色片视频在线| 日韩av黄色网址| a天堂资源在线观看| 国产大片一区二区三区| 黄色三级视频在线| www.com毛片| 99在线免费视频观看| 精品日韩在线播放| 中文字幕 欧美日韩| 污污的网站18| 亚洲五月天综合| 国产亚洲精品网站| 成人午夜免费在线| 久久这里只有精品18| 8x8x华人在线| 手机看片日韩国产| 欧美精品 - 色网| 欧美一级特黄aaa| 中日韩av在线播放| 少妇一级淫免费放| 91看片就是不一样| 成人在线观看a| 色诱视频在线观看| 天天操天天爽天天射| 男人的天堂日韩| 午夜免费看视频| 亚洲视频第二页| 中文国产在线观看| 男女激烈动态图| www成人免费| 99在线免费视频观看| 欧美 日韩 国产在线观看| 日韩少妇内射免费播放| 日本欧美黄色片| 亚洲五月天综合| jizz18女人| 想看黄色一级片| 欧美三级午夜理伦三级老人| 日产精品久久久久久久蜜臀| 欧美中日韩在线| 国产最新免费视频| 黑森林精品导航| 成人手机视频在线| 91网站在线观看免费| 浮妇高潮喷白浆视频| 日本免费观看网站| 爽爽爽在线观看| 国产一区二区四区| 午夜免费一区二区| 日韩视频在线免费播放| 成人黄色大片网站| 午夜国产一区二区三区| 一区二区三区四区免费观看| 成人黄色片免费| 91av俱乐部| 操bbb操bbb| 91av在线免费播放| 亚洲天堂av免费在线观看| 自拍日韩亚洲一区在线| 亚洲小视频网站| 男人添女人下面高潮视频| 黄色免费网址大全| 人人妻人人澡人人爽欧美一区| 日本在线视频www| 91国在线高清视频| 亚洲高清在线免费观看| 日韩久久久久久久久久久久| 精品视频无码一区二区三区| 欧美精品久久96人妻无码| aa免费在线观看| 国产精品无码电影在线观看| 五月婷婷六月合| 久无码久无码av无码| 久久精品视频在线观看免费| 丰满爆乳一区二区三区| 日本黄网站色大片免费观看| 欧美日韩在线观看不卡| 欧洲黄色一级视频| 国产精品啪啪啪视频| 欧美日韩亚洲自拍| 国产淫片免费看| 日本阿v视频在线观看| 天天干天天色天天干| 国产97色在线 | 日韩| 水蜜桃色314在线观看| 999热精品视频| 污色网站在线观看| 久久久久久久久久久久久久国产| 欧美人成在线观看| 成人小视频在线观看免费| 天天操精品视频|