• VC++ 回调函数及使用方法(转)


    转载:http://blog.csdn.net/vsooda/article/details/7435801

    转载:http://blog.csdn.net/lincyang/article/details/29175413

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

      回调函数的参数格式是由回调函数的调用者(一般是Windows)来定义的,而回调函数的实现者必须遵循这种格式。Windows程序是以事件驱动模型为基础的,这就必然要用到回调函数这种机制。
      要透彻了解回调函数,多看看SDK Samples。而MFC中的消息映射机制已经将窗口消息响应的回调函数隐藏起来了,这也符合C++的编程思想,回调函数终究是一种全局函数,它不能在类中实现,而消息映射机制的目的是使消息响应的代码最终封装在窗口类(CWnd类的子类)中。

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

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

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

    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;
    }

     1 #include <stdlib.h>
     2 #include <stdio.h>
     3 int Test1()
     4 {
     5    int i;
     6    for (i=0; i<30; i++)
     7    {
     8      printf("The %d th charactor is: %c/n", i, (char)('a' + i%26));
     9    }
    10    return 0;
    11 }
    12 
    13 int Test2(int num)
    14 {
    15    int i;
    16    for (i=0; i<num; i++)
    17    { 
    18     printf("The %d th charactor is: %c/n", i, (char)('a' + i%26));
    19    }
    20    return 0;
    21 }
    22 
    23 void Caller1(int (*ptr)())
    24 //指向函数的指针作函数参数
    25 {
    26    (*ptr)();
    27 }
    28 
    29 void Caller2(int n, int (*ptr)(int n))
    30 //指向函数的指针作函数参数,这里第一个参数是为指向函数的指针服务的,
    31 {
    32    //不能写成void Caller2(int (*ptr)(int n)),这样的定义语法错误。
    33    (*ptr)(n);
    34    return;
    35 }
    36 int main()
    37 
    38 {
    39 
    40    printf("************************/n");
    41 
    42    Caller1(Test1); //相当于调用Test1();
    43 
    44    printf("************************/n");
    45 
    46    Caller2(30, Test2); //相当于调用Test2(30);
    47 
    48    return 0;
    49 
    50 }
    51 
    52 /*
    53 int main()
    54 
    55 {
    56 
    57    printf("************************/n");
    58 
    59    Caller1(&Test1); //相当于调用Test1();
    60 
    61    printf("&&&&&&************************/n");
    62 
    63    Caller2(30, &Test2); //相当于调用Test2(30);
    64 
    65    return 0;
    66 
    67 }
    68 */
  • 相关阅读:
    谷粒商城学习——P41vue组件化
    谷粒商城学习——P40计算属性、侦听器、过滤器
    谷粒商城学习——P38-39Vue-指令-单向绑定&双向绑定&v-onv-forv-if
    谷粒商城学习——P37vue基本语法——双向绑定、事件处理
    谷粒商城学习——P36Vue介绍与HelloWord
    谷粒商城学习——P35模块化
    谷粒商城学习——P34Promise异步编排
    Windows tcp/ip(CVE-2020-16898)远程代码执行蓝屏漏洞复现
    QQ群关系可视化3D查询搭建
    Skywalking 8.1 Docker 服务端部署
  • 原文地址:https://www.cnblogs.com/chechen/p/6141920.html
Copyright © 2020-2023  润新知