一文看懂MFC回调函数使用方法

一直使用C#委托得心应手,但是扯到MFC或者C++委托就不太清楚了,今天特地研究下MFC回调函数,在网上找了一大堆资料,但是都讲得不清不楚,对于初学者还是不会用,不过幸好找到一篇文章,就是这唯一一篇文章我一下子明白了怎么用,有时候不需要具体清楚回调函数原理,但是必须得会使用才是关键,建议大家看下这篇文章https://blog.csdn.net/hwb506/article/details/6630479,其他可以简单看下。下面是我对回调函数理解。

MFC回调函数据说和C#委托差不多,更一般的是说C#委托和C++指针差不多。有些读者认为回调函数没什么用,那只能说明编程用的少了,不了解这个其实运用十分广泛。就C#来说委托可以完成跨窗口传值,自定义类中耗时提醒,事件委托,跨线程访问控件等等诸多功能。在MFC中其实也很有用处。我举个例子,我们自定义一个封装类给别人用,假如类里面有耗时操作,怎么知道进度了?如果别人调用以为没有反应或者封装的函数有问题,其实回调函数就可以派上用场。例如

class A

{

public void TransferString(CString str)

{

CString s;

for(int i=0i<100000000,i++)

{

s.Format("%d",i);

str=str+s+"\r\n";

}

}
};

 

如果你把这个类拿出去给别人用,而别人不关心类的具体实现,当别人使用

A a;

a.TransferString("test");

会怎么样?结果会发现程序没反应,当然不卡死可以放进线程,这里只是举个例子,这是因为在做耗时操作。

我碰到具体问题时,公司需要我封装一个socket类给开发人员使用,但是开发人员不用懂这个类,此时一个问题来了,socket通信,服务端接收数据需要处理,我不可能封装里面自定义处理,因为后面有要求,我岂不是要修改我这个类?此时回调函数派上用场,我只要把接收的数据回调出去,别人在回调函数自己处理数据,而不用这么麻烦修改这个类了。是不是很有用?

其实如果你是一个资深程序员还有其他方法使用回调函数,我的意思就是不懂MFC回调函数也可以使用其他方法?什么方法?其实就是C#委托!把C#一些类封装成DLL,然后使用C++ CLI就可以使用委托,当然也可以直接使用C++ CLI实现委托。这里我不就赘述了,因为这是讲述的MFC,C#方法我就滤过了。

最后再把那篇博客复制过来一下,以便自己再次查看。

最近经常使用回调函数,有时感觉有点混乱,对回调函数理解不透,昨天花点时间深深品味了一下回调函数,写下博客记录一下,言规正转,VC中的定时器是一种特殊的回调函数,只要我们设置好了定时器,我们就不用管什么时候调用定时器处理函数,是操作系统负责调用,定时器的处理函数还是我们自己去写实现。

      为什么 要用回调函数呢,这个问题我也想过,现在先说说回调函数的定义 和使用,过下在回答为什么 要使用回调函数,

    下面这个例子是处理从一个普通的C++类CTest中把数据传到一个对话框类CTestCALLDlg中去,这里不能用消息来处理,因为消息只能处理线程和对话框之间的数据传输,对纯C++不起作用,这种情况 下,就只能用回调函数来处理了,

     在Test.h文件中CTest定义之前定义 typedef  bool (WINAPI * SendCmd)(WORD NodeID);用于声明一种指针类型,也就是后面要用到的回调函数类型,在在Test.h文件中定义一个成员函数void Testcall(SendCmd);注意这个成员函数的参数,在Test.cpp中:

void CTest::Testcall(SendCmd Sd)
{
 Sd(10);

}

在CTestCALLDlg.cpp中写下回调函数SendCmdt 的实现部分 和 OnBnClickedButton1事件调用

bool _stdcall CALLBACK SendCmdt(WORD NodeID)
{
 return true;
}

void CTestCALLDlg::OnBnClickedButton1()
{
 // TODO: 在此添加控件通知处理程序代码
 CTest m_test;
 m_test.Testcall(SendCmdt);
}

此时程序运行,就进入了回调函数中去了,这样做的目的是把NodeID变量 的值从CTest类传到CTestCALLDlg类中,回调函数的一个好处是 在CTest 中不知道NodeID 有什么用,只能通过回调作用,传出来到要使用的地方进行处理,只是在回调函数声明时告诉系统有这么一个函数,实现部分在外面 。。。。 上面的问题也应该 不用回答了,,

     就写到这了, 文字写的不够流畅,希望回调函数的使用和作用表达清楚 了,呵呵

你可能感兴趣的:(C/C++,VC++)