VC回调函数定义和使用
时间:2011-03-20 来源:情有独钟
最近经常使用回调函数,有时感觉有点混乱,对回调函数理解不透,昨天花点时间深深品味了一下回调函数,写下博客记录一下,言规正转,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 有什么用,只能通过回调作用,传出来到要使用的地方进行处理,只是在回调函数声明时告诉系统有这么一个函数,实现部分在外面 。。。。 上面的问题也应该 不用回答了,,
就写到这了, 文字写的不够流畅,希望回调函数的使用和作用表达清楚 了,呵呵