青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

醬壇子

專注C++技術(shù) 在這里寫(xiě)下自己的學(xué)習(xí)心得 感悟 和大家討論 共同進(jìn)步(歡迎批評(píng)!!!)

  C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
  66 Posts :: 16 Stories :: 236 Comments :: 0 Trackbacks

公告

王一偉 湖南商學(xué)院畢業(yè) 電子信息工程專業(yè)

常用鏈接

留言簿(19)

我參與的團(tuán)隊(duì)

搜索

  •  

積分與排名

  • 積分 - 389905
  • 排名 - 64

最新隨筆

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

MFC類中獲得其它類指針  
  成都:蘇穎鋒  
  (vcmfc輸入并轉(zhuǎn)貼)  
   
      當(dāng)用VC++的Application   Wizard生成除了CDialog   Basiced以外的應(yīng)用程序時(shí),將自動(dòng)產(chǎn)生視圖類、文檔類、主幀窗口類、應(yīng)用程序類等等。一般來(lái)說(shuō),程序的核心數(shù)據(jù)及操作在文檔類中實(shí)現(xiàn)。跟界面有關(guān)的數(shù)據(jù)及操作在視圖類中實(shí)現(xiàn)。當(dāng)需要在某個(gè)類中使用不屬于該類的數(shù)據(jù)時(shí),必須要取得該數(shù)據(jù)所屬類的指針。從視圖類獲得文檔類的指針是很容易的,用GetDocument即可,這在一般的MFC文檔中有介紹,也是編程中極為常用的的操作,比如視圖類在進(jìn)行重畫(huà)等操作時(shí),往往要用到文檔類中的數(shù)據(jù)。然而只能從視圖類獲得文檔類的指針是遠(yuǎn)遠(yuǎn)不夠的,每個(gè)類都有獲得其它各個(gè)類指針的一套方法,現(xiàn)歸納如下:  
   
      為方便說(shuō)明,現(xiàn)假設(shè)已用Application   Wizard生成一個(gè)SDI應(yīng)用程序Test,包含如一幾個(gè)類:CTestApp,CTestDoc,CTestView,CMainFrm.  
   
  1.從視圖類獲得文檔類的指針  
   
      如前所述,在視圖類中需要引用文檔類的地方之前,使用以下語(yǔ)句:  
    CTextDoc   *pDoc=(CTestDoc*)GetDocument();  
  以后便可使用pDoc指針訪問(wèn)文檔類。  
  此處的強(qiáng)制類型轉(zhuǎn)換在Test應(yīng)用程序中并不必需,因?yàn)樵摮绦蛑兄挥幸粋€(gè)視圖類,并且在Initstance()中用SDI文檔模板進(jìn)行了裝配,你可以在Test.cpp中的Initstance()方法中看到以下語(yǔ)句:  
          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;}  
      簡(jiǎn)而言之,就是說(shuō)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(),具體語(yǔ)法如下:  
          virtual   POSITION   GetFirstViewPosition()   const;  
          virtual   CView*   GetNextView(POSITION&   rPosition)   const;  
          注意:GetNextView()括號(hào)中的參數(shù)用的是引用方式,因此執(zhí)行后值可能改變。  
          GetFirstViewPosition()用于返回第一個(gè)視圖位置(返回的并非視圖類指針,而是一個(gè)POSITION類型值),GetNextView()有兩個(gè)功能:返回下一個(gè)視圖類的指針以及用引用調(diào)動(dòng)的方式來(lái)改變傳入的POSITION類型參數(shù)的值。很明顯,在Test程序中,只有一個(gè)視圖類,因此只需將這兩個(gè)函數(shù)調(diào)用一次即可得到CTestView的指針如下(需定義一個(gè)POSITION結(jié)構(gòu)變量來(lái)輔助操作):  
          CTestView*   pTestView;  
          POSITION   pos=GetFirstViewPosition();  
          pTestView=GetNextView(pos);  
  這樣,便可到了CTestView類的指針pTestView.執(zhí)行完成幾句后,變量pos=NULL,因?yàn)闆](méi)有下一個(gè)視圖類,自然也沒(méi)有下一個(gè)視圖類的POSITION.  
   
  但是之幾條語(yǔ)句太簡(jiǎn)單,不具有太強(qiáng)的通用性和安全特征;當(dāng)象前面說(shuō)的那樣,當(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))  
                          return     NULL;  
                  return   pView;}  
          其中用了兩次視圖類的成員函數(shù)IsKindOf()來(lái)判斷,是因?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è)宏,可以簡(jiǎn)單地理解它的作用:將類的名字轉(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))  
                          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.   從主幀窗口類獲得視圖類指針  
   
          對(duì)本文所舉的Test這各SDI程序來(lái)說(shuō),這是簡(jiǎn)單的,只需用CFrameWnd類的GetActiveView()成員函數(shù)即可。格式如下:  
          CFrameWnd::GetActiveView()  
          但將此函數(shù)應(yīng)用在MDI應(yīng)用的CMDIFrameWnd為中時(shí),并不象所想的那樣獲得當(dāng)前活動(dòng)子窗口的視圖類,而是返回NULL,這是一個(gè)要領(lǐng)性問(wèn)題。在MDI程序中,CMDIFrameWnd沒(méi)有和任何視圖類發(fā)生關(guān)系,也就是說(shuō)沒(méi)有視圖類直接屬于它,只有子幀窗口類CMDIChildWnd才是所有子窗口視圖類的父窗口。而子幀窗口的父窗口才是CFrameWnd。因此,在MDI程序中獲得活動(dòng)視圖類的正確方法應(yīng)為:先獲得活動(dòng)子幀窗口,再?gòu)幕顒?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派生而來(lái),我們的應(yīng)用程序?yàn)橛钟蒀WinApp派生而來(lái),所以我們的CTestApp類也有一個(gè)m_pMainWnd成員,它所指南的即是CMainFrame類。(需進(jìn)行合適的強(qiáng)制類型轉(zhuǎn)換)。  
   
  總結(jié)起來(lái)有幾點(diǎn)注意:  
          A.在類A中獲得類B的指針時(shí),類A應(yīng)包含類B的頭文件。  
          B.在很多時(shí)候要進(jìn)行強(qiáng)制類型轉(zhuǎn)換,并要注意括號(hào)的括法。  
                  由于派生類和父類指針類型的兼容,使明確區(qū)分各個(gè)類變得十分重要。在拿不準(zhǔn)的時(shí)候,最好加上強(qiáng)制類型轉(zhuǎn)換。  
posted on 2007-08-11 22:26 @王一偉 閱讀(1099) 評(píng)論(0)  編輯 收藏 引用

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            模特精品裸拍一区| 影院欧美亚洲| 午夜一区二区三视频在线观看| 亚洲一区在线观看免费观看电影高清| 国产欧美欧洲在线观看| 欧美 日韩 国产一区二区在线视频| 欧美美女福利视频| 久久久久久久久久久一区| 欧美精品一卡| 卡通动漫国产精品| 欧美日一区二区三区在线观看国产免| 久久久www成人免费无遮挡大片| 久久在线免费观看| 性欧美video另类hd性玩具| 美女精品在线观看| 欧美自拍丝袜亚洲| 欧美小视频在线| 亚洲电影中文字幕| 精品91在线| 亚洲网站视频福利| 亚洲国产精品一区二区三区| 亚洲毛片在线观看| 国语自产精品视频在线看一大j8 | 一区二区三区在线观看国产| 日韩亚洲国产欧美| 亚洲国产色一区| 欧美一区二区三区免费在线看| 在线视频亚洲欧美| 免费毛片一区二区三区久久久| 欧美在线在线| 国产欧美精品一区二区色综合| 日韩视频一区二区在线观看 | 麻豆国产va免费精品高清在线| 性做久久久久久久久| 欧美伦理91i| 亚洲电影毛片| 亚洲国产日韩欧美在线动漫| 欧美一级精品大片| 久久国产直播| 国产日韩欧美在线| 欧美一级精品大片| 久久九九热免费视频| 国产欧美精品日韩精品| 亚洲影音一区| 欧美在线日韩| 国产精品入口夜色视频大尺度 | 亚洲精品韩国| 99re视频这里只有精品| 欧美激情片在线观看| 久久国产精品第一页| 国产精品高潮呻吟久久| 亚洲午夜精品| 香港成人在线视频| 国产亚洲一本大道中文在线| 亚久久调教视频| 久久野战av| 亚洲激情国产| 老**午夜毛片一区二区三区| 欧美成人午夜视频| 一本色道久久88精品综合| 欧美日韩亚洲综合| 亚洲一区三区视频在线观看| 久久精品男女| 91久久久精品| 欧美日韩一区二区三区四区在线观看| 亚洲图片欧美日产| 久久国产精品免费一区| 在线观看一区| 欧美三区美女| 欧美在线亚洲综合一区| 亚洲国产精品久久久久婷婷884 | 女生裸体视频一区二区三区| 亚洲精品看片| 国产精品亚洲精品| 久久精品欧洲| 日韩一二三区视频| 久久精品综合| 亚洲精品中文字幕在线| 国产精品sm| 久久久亚洲一区| 99re66热这里只有精品4| 欧美在线视频免费| 亚洲黄色三级| 国产精品夜夜夜一区二区三区尤| 久久精品盗摄| 国产精品99久久99久久久二8 | 欧美诱惑福利视频| 亚洲国产精品va在线观看黑人| 欧美精品成人| 久久精品国语| 亚洲午夜国产一区99re久久| 欧美国产一区二区三区激情无套| 午夜精品国产更新| 亚洲韩国一区二区三区| 欧美日韩在线免费观看| 久久午夜精品| 欧美亚洲系列| 亚洲性av在线| 亚洲免费观看| 欧美激情欧美激情在线五月| 亚洲精品一区二区三区四区高清| 国产人妖伪娘一区91| 欧美日韩高清在线| 嫩草国产精品入口| 亚洲已满18点击进入久久| 亚洲国产视频一区| 蜜臀av一级做a爰片久久| 性久久久久久久久| 亚洲一区二区三区777| 日韩午夜三级在线| 国产精品人人爽人人做我的可爱| 欧美福利小视频| 久久亚洲精品一区| 久久久久成人网| 性色av一区二区三区红粉影视| 亚洲视频中文| 99国产精品一区| 亚洲人成网站777色婷婷| 欧美成人午夜| 欧美顶级大胆免费视频| 久久在线视频| 久久久久在线观看| 久久久久久久久一区二区| 欧美伊人久久| 午夜天堂精品久久久久| 亚洲免费综合| 性欧美videos另类喷潮| 性欧美办公室18xxxxhd| 亚洲自拍16p| 久久久精品免费视频| 欧美激情二区三区| 一本一本久久| 欧美一区激情| 欧美承认网站| 国产精品视频一二三| 红桃视频国产一区| 99精品欧美一区二区蜜桃免费| 亚洲午夜激情网站| 久久蜜桃香蕉精品一区二区三区| 欧美成人免费全部| 一本色道久久综合亚洲精品不卡 | 久久亚洲精品一区| 亚洲激情亚洲| 午夜精品久久久99热福利| 久久久久国产精品人| 欧美日韩伦理在线免费| 国模私拍视频一区| av72成人在线| 久久久久久一区| 99视频超级精品| 久久精品二区亚洲w码| 欧美理论大片| 国内精品久久久久久 | 国产精品99久久久久久白浆小说| 久久国产精品久久精品国产| 亚洲高清在线视频| 亚洲欧美日韩国产中文| 欧美电影免费观看高清| 国产日韩欧美精品一区| 日韩视频国产视频| 老巨人导航500精品| 亚洲一区在线免费| 欧美久久久久久| 一区二区三区在线观看国产| 午夜视频在线观看一区| 亚洲人成欧美中文字幕| 久久久最新网址| 国产日韩欧美另类| 亚洲制服丝袜在线| 亚洲激情校园春色| 久久一区精品| 国产一区在线播放| 午夜精品久久| 一区二区三区你懂的| 欧美精彩视频一区二区三区| 在线播放视频一区| 久久免费国产| 午夜激情综合网| 国产精品免费看| 亚洲综合欧美日韩| 亚洲七七久久综合桃花剧情介绍| 久久这里只有精品视频首页| 国产真实乱子伦精品视频| 欧美一级二区| 亚洲免费综合| 国产精品一区二区你懂得 | 久久综合网hezyo| 国语对白精品一区二区| 久久精品一二三| 午夜精品一区二区在线观看| 国产精品制服诱惑| 欧美一区二区三区精品电影| 亚洲免费视频网站| 国产精品美女久久久浪潮软件| 亚洲在线观看免费视频| 中国亚洲黄色| 国产欧美日韩中文字幕在线| 久久福利视频导航| 欧美一区二区三区婷婷月色 | 亚洲精品久久久久久下一站|