引用MFC指针的获取【二】

10、通过鼠标获得子窗口指针

  CWnd* ChildWindowFromPoint(POINT point) const;

  CWnd* ChildWindowFromPoint(POINT point,UINT nFlags) const;

  用于确定包含指定点的子窗口

  如果指定点在客户区之外,函数返回NULL;

  如果指定点在客户区内,但是不属于任何一个子窗口,函数返回该CWnd的指针;

  如果有多个子窗口包含指定点,则返回第一个子窗口的指针。

  还要注意的是,该函数返回的是一个伪窗口指针,不能将它保存起来供以后使用。

  对于第二个参数nFlags有几个含义:

  CWP_ALL             file://不忽略任何子窗口

  CWP_SKIPNIVSIBLE    file://忽略不可见子窗口

  CWP_SKIPDISABLED    file://忽略禁止的子窗口

  CWP_SKIPRANSPARENT file://忽略透明子窗口

  获取工具条的指针

  在缺省状态下,有一个默认的工具条AFX_IDW_TOOLBAR,我们可以根据相应的ID去获取工具条指针,方法如下:

  CToolBar* pToolBar=(CToolBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);

  是不是很简单?

  获取状态条的指针

  在缺省状态下,有一个默认的状态条AFX_IDW_STATUS_BAR,我们自然也可以根据相应的ID去获取状态条指针,方法如下:

  CStatusBar* pToolBar=(CStatusBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);

  这里有两种方法。

 一、调用CWnd: : GetDlgItem,获取一个CWnd*指针调用成员函数。例如,我们想获取CButton指针,方法如下:

  CButton* pButton=(CButton*) GetDlgItem (IDC_MYBUTTON);

  二、可以使用ClassWizard将控件和成员变量联系起来。在ClassWizard中简单地选择Member Variables标签,然后选择Add Variable …按钮。如果在对话资源编辑器中,按下Ctrl键并双击控件即可转到Add Member Variable对话。

  我们可以利用文档类的成员函数GetFirstView()和GetNextView()遍历视图。

  其实,在视图类中有一个现成的成员函数供我们使用,那就是:GetDocument();利用它我们可以很容易的得到文档类指针,我们先看一下 GetDocument()函数的实现:

  CColorButtonDoc* CColorButtonView::GetDocument()

  {

      ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CColorButtonDoc)));

            return (CColorButtonDoc*)m_pDocument;

  }

  这里实际上是将m_pDocument强制转换成CColorButtonDoc*,也就是我们想要的。

  这里我们可以利用GetActiveXXXXX()去掉用当前激活的文档和视图:

  CMyDoc*   pDoc=(CMyDoc*)GetActiveDocument();

  CMyView* pView=(CMyView*)GetActiveView();

  这个很简单,一句话搞定:

  CMyApp* pApp=(CMyApp*)AfxGetApp();

  在类CWinThread里面有一个公有的成员变量:CWnd* m_pMainWnd; 它存在的主要目的就是提供我们获得CWnd指针,我们可以利用它来达到我们的目的:

  CMainFrame* pFrame=(CMainFrame*)(AfxGetApp()->m_pMainWnd);

  通过鼠标获得子窗口指针

  这里我们要用到一个不太常用的函数:ChildWindowFromPoint。他的原型如下:

  CWnd* ChildWindowFromPoint(POINT point) const;

  CWnd* ChildWindowFromPoint(POINT point,UINT nFlags) const;

  这个函数用于确定包含指定点的子窗口,如果指定点在客户区之外,函数返回NULL;如果指定点在客户区内,但是不属于任何一个子窗口,函数返回该CWnd 的指针;如果有多个子窗口包含指定点,则返回第一个子窗口的指针。不过,这里还要注意的是:该函数返回的是一个伪窗口指针,不能将它保存起来供以后使用。

  忽略任何子窗口略不可见子窗口略禁止的子窗口

  在何时何地,你都可以通过以下方法精确的得到任何一个对象 (Application,DocTemplate,Document,View,Frame)

  1。通过AfxGetApp()得到当前的App对象;

  2。通过AfxGetMainWnd()得到主窗口;

  3。通过CMDIFrameWnd::GetActiveFrame得到当前活动窗口;

  4。通过GetNextWindow()遍例所有的子窗口;(如果要得到你想要的子窗口,可以通过特定的成员变量来标志);

  5。通过CWinApp::GetFirstDocTemplatePostion()以及 CWinApp::GetNextDocTemplate() 的组合应用来遍历所有的DocTemplate对象,并且用CDocTemplate::GetDocString()来判断当前得到的文档莫板对象是哪个。

  6。通过CDocTemplate::GetFirstDocPosition()以及CDocTemplate的GetNextDoc()组合来遍历所有的该模板的文档对象,并用CDocument::GetDocTemplate()来得到文档模板,用CDocment::GetTitle() 或者GetPathName()来判断当前的文档是哪个。

  7。通过CDocuemt的GetFirstViewPositon()以及GetNextView()来遍历视图对象,一般通过访问View的成员变量 来区别各个视图;通过CView::GetDocument()来得到文档对象;

  8。Frame->View: 通过GetActiveView方法;

  9。Frame->Doc:通过GetActiveDocument();

  10。View->Frame:GetParentFrame();

  11。View->Doc:GetDocuemt()//前面已经说了。

  12。Doc->View:前面说了;

  13。Doc->Frame:不知道有没有很直接的方法。

  MFC应用程序中指针的使用

  1) 在View中获得Doc指针

  2) 在App中获得MainFrame指针

  3) 在View中获得MainFrame指针

  4) 获得View(已建立)指针

  5) 获得当前文档指针

  6) 获得状态栏与工具栏指针

  7) 获得状态栏与工具栏变量

  8) 在Mainframe获得菜单指针

  9) 在任何类中获得应用程序类

  10) 从文档类取得视图类的指针(1)

  11) 在App中获得文档模板指针

  12) 从文档模板获得文档类指针

  13) 在文档类中获得文档模板指针

  14) 从文档类取得视图类的指针(2)

  15) 从一个视图类取得另一视图类的指针

 VC中编程对于刚刚开始学习的同学,最大的障碍和问题就是消息机制和指针获取与操作。其实这些内容基本上是每本VC学习工具书上必讲的内容,而且通过MSDN很多问题都能解决。下面文字主要是个人在编程中指针使用的一些体会,说的不当的地方请指正。一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,无论是多文档还是单文档,都存在指针获取和操作问题。下面这节内容主要是一般的框架,然后再讲多线程中的指针使用。使用到的类需要包含响应的头文件。首先一般获得本类(视,文档,对话框都支持)实例指针this,用this的目的,主要可以通过类中的函数向其他类或者函数中发指针,以便于在非本类中操作和使用本类中的功能。

  1) 在View中获得Doc指针 CYouSDIDoc *pDoc=GetDocument();一个视只能有一个文

  档。

  2) 在App中获得MainFrame指针

  CWinApp 中的 m_pMainWnd变量就是MainFrame的指针

  也可以: CMainFrame *pMain =(CMainFrame *)AfxGetMainWnd();

  3) 在View中获得MainFrame指针 CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;

  4) 获得View(已建立)指针 CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;

  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) 如果框架中加入工具栏和状态栏变量还可以这样

  (CMainFrame *)GetParent()->m_wndToolBar;

  (CMainFrame *)GetParent()->m_wndStatusBar;

  8) 在Mainframe获得菜单指针 CMenu *pMenu=m_pMainWnd->GetMenu();

  9) 在任何类中获得应用程序类

  用MFC全局函数AfxGetApp()获得。

  10) 从文档类取得视图类的指针

  我是从学到的,

  从文档获得视图类指针目的一般为了控制同一文档的多个视图的定位问题,我的体会特别是文字处理CEditView当产生多个视图类时,这个功能是非常需要的。

  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类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值