MFC应用程序软件代码中指针地使用

来源:互联网 发布:sql附加数据库错误602 编辑:程序博客网 时间:2024/05/04 13:01
MFC应用程序软件代码中指针地使用   
    
  1)   在View中获得Doc指针   
  2)   在App中获得MainFrame指针   
  3)   在View中获得MainFrame指针   
  4)   获得View(已建立)指针   
  5)   获得当前文档指针   
  6)   获得状态栏与工具栏指针   
  7)   获得状态栏与工具栏变量(var)   
  8)   在Mainframe获得菜单指针   
  9)   在任何类中获得应用程序软件代码类   
  10)   从文档类取得视图类地指针(1)   
  11)   在App中获得文档模板指针   
  12)   从文档模板获得文档类指针   
  13)   在文档类中获得文档模板指针   
  14)   从文档类取得视图类地指针(2)   
  15)   从1个视图类取得另1视图类地指针   
    
  VC中编程对于刚刚开始学习地同学,最大地障碍及问题和疑问就就为消息机制及指针获取与   
  操作。其实此些具体内容基本顶就为每本VC学习工具书顶必讲地具体内容,而且通过MSDN很多   
  问题和疑问都能解决。下面文字主要就为个人在编程中指针使用地1些体会,说地非当地地   
  方请指正。1般俺们使用地框架就为VC提供地Wizard生成地MFC   App   Wizard(exe)框架,   
  无论就为多文档还就为单文档,都存在指针获取及操作问题和疑问。下面此节具体内容主要就为1般   
  地框架,然后再讲多线程进程中地指针使用。使用到地类要包含响应地头文件。首先   
  1般获得本类(视,文档,对话框都支持)实例指针this,用this地目地,主要可以通   
  过类中地函数function向其他类或者函数function中发指针,以便于在非本类中操作及使用本类中地   
  功能。   
    
    1)   在View中获得Doc指针   CYouSDIDoc   *pDoc=GetDocument();1个视只能有1个文   
  档。   
    2)   在App中获得MainFrame指针   
  CWinApp   中地   m_pMainWnd变量(var)就就为MainFrame地指针   
  也可以:   CMainFrame   *pMain   =(CMainFrame   *)AfxGetMainWnd();   
    3)   在View中获得MainFrame指针   CMainFrame   *pMain=(CmaimFrame   *)AfxGetApp()->m_pMainWnd;   
    4)   获得View(已建立)指针CyouView   *pView=(CyouView   *)pMain->GetActiveView();   
    5)   获得当前文档指针   CDocument   *   pCurrentDoc   =(CFrameWnd   *)m_pMainWnd->GetActiveDocument();   
    6)   获得状态栏与工具栏指针   CStatusBar   *   pStatusBar=(CStatusBar   *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);   
  CToolBar   *   pToolBar=(CtoolBar   *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);   
    
    7)   假如框架中加入工具栏及状态栏变量(var)还可以此样     
  (CMainFrame   *)GetParent()->m_wndToolBar;   
  (CMainFrame   *)GetParent()->m_wndStatusBar;   
    
    8)   在Mainframe获得菜单指针   CMenu   *pMenu=m_pMainWnd->GetMenu();   
    9)   在任何类中获得应用程序软件代码类   
  用MFC全局函数functionAfxGetApp()获得。   
    
    10)   从文档类取得视图类地指针   
  俺就为从http://download.cqcnc.com/soft/program/article/vc/vc405.html学到地,   
  从文档获得视图类指针目地1般为呢控制同1文档地多个视图地定位问题和疑问,俺地体会   
  特别就为文字处理CEditView当产生多个视图类时,此个功能就为非常要地。     
  CDocument类提供呢两个函数function用于视图类地定位:   
  GetFirstViewPosition()及GetNextView()     
  virtual   POSITION   GetFirstViewPosition()   const;   
  virtual   CView*   GetNextView(POSITION&   rPosition)   const;   
    
  注意:GetNextView()括号中地参数用地就为引用方式,因此执行后值可能改变。   
  GetFirstViewPosition()用于返回第1个视图位置(返回地并非视图类指针,而就为1   
  个POSITION类型值),GetNextView()有两个功能:返回下1个视图类地指针以及用   
  引用调用地方式来改变传入地POSITION类型参数地值。很明显,在Test程序软件代码中,只有   
  1个视图类,因此只需将此两个函数function调用1次即可得到CTestView地指针如下(需定   
  义1个POSITION结构变量(var)来辅助操作):     
  CTestView*   pTestView;   
  POSITION   pos=GetFirstViewPosition();   
  pTestView=GetNextView(pos);   
    
  此样,便可到呢CTestView类地指针pTestView.执行完几句后,变量(var)pos=NULL,原因是没   
  有下1个视图类,自然也无下1个视图类地POSITION.但就为此几条语句太简单,非   
  具有太强地通用性及安全特征;当象前面说地那样,当要在多个视图为中返回某个指   
  定类地指针时,俺们要遍历所有视图类,直到找到指定类为止。判断1个类指针指   
  向地就为否某个类地实例时,可用IsKindOf()成员函数function时行检查,如:   
    pView->IsKindOf(RUNTIME_CLASS(CTestView));   
  即可检查pView所指就为否就为CTestView类。   
    
  有呢以顶基础,俺们已经可以从文档类取得任何类地指针。为呢方便,俺们将其作   
  为1个文档类地成员函数function,它有1个参数,表示要获得哪个类地指针。实现写出来如下:     
  CView*   CTestDoc::GetView(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.\r\n   http://www.VCKBASE.com");   
  return   NULL;   
  }   
    
  return   pView;   
  }   
    
  其中用呢两次视图类地成员函数functionIsKindOf()来判断,就为原因是退出while循环有三种   
  可能:   
    
  1.pos为NULL,即已经非存在下1个视图类供操作;   
  2.pView已符合要求。   
    
  1及2同就为满足。此就为原因是GetNextView()地功能就为将当前视图指针改变成1个视图   
  地位置同时返回当前视图指针,因此pos就为pView地下1个视图类地POSITION,完全   
  有可能既就为pos==NULL又就为pView符合要。当所需地视图就为最后1个视图就为最后1   
  个视图类时就如引。因此需采用两次判断。   
  使用该函数function应遵循如下格式(以取得CTestView指针为例):   
  CTestView*   pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView));   
  RUNTIME_CLASS就为1个宏,可以简单地理解它地作用:将类地名字转化为   
  CRuntimeClass为指针。至于强制类型转换也就为为呢安全特性考虑地,原因是从同1个   
  基类之间地指针类型就为互相兼容地。此种强制类型转换也许并非必要,但能避免1   
  些可能出现地麻烦。   
    
  3.从1个视图类取得另1视图类地指针   综合1及2,很容易得出视图类之间互相获得   
  指针地方法function:就就为用文档类作中转,先用1地方法function得到文档类地指针,再用2地方法function,   
  以文档类地视图定位函数function取得另1个视图类。同样,可以实现写出来成1个函数function:   
  (假设要从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;   
  }   
  此个函数function及2中地GetView()相比,1就为多呢第1句以取得文档类指针,二就为在   
  GetFirstViewPosition()及GetNextView()前加顶呢文档类指针,以表示它们就为文档   
  类成员函数function。有呢此函数function;当要从CTestAView中取得CTestBView地指针时,只需如   
  下:CTestBView*   pTestbView=(CTestView*)GetView(RUNTIME_CLASS(CTestBView));   
    
    
  11)对于单文档中也可以加入多个文档模板,但就为1般地编写开发就使用MDI方式编写开发   
  多文档模板,其方法function与顶述视图地获取方法function很接近,此里稍做解释,假如非清楚,   
  请查阅MSDN,(以下四个具体内容(11、12、13、14)来源:   
  http://sanjianxia.myrice.com/vc/vc45.htm)   
    
  可以用CWinApp::GetFirstDocTemplatePostion获得应用程序软件代码注册地第1个文档模板   
  地位置;利用该值来调用CWinApp::GetNextDocTemplate函数function,获得第1个   
  CDocTemplate对象指针。   POSITION   GetFirstDocTemplate(   )   const;     
  CDocTemplate   *GetNextDocTemplate(   POSITION   &   pos   )   const;   
    
  第二个函数function返回由pos   标识地文档模板。POSITION就为MFC定义设置地1个用于迭代或对象   
  指针检索地值。通过此两个函数function,应用程序软件代码可以遍历整个文档模板列表。假如被检索   
  地文档模板就为模板列表中地最后1个,则pos参数被置为NULL。   
    
    12)1个文档模板可以有多个文档,每个文档模板都保留并维护呢1个所有对应文   
  档地指针列表。     
  用CDocTemplate::GetFirstDocPosition函数function获得与文档模板相关地文档集合中第1   
  个文档地位置,并用POSITION值作为CDocTemplate::GetNextDoc地参数来重复遍历与   
  模板相关地文档列表。函数function原形为:   
  viaual   POSITION   GetFirstDocPosition(   )   const   =   0;     
  visual   CDocument   *GetNextDoc(POSITION   &   rPos)   const   =   0;       
    
  假如列表为空,则rPos被置为NULL.     
    
    13)在文档中可以调用CDocument::GetDocTemplate获得指向该文档模板地指针。   
  函数function原形如下:   CDocTemplate   *   GetDocTemplate   (   )   const;     
  假如该文档非属于文档模板管理,则返回值为NULL。     
    
    14)1个文档可以有多个视。每1个文档都保留并维护1个所有相关视地列表。   
  CDocument::AddView将1个视连接到文档顶,将该视加入到文档相联系地视地列表   
  中,并将视地文档指针指向该文档。当有File/New、File/Open、Windows/New或   
  Window/Split地命令而将1个新创建地视地对象连接到文档顶时,   MFC会自动调用   
  该函数function,框架通过文档/视地结构将文档及视联系起来。当然,程序软件代码员也可以根据自   
  己地要调用该函数function。   
  Virtual   POSITION   GetFirstViewPosition(   )   const;     
  Virtual   CView   *   GetNextView(   POSITION   &rPosition)   cosnt;     
    
  应用程序软件代码可以调用CDocument::GetFirstViewPosition返回与调用文档相联系地视地   
  列表中地第1个视地位置,并调用CDocument::GetNextView返回指定位置地视,并将   
  rPositon地值置为列表中下1个视地POSITION值。假如找到地视为列表中地最后1个   
  视,则将rPosition置为NULL.     
    
    15)从1个视图类取得另1视图类地指针   
  此个应用在多视地应用程序软件代码中很多见,1般假如自己在主程序软件代码或者主框架中做好变   
  量记号,也可以获得,还有比较通用地就就为用文档类作中转,以文档类地视图遍历   
  定位,取得另1个视图类。此个功能从本文第10项中可以得到。