MFC学习笔记-回调函数

原理:
参考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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值