VC 回调函数及使用方法

 
回调函数说白了就是事件响应程序,Windows的每个消息可以理解为一个事件,事件的响应代码要由用户自己来定义。用户定义了事件响应的代码,但还要Windows知道这段代码的位置(要不然Windows就不知道如何去调用,这也没有用),于是用户需要将回调函数的指针告诉Windows,最典型的例子是在窗口类的结构(WNDCLASS)中给lpfnWndProc分量赋回调函数指针值。


回调函数的参数格式是由回调函数的调用者(一般是Windows)来定义的,而回调函数的实现者必须遵循这种格式。Windows程序是以事件驱动模型为基础的,这就必然要用到回调函数这种机制。


要透彻了解回调函数,多看看SDK Samples。而MFC中的消息映射机制已经将窗口消息响应的回调函数隐藏起来了,这也符合C++的编程思想,回调函数终究是一种全局函数,它不能在类中实现,而消息映射机制的目的是使消息响应的代码最终封装在窗口类(CWnd类的子类)中。


如果有时间,不妨看看MESSAGE_MAP宏,消息映射是回调函数,只是这种回调函数的用法不同而已。普通的回调函数是要你提供地址,传进某个函数,由它去调用;而消息映射函数,却是由你定义函数,由MESSAGE_MAP宏去取得地址,并实现它的调用。


回调函数是一个程序员不能显式调用的函数;通过将回调函数的地址传给调用者从而实现调用。要实现回调,必须首先定义函数指针。尽管定义的语法有点不可思议,但如果你熟悉函数声明的一般方法,便会发现函数指针的声明与函数声明非常类似。

 

CODE:

typedef void (*f1) ();// 为函数指针声明类型定义
void (*p) (); //p
是指向某函数的指针
void func1()
{
printf("From func1(), Hello World!\n");   
/* do something */
}

void caller(void(*ptrfunc1)())
{
ptrfunc1(); /* 调用ptr指向的函数 */
}

//typedef bool (*f2) (int *);//
为函数指针声明类型定义
//bool (*q) (int *); //p
是指向某函数的指针

bool func2(int* t_i)
{
/* do something */
printf("From func2() = %d, Hello World!\n", (*t_i)++);
return true;
}

void caller2(bool (*ptrfunc2)(int *), int * i)
{
ptrfunc2(i); /*
调用ptr指向的函数 */
}


int main(int argc, char* argv[])
{
printf("From main(), Hello World!\n");
printf("\n");

//
无参数调用
p = func1; /*
传递函数地址地址 */
caller(p); /*
传递函数地址到调用者 */

//
有参数调用
int i = 0;
for (int j = 0; j < 10; j++)
{
caller2(func2, &i); //*
传递函数地址到调用者 */
}

//
有参数调用第二次
i = 0;
//q = func2; /*
传递函数地址地址 */
//caller2(q, &i); /*
传递函数地址到调用者 */
printf("\n");
printf("From main(), Hello World!\n");
getchar();
return 0;
}

 

-----------------------------------------------------------------------------

另外回调函数的一些资料

http://baike.baidu.com/view/414773.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值