原理:
参考Button的点击事件。
模块A(Dialog类)需要根据模块B的部分事件(Button点击事件)来实现逻辑,只需要在模块A中实现模块B的回调函数即可(Dialog类实现Button的点击事件)。模块B负责实现回调函数的原型,回调函数的注册。
(注:还可参考C#的事件进行理解,回调函数的原型即C#中的委托Delegate,回调函数的注册可以看成事件Event的注册,A中的回调函数,Event+=Fun中的Fun。)
使用情况:
如:通信时,异步接收。
例程部分代码说明:
摘取主要内容,此处我没有在B类中写线程来异步触发回调函数,所以开放接口caller()来外部触发,模拟实际情况。
注:例程是我缩减整理的,可能有部分错误,了解其精髓即可。
//B.h文件
//回调函数参数结构体
struct tagCallbackParam
{
public:
bool m_bParam0;
int m_nParam1;
CString m_szParam2;
tagCallbackParam()
{
m_bParam0 = false;
m_nParam1 = 100;
m_szParam2 = _T("100");
}
};
class CB
{
public:
CB();
virtual ~CB();
typedef void(*CallbackPrototype)(LPVOID lp, const tagCallbackParam& rParam);
void Register(CallbackPrototype pCallBackfun, LPVOID lp);
void Caller();
private:
CallbackPrototype m_pFun;
LPVOID m_lp;
tagCallbackParam m_callbackParam;
};
//B.cpp文件
//............
void CB::Register(CallbackPrototype myCallBackfun, LPVOID lp)
{
//注册回调函数(/类似注册事件)
m_pFun = myCallBackfun;
m_lp = lp;
}
void CB::Caller()
{
//实现一些操作信息
//..............
m_callbackParam.m_nParam1++;
m_callbackParam.m_szParam2.Format(_T("参数2=%d"),m_callbackParam.m_nParam1);
//触发回调函数(/类似触发事件)
m_pFun(m_lp, m_callbackParam);
}
//A.h文
//-此处我使用的是窗口类(Dialog.h)
#include "B.h"
//.........
class CB
{
public:
//............窗口类的一堆声明。
CB m_cb;
//回调函数,参数列表,返回值必须和回调函数原型一样,必须是静态,方便在初始化InitDialog时注册。
static void CallBackDefine(LPVOID lp, const tagCallbackParam& rParam);
}
//A.cpp
//-此处我添加了两个EditControl(显示参数信息),一个Button(负责触发回调函数)
BOOL A::OnInitDialog()
{
//......窗口初始化一大推
m_cb=B();
m_cb.Register(CallBackDefine,this);
}
//回调函数具体实现
void A::CallBackDefine(LPVOID lp, const tagCallbackParam& rParam)
{
A* pDlg = (A*)lp;A
CString szParam1Value;
szParam1Value.Format(_T("参数1=%d"), rParam.m_nParam1);
pDlg->GetDlgItem(IDC_EDIT1)->SetWindowTextW(szParam1Value);
pDlg->GetDlgItem(IDC_EDIT2)->SetWindowTextW(rParam.m_szParam2);
}
void A::OnBnClickedButton1()
{
m_cb.CallbackUser();
}
因篇幅问题不能全部显示,请点此查看更多更全内容