MFC学习笔记-回调函数

MFC学习笔记 专栏收录该内容
16 篇文章 0 订阅

原理:
参考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();
}
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

FairyTailQ

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值