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

醬壇子

專注C++技術 在這里寫下自己的學習心得 感悟 和大家討論 共同進步(歡迎批評!!!)

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  66 Posts :: 16 Stories :: 236 Comments :: 0 Trackbacks

公告

王一偉 湖南商學院畢業 電子信息工程專業

常用鏈接

留言簿(19)

我參與的團隊

搜索

  •  

積分與排名

  • 積分 - 389616
  • 排名 - 64

最新隨筆

最新評論

閱讀排行榜

評論排行榜

MFC類中獲得其它類指針  
  成都:蘇穎鋒  
  (vcmfc輸入并轉貼)  
   
      當用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))  
                          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))  
                          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.在很多時候要進行強制類型轉換,并要注意括號的括法。  
                  由于派生類和父類指針類型的兼容,使明確區分各個類變得十分重要。在拿不準的時候,最好加上強制類型轉換。  
posted on 2007-08-11 22:26 @王一偉 閱讀(1097) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   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>
            亚洲亚洲精品在线观看 | 99视频有精品| 猫咪成人在线观看| 免费成人高清| 欧美激情1区2区3区| 亚洲国产欧美国产综合一区| 欧美mv日韩mv国产网站| 亚洲二区在线视频| 亚洲日本成人在线观看| 中文欧美在线视频| 亚洲欧美在线x视频| 国产精品在线看| 欧美黑人多人双交| 欧美色区777第一页| 国产精品视频一区二区三区| 国产一区自拍视频| 亚洲精品久久嫩草网站秘色| 亚洲一区二区黄色| 久久久av毛片精品| 亚洲国产成人久久| 亚洲在线视频一区| 久久深夜福利| 欧美网站在线| 亚洲丰满在线| 性娇小13――14欧美| 免费观看一级特黄欧美大片| 亚洲精品日本| 久久久久久久一区二区三区| 欧美日韩精品免费观看视频| 激情国产一区二区| 亚洲男女自偷自拍| 亚洲精美视频| 久久综合一区二区| 欧美性生交xxxxx久久久| 在线观看中文字幕不卡| 欧美一区日韩一区| 亚洲激情社区| 久久精品国产亚洲a| 国产精品超碰97尤物18| 亚洲国内高清视频| 另类天堂av| 久久激情视频久久| 国产亚洲精品资源在线26u| 日韩亚洲欧美一区| 亚洲电影免费观看高清完整版在线| 亚洲免费一区二区| 国产精品白丝av嫩草影院| 日韩视频在线一区| 亚洲大胆人体在线| 久久久99国产精品免费| 国产亚洲精久久久久久| 欧美亚洲三区| 欧美伊人精品成人久久综合97| 欧美性大战久久久久| 在线综合亚洲| 日韩视频一区二区| 欧美aⅴ一区二区三区视频| 在线精品视频一区二区| 久久久噜噜噜久噜久久| 欧美在线视频在线播放完整版免费观看 | 国产精品女主播在线观看| 亚洲精品日日夜夜| 亚洲国产精品第一区二区三区| 免费日韩成人| 99ri日韩精品视频| 亚洲精品欧美日韩| 狠狠综合久久av一区二区小说| 亚洲欧美综合精品久久成人| 亚洲一区二区三区精品在线观看| 国产精品国产三级国产专区53 | 久久激情中文| 亚洲成人资源| 欧美激情精品久久久久久久变态| 欧美18av| 亚洲一区精品在线| 亚洲主播在线| 一区视频在线看| 亚洲国产一成人久久精品| 欧美人成在线| 午夜视频久久久久久| 久久精品亚洲国产奇米99| 亚洲激情国产| 在线亚洲观看| 亚洲电影下载| 亚洲视频国产视频| 在线国产欧美| 一区二区三区视频观看| 国产精品日韩欧美一区| 麻豆91精品91久久久的内涵| 欧美成人综合在线| 欧美一区二区三区免费看| 欧美中文字幕在线| 夜夜夜精品看看| 欧美在线播放视频| 中日韩高清电影网| 久久精品一级爱片| 亚洲视频在线观看视频| 性久久久久久久| 亚洲精品偷拍| 久久经典综合| 亚洲中无吗在线| 欧美**字幕| 久久疯狂做爰流白浆xx| 欧美激情综合亚洲一二区| 欧美亚洲网站| 欧美日韩在线影院| 欧美国产极速在线| 国产精品人人爽人人做我的可爱| 免费高清在线一区| 国产欧美在线观看一区| 日韩午夜电影| 最新中文字幕一区二区三区| 香蕉精品999视频一区二区| 一区二区三区黄色| 久久女同精品一区二区| 欧美在线免费播放| 欧美日韩一区二区视频在线观看| 免费久久精品视频| 国产亚洲人成a一在线v站| 中文在线资源观看网站视频免费不卡| 狠狠色噜噜狠狠色综合久| 亚洲综合999| 亚洲欧美视频在线| 欧美日韩另类丝袜其他| 亚洲福利在线视频| 亚洲二区在线| 久久一日本道色综合久久| 亚洲一区二区三区在线看| 亚洲日本aⅴ片在线观看香蕉| 亚洲尤物视频网| 亚洲调教视频在线观看| 欧美日韩成人激情| 亚洲欧洲免费视频| 亚洲精品中文字| 久热国产精品| 亚洲电影在线免费观看| 亚洲国产欧洲综合997久久| 欧美一区二区精品| 久久成人羞羞网站| 国内精品久久久久久久影视蜜臀| 亚洲午夜久久久| 欧美影视一区| 精品1区2区| 免费观看在线综合色| 欧美电影在线播放| 亚洲精品视频免费观看| 欧美三级特黄| 午夜久久tv| 久久资源在线| 日韩亚洲一区在线播放| 欧美日韩岛国| 亚洲视频综合在线| 久久精品国产久精国产思思| 激情亚洲网站| 欧美好骚综合网| 亚洲午夜精品久久久久久app| 欧美一站二站| 亚洲福利专区| 欧美日韩一区在线| 久久成人精品一区二区三区| 美女亚洲精品| 亚洲最新在线视频| 国产欧美日韩综合精品二区| 久久久夜夜夜| 亚洲色图自拍| 麻豆国产精品一区二区三区| 日韩视频一区二区| 国产欧美精品va在线观看| 久久黄色影院| 日韩亚洲欧美在线观看| 久久精品综合网| 亚洲精品视频免费| 国产美女诱惑一区二区| 欧美96在线丨欧| 亚洲欧美一区二区在线观看| 亚洲大片av| 久久av在线| a91a精品视频在线观看| 国产日产高清欧美一区二区三区| 欧美福利一区二区三区| 性欧美1819sex性高清| 亚洲精品中文字幕有码专区| 欧美在线啊v| 一区二区高清在线| 在线观看久久av| 国产精品视频第一区| 欧美.www| 久久成人资源| 亚洲专区一区二区三区| 亚洲激情综合| 欧美~级网站不卡| 亚洲欧美成人网| 99精品国产热久久91蜜凸| 在线成人av| 国产亚洲欧美日韩在线一区| 欧美日韩在线亚洲一区蜜芽| 欧美成人久久| 久久伊人精品天天| 久久狠狠久久综合桃花| 亚洲一区精彩视频|