随笔-43  评论-2  文章-6  trackbacks-0

摘要:对VC++编程中如何访问MFC框架下各类的成员函数进行详细介绍,包括基于Doc/View architecture和Dialog base结构。给Doc/View下访问应用程序类、框架类、文档类、视类的快速方法,对基于Dialog下如何访问对话框成员函数进行了详细阐述。介绍了回调函数中访问类成员函数的方法。

Visual C++是微软公司C++语言开发环境,它成功地将C++“可视化”为Visual C++,Microsoft基本类库为Visual C++的核心,是学好、用好Visual C++的关键。
MFC中主要包括Document/View architecture support和Dialog based两种情况,文中给出了两种情况下类间访问的详细分析。
1.
2.Dialog based结构
   新建工程MyProject2,需要在自己新添加的X.cpp文件中访问对话框程序中的成员函数(X.cpp文件中的类是CX),可以采用传递指针的方法。
   2.1 利用构造函数传递指针变量
     在新添加的X.h文件中,添加构造函数
     CX(CMyProject2Dlg *pDlg);
     在相应的X.cpp文件中添加实现函数:
     CX::CX(CMyProject2Dlg *pDlg)
     {
         m_pDlg = pDlg;
     }
     此处m_pDlg是在X.h中定义的类成员变量:
     CMyProject2Dlg *m_pDlg;
     这样通过在CMyProject2Dlg中定义的CX的指针,就可以在X.cpp中实现访问CMyProject2Dlg中的构造函数,具体操作如下:
     在CMyProject2Dlg.h中添加
     CX *m_pX;
     在CMyProject2Dlg.cpp中添加
     m_pX = new CX(this);
     则实现了传递对话框指针给m_pDlg,这样就可以通过m_pDlg实现对CMyProject2Dlg中成员函数的访问了。

    2.2 直接在对话框类中实现访问
     采用直接在对话框创建时,在对话框显示之前初始化对话框的时候传递指针:
     BOOL CMyProject2Dlg::OnInnitDialog()
     {
           m_pX->m_pDlg = this;
     }

     第二种方法较第一种方法简单,在实际应用中比较常用。
     访问应用程序类成员函数,可直接应用程序类全局变量theApp,方法类似Doc/View结构下的实现。

3.回调函数中访问函数
  回调函数是系统自动调用的函数,相当于该函数由系统来管理,它类似于消息处理函数,由系统调用,但其中的处理过程,需要
  写代码来实现。程序中常常需要实现回调,在开发视频应用程序过程中用到了回调函数以实现视频数据的导出,当设置回调后,
  只要设备处于运行状态,每一场/帧数据达到时回调函数被调用。这样就可以在回调函数中进行数据的处理。
  
  回调函数就相当于一个中断处理函数,由系统在符合设定的条件时自动调用。为此需要做3件事:
  1)声明:
  2)定义:
  3)设置触发条件。
  下面以笔者所做的视频图像数据导出程序为例。

  回调函数声明:
  void WINAPI CALLBACKFUNCT (PVOID pData,IMAGEINFO pImageInfo,PVOID pUserData,ULONG Index);
  视频当前图像数据指针pData,用户传递给回调函数的上下文数据pUserData,

  回调函数的定义:
  void WINAPI CALLBACKFUNCT (PVOID pData,IMAGEINFO pImageInfo,PVOID pUserData,ULONG Index)
  {
         //视频数据的处理
    }

  设置触发条件,也就是在函数中把回调函数名称作为一个参数,以便于系统调用。
  
  回调函数只能声明为类的静态成员函数全局函数,而不能声明为类的普通成员函数,因为若声明为类的普通成员函数,则系
  统在调用回调函数时需要先生成类的对象,以便调用类的成员函数,然而运行时代码根本不知道如何去产生一个类的对象。
  
  将类名定义为CCamera,下面讨论如何在回调函数中调用类的成员函数进行数据的处理,回调函数中访问类的成员函数,此时
  可以设置回调函数为全局函数,定义添加如下:
  CALLBACKFUNCT (PVOID pData,IMAGEINFO pImageInfo,PVOID pUserData,ULONG Index)
  {
      CCamera *pThis = (CCamera *)pUserData;
  }
  这样就可以在回调函数中采用pThis访问CCamera类中的成员函数(注意此处把类的this指针作为传递的上下文数据)。
  
  也可以采用下列形式,首先定义一个全局变量g_pCamera,具体实现如下:
  CCamera *g_pCamera = NULL;
  g_pCamera = this;
  这样就可以用g_pCamera实现对类的成员函数的访问。

  如果回调函数被定义成类中的静态成员函数:
  static void WINAPI CALLBACKFUNCT (PVOID pData,IMAGEINFO pImageInfo,PVOID pUserData,ULONG Index);
  则在静态回调函数中调用类的成员函数与上述全局回调函数实现类似,但在定义一全局变量g_pCamera时需要定义一个静态的
  全局变量,具体实现如下:
  static  CCamera *g_pCamera = NULL;
  g_pCamera = this;
  这样,就可以李利用静态全局变量g_pCamera访问类中的成员函数。
  
4.结语
  给出VC++中关于MFC各类间成员函数的访问方法和回调函数中访问其他函数的技巧,希望对大家编程方面,特别是视频应用方面
  的开发有所帮助。

posted on 2012-12-02 01:13 寻步 阅读(828) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理