Why?VC中会有回调函数?

easydone 2000-05-24 09:29:00
小弟摸VC时日不多不少,亦有点“窍门儿”,可惟有回调函数(call back)始终没有弄清楚,本想放弃,但一想到还有“大虾”们在,便有了动力。望高人点化一番,十分感谢!
...全文
622 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
csuchao 2010-06-19
  • 打赏
  • 举报
回复
回调函数都属于函数指针

函数指针的一个特点:函数参数和返回值不变,函数名可变

windows的SDK编程中(MFC对应的是另一套消息处理机制),用户每定义一个窗口,都必须为该窗口指定消息处理函数(RegisterWindow中有一个函数指针),消息处理函数的名称可以用户自定义,但是格式是规定了的。

对于SDK内核来说,它就可以不关心用户自定义的函数名是多少,在内核需要的时候,去调用RegisterWindow中的那个函数指针就行了,因为用户已经调用RegisterWindow将自己的函数注册了。

这就是回调的最大好处:规定函数的格式,但是又能够给予用户以相当大的自由,这就使得很多“平台”对外提供的接口有很多是通过回调函数机制来实现的。
江王 2000-05-29
  • 打赏
  • 举报
回复
回调函数说白了就是事件响应程序,Windows的每个消息可以理解为一个事件,事件的响应代码要由用户自己来定义。用户定义了事件响应的代码,但还要Windows知道这段代码的位置(要不然Windows就不知道如何去调用,这也没有用),于是用户需要将回调函数的指针告诉Windows,最典型的例子是在窗口类的结构(WNDCLASS)中给lpfnWndProc分量赋回调函数指针值。
回调函数的参数格式是由回调函数的调用者(一般是Windows)来定义的,而回调函数的实现者必须遵循这种格式。Windows程序是以事件驱动模型为基础的,这就必然要用到回调函数这种机制。
要透彻了解回调函数,多看看SDK Samples。而MFC中的消息映射机制已经将窗口消息响应的回调函数隐藏起来了,这也符合C++的编程思想,回调函数终究是一种全局函数,它不能在类中实现,而消息映射机制的目的是使消息响应的代码最终封装在窗口类(CWnd类的子类)中。
softdoctor 2000-05-29
  • 打赏
  • 举报
回复
re:Kenny
Kenny 说的有道理...

看来还是Kenny研究的深刻

我想 easydone仁兄应该已经知道什么是回调函数了
Kenny 2000-05-29
  • 打赏
  • 举报
回复
真的好可笑!原来我只是想对牛弹琴而已。
Kenny 2000-05-27
  • 打赏
  • 举报
回复
动动脑筋好不好,在你的WndProc中去调用DefWindowProc,当然会是Microsoft style windows的常规做法喽,要不然,我为什么说自己风格呢?在WndProc中,用你自己的风格对一些消息进行处理,既然消息已经处理,为什么还要去调用DefWindowProc?在MFC中,WndProc已封装在CWnd中,所以它的实例都是千篇一律,如果想要自己特色,而不是MFC特色,就回调自己写的WndProc。
pccrazy 2000-05-27
  • 打赏
  • 举报
回复
re: Kenny

可笑!

真不知道"您阁下"是要挣辨什么?
pccrazy 2000-05-26
  • 打赏
  • 举报
回复
to Kenny:
你对 WndProc叙述不对, WndProc是由作者自己编写的,在WndProc前是不会处理消息的。
大部分消息的处理是在WndProc的尾部用DefWindowProc()处理。(我本来就是学API编程的!)
Kenny 2000-05-26
  • 打赏
  • 举报
回复
to softdoctor:
如果有时间,不妨看看MESSAGE_MAP宏,消息映射是回调函数,只是这种回调函数的用法不同而已。普通的回调函数是要你提供地址,传进某个函数,由它去调用;而消息映射函数,却是由你定义函数,由MESSAGE_MAP宏去取得地址,并实现它的调用。请问,放在包中的钢笔,还叫钢笔吗?
To pccrazy:
事实上,WndProc在实现时,已完成了绝大多数消息的处理,而在它处理其中一些消息时还会发出附加的消息。当然,如果你对WINDOWS的消息处理完全满意的话,此回调函数当然不会有意义;但如果你要使自已的程序更具自己特色,而不是WINDOWS模式的另一个缺乏个性的实例,那就要自己动手去写WndProc了。如果你用VC++的非MFC方式编过程,你就会有更深一层的理解。
laagee 2000-05-26
  • 打赏
  • 举报
回复
回调函数很好玩啊。
kxy 2000-05-25
  • 打赏
  • 举报
回复
CallBack是事件驱动的基础
pccrazy 2000-05-24
  • 打赏
  • 举报
回复
所谓回调就是触发式调用,也就是交Windows调用的函数。这个函数是否被调用主要是靠
windows决定,如上面朋友所说的窗口的消息处理函数,ListView的排序函数,Enum函数等
kxy 2000-05-24
  • 打赏
  • 举报
回复
查询callback,有一些讨论,
参看http://210.77.145.209/csdn/expert/Topic/1194.shtm
Kenny 2000-05-24
  • 打赏
  • 举报
回复
我的理解:
比如你要写一个CxListCtrl的类,而该类的实例要尽量适用于各种不同的未来的情况。但你根本不知道未来实例中的Item的类型,也许你写这个类完全是为了给别人调用(甚至只是一个服务server),这时你将遇到一个问题:当所显示的ITEM需排序时,你以什么样的方法去排序你根本不知道数据类型的一组数据呢?可是排完序之后,ITEM的存储方式要在以后写实例的时候去改变,抑或由另外一个人(或客户端client)去改变,将会造成极大的不便,而你的CxListCtrl类中,其它的操作(如显示等)都要用到数据的存储方式,而存储方式这时你又不能确定,这似乎使你陷入绝境。但不要急,你可以借助回调函数去实现排序。你所要做的是制订一个回调函数的规范:返回值、参数个数、参数长度等,然后设制一个地址成员变量来保存此函数的地址,在你需排序ITEM方式时,调用此函数的指针即可。也就是说,你根本不需要关心ITEM的变量类型、排序方法等,只要知道数据地址即可。而写实例时,或对其他人(写Client程序时),只需写一个针对不同数据类型的排序算法(或用户特定的排序算法)的回调函数,并把该函数的地址按约订保存在相应的位置即可。这就是回调函数,它给用户提供了更大的空间,去写出自己认为更能体现自己特色的实现,而不影响你提供的服务的完整性。
常见的回调函数包括窗口函数,消息映射函数等。
Kenny 2000-05-24
  • 打赏
  • 举报
回复
我的理解:
比如你要写一个CxListCtrl的类,而该类的实例要尽量适用于各种不同的未来的情况。但你根本不知道未来实例中的Item的类型,也许你写这个类完全是为了给别人调用(甚至只是一个服务server),这时你将遇到一个问题:当所显示的ITEM需排序时,你以什么样的方法去排序你根本不知道数据类型的一组数据呢?可是排完序之后,ITEM的存储方式要在以后写实例的时候去改变,抑或由另外一个人(或客户端client)去改变,将会造成极大的不便,而你的CxListCtrl类中,其它的操作(如显示等)都要用到数据的存储方式,而存储方式这时你又不能确定,这似乎使你陷入绝境。但不要急,你可以借助回调函数去实现排序。你所要做的是制订一个回调函数的规范:返回值、参数个数、参数长度等,然后设制一个地址成员变量来保存此函数的地址,在你需排序ITEM方式时,调用此函数的指针即可。也就是说,你根本不需要关心ITEM的变量类型、排序方法等,只要知道数据地址即可。而写实例时,或对其他人(写Client程序时),只需写一个针对不同数据类型的排序算法(或用户特定的排序算法)的回调函数,并把该函数的地址按约订保存在相应的位置即可。这就是回调函数,它给用户提供了更大的空间,去写出自己认为更能体现自己特色的实现,而不影响你提供的服务的完整性。
常见的回调函数包括窗口函数,消息映射函数等。
Lin 2000-05-24
  • 打赏
  • 举报
回复
  按照我的理解,回调函数是一个占位符号,M$在Windows里面没有实现它,而必须由用户提供,系统在执行到某些具体的功能时会调用回调函数,由用户去实现特定的功能。用户提供回调函数就相当于(只是相当于)在VC++的类中重载了某个函数。
不知这样对不对?
Smile_Tiger 2000-05-24
  • 打赏
  • 举报
回复
我的理解

callback就是WINDOWS提供给编程者的控制接口

自定义的callback函数 MyCallBack----
{
...
...
}


windows执行--

...
...
SetCallBack(MyCallBack)
...
...
MyCallBack(window参数)
...
...
zroc 2000-05-24
  • 打赏
  • 举报
回复
同意 softdoctor 的观点.
softdoctor 2000-05-24
  • 打赏
  • 举报
回复
to pccrazy:

没有说你
pccrazy 2000-05-24
  • 打赏
  • 举报
回复
re: softdoctor

我说在处理消息函数是指窗口的回调函数:
WndProc(HWND hWnd,UINT iMsg,WPARAM wParam,LPARAM lParam);
不是消息的映射函数
softdoctor 2000-05-24
  • 打赏
  • 举报
回复
知道什么是函数指针吗?
如果不知道,就去看看书
如果知道,就好办了。回调函数就是供别人调用的函数,
此函数你自己实现,告诉调用者使用你的函数的指针,即地址。
如果调用者知道参数形式及调用方式回调函数就可以调用该函数了。

需要说明的是MFC中的消息映射函数并非回调函数,它们只是窗口
函数的一部分实现函数。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧