看了一下csdn上的帮助,有这样的解释:使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。
而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作
很是抽象,不知道哪位兄弟能仔细的讲解下,打个形象的比喻或者用函数A,B,C表示他们之间的关系 解释下,多谢了。还有窗口回调函数WindowProc怎么用的,在什么情况下被触发?

解决方案 »

  1.   

    A:系统API
    B:自己写的函数C:调用A,传B进去,A里面会调用自己写的B函数
      

  2.   

    百度百科“回调函数”讲的还是比较清晰的
    http://baike.baidu.com/view/414773.htm
      

  3.   

    http://blog.csdn.net/xingyu2006/archive/2008/09/24/2974360.aspx
      

  4.   

    typedef void (*MsgBoxFunction)(int);void MsgBoxFunc(MsgBoxFunction mbFunc)           //A
    {
    mbFunc(1);
    }void ShowMsg(int i)                         //B
    {
    CString str;
    str.Format("%d",i);
    AfxMessageBox(str);
    }void CallMsgBoxFunc()                       C
    {MsgBoxFunc(ShowMsg);
    }注意,如果把类的成员函数声明为回调函数,要定义成static,例如B本例中的B
      

  5.   


    多谢了,结贴给分。还有窗口回调函数WindowProc怎么用的,在什么情况下被触发?
      

  6.   

    回调就是将函数的地址存储到变量里,函数本身就是地址,直接调用也是调用,存储到变量里再调用也是调用,这个变量是关键。a部分有函数fun1,b部分要调用fun1,b给a一个变量,a将fun1的地址存储到变量中,b调用变量所指向的函数就行了。
      

  7.   

    A是你的程序,B是系统代码,系统怎么调用你的代码呢?就是你把fun1的地址传递给系统嘛,你虽然写了代码,但是自己不调用,系统在“适当”的时候调用,这就是“回调”了。
      

  8.   

    首先你要理解回调函数的作用。
    一般情况下你编写程序都是调用操作系统的API(或者调用其他库的函数),但是在某些时候,它们会反过来调用你所编写的函数,这样的函数就 叫做“回调函数”。
    举例子,SetTimer的最后一个参数就是一个回调函数的指针,为什么这么设置?想一想...
    因为定时消息的响应代码的实现并不是唯一的(如果是1秒一次的话,到点后干什么事,不同的程序就有不同的实现),针对不同的业务逻辑有不同的实现体,但是接口是确定的(函数指针的定义形式),因此就采用回调函数。
    你如果了解OO里面的“多态”的话,回调函数的作用就类似于多态,通过回调函数可以达到“动态绑定”的效果,把接口和实现分离,把具体的实现延迟到运行的时候。
    还有一种应用就是异步调用,这方面你可以参考下异步网络编程。
      

  9.   

    WindowProc就是典型的异步回调方式。这个函数你永远不会在程序中显示地调用,而是由系统去调用的。
    这就看你理不理解Windows程序的设计方式。Windows程序一般都包括至少一个UI线程,0个或多个工作者线程。WindowProc便是服务于UI线程。
    举例子,当你的工作者线程给UI线程发送一个消息之后,如果是SendMessage,那么对应的窗体便会转移到WindowProc来处理这个消息;如果是PostMessage,那么系统会首先将该消息存放在一个队列中,然后在UI线程中不断地从队列里“提取消息-解释消息-处理消息”,处理消息的入口点就是WindowProc。你如果了解“观察这模式”的话,Windows下有一种方式可以很便捷地实现观察者模式:“SendMessage/PostMessage - WindowProc”
    在Model中绑定一个或者多个窗口句柄(HWND),当Model的状态改变的时候,把新的状态信息通过发消息的方式传递给View(CWnd),View收到消息之后会异步地进行处理,并更新Model的状态。