回调函数:通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

#include <windows.h>
#include "resource.h"LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);HINSTANCE hInst;
TCHAR szClassName[] = TEXT("callbackDemo");typedef struct gfun{int (*pfun)(int);
}gfun;int myfun(int , HDC );int WINAPI
WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil)
{HWND hwnd;MSG messages;WNDCLASSEX wincl;hInst = hThisInstance;wincl.hInstance = hThisInstance;wincl.lpszClassName = szClassName;wincl.lpfnWndProc = WindowProcedure;wincl.style = CS_DBLCLKS;wincl.cbSize = sizeof (WNDCLASSEX);wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);wincl.hCursor = LoadCursor (NULL, IDC_ARROW);wincl.lpszMenuName = MAKEINTRESOURCE (IDC_CALLBACKDEMO);wincl.cbClsExtra = 0;wincl.cbWndExtra = 0;wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);if (!RegisterClassEx (&wincl))return 0;hwnd = CreateWindowEx (0,szClassName,TEXT("C 回调函数Demo"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,300,200,HWND_DESKTOP,NULL,hThisInstance,NULL);ShowWindow (hwnd, nFunsterStil);while (GetMessage (&messages, NULL, 0, 0)){TranslateMessage(&messages);DispatchMessage(&messages);}return messages.wParam;
}LRESULT CALLBACK
WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{PAINTSTRUCT ps;HDC hdc;RECT rt;    char szBuffer[100]; int ret;gfun gf;switch (message){case WM_COMMAND:switch (LOWORD(wParam)){case IDM_callback:     hdc=GetDC(hwnd);gf.pfun = myfun;ret = rt_data(100,gf.pfun,hdc);wsprintf(szBuffer, "return data:%d",ret);TextOut(hdc,100,100,szBuffer,lstrlen(szBuffer));break;case IDM_ABOUT:MessageBox (hwnd, TEXT ("callbackDemo v1.0\nCopyright (C) 2020\n by bo"),TEXT ("callbackDemo"), MB_OK | MB_ICONINFORMATION);break;case IDM_EXIT:DestroyWindow(hwnd);break;default:return DefWindowProc(hwnd, message, wParam, lParam);                }break;case WM_CREATE:break;case WM_PAINT:hdc = BeginPaint(hwnd, &ps);                 GetClientRect(hwnd, &rt);               EndPaint(hwnd, &ps);break;case WM_DESTROY:PostQuitMessage (0);break;default:return DefWindowProc (hwnd, message, wParam, lParam);}return 0;
}int myfun(int data, HDC hdc)
{char szBuffer[100];    wsprintf(szBuffer, "get data:%d",data);TextOut(hdc,100,50,szBuffer,lstrlen(szBuffer));return (data*2);
}
int rt_data(int data,int (*tr_fun)(), HDC hdc)
{return ((*tr_fun)(data,hdc));
}

运行如下;

将结构体中的函数指针指向了myfun函数地址,在回调函数中将函数指针gf.pfun作为rt_data(int data,int (*tr_fun)())函数的参数即为int (*tr_fun)();回调函数中的return (*tr_fun)(data)相当于对指针进行了简引用,返回这个指针指向地址的内容值。

回调函数的意义
可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。

回调可用于通知机制。

用户和开发者之间的概念;用户是实现myfun这个函数,开发者是实现rt_data函数,根据需求用户将myfun函数以参数的形式传入开发者的rt_data函数中,rt_data函数就能返回给相应的数据给用户,开发者不用告诉用户它实现了什么,用户也并不知道开发者怎么实现,用户只用传入自己的函数,便可以得到开发者实现的函数返回值,开发者可以将内容封装起来,将头文件以及库文件提供给用户。

工程;

资源和头文件;

#include "resource.h"
#include <windows.h>/
//
// Menu
//IDC_CALLBACKDEMO MENU
BEGINPOPUP "&File"BEGINMENUITEM "回调函数Demo",                 IDM_callbackMENUITEM "E&xit",                 IDM_EXITENDPOPUP "&Help"BEGINMENUITEM "&About ...",             IDM_ABOUTEND
END
#define  IDM_EXIT        10001
#define     IDM_ABOUT       10002#define    IDC_CALLBACKDEMO        10101
#define     IDD_ABOUTBOX    10102
#define     IDM_callback    40001

C语言回调函数Demo - Win32版相关推荐

  1. C语言回调函数demo(帮助理解)以海康isapiExternDemo回调函数为例

    参考文章:c语言指针回调函数最全demo实例(简单明了一看就会) 回更 20220303 \demo\base\isapiExternDemo\isapiExternDemo.c 这边海康定义了一个回 ...

  2. C语言 回调函数 callback - C语言零基础入门教程

    目录 一.回调函数原理 二.回调函数简介 1.函数指针 2.指针函数 3.回调函数解释 三.回调函数实战 四.回调函数使用总结 五.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 ...

  3. c语言 is函数,关于C语言回调函数的详解~

    原标题:关于C语言回调函数的详解~ 01 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下, ...

  4. c语言回调函数_C语言学习第26篇---函数与指针分析 回调函数

    函数类型的概念 1.C语言函数也是有类型的 2.函数类型由函数返回值,参数类型,参数个数共同决定 int add(int i,int j) 的类型是 int(int , int) 3.C语言中通过ty ...

  5. 一文搞懂C语言回调函数

    转载自:https://segmentfault.com/a/1190000008293902?utm_source=tag-newest 博主:Rdou Typing 来源:segmentfault ...

  6. C语言回调函数callback

    一.定义和使用场合 回调函数是指 使用者自己定义一个函数,实现这个函数的程序内容,然后把这个函数(入口地址)作为参数传入别人(或系统)的函数中,由别人(或系统)的函数在运行时来调用的函数.函数是你实现 ...

  7. C语言回调函数的定义和写法

    C语言中的回调函数(Callback Function) 1 定义和使用场合 回调函数是指 使用者自己定义一个函数,实现这个函数的程序内容,然后把这个函数(入口地址)作为参数传入别人(或系统)的函数中 ...

  8. c语言timer linux 回调函数_C语言回调函数详解

    1. 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下,发现众说纷纭,有很大一部分都是使用类 ...

  9. C 语言回调函数详解

    1. 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?网络上众说纷纭,有很大一部分都是使用类似这么一个场景来说明:A君去B君店里买东西,恰好缺货,A君留下号码给B ...

最新文章

  1. php红盾,红盾查询网_ubaike.cn - 小七发外链
  2. Windows Embedded CE 6.0开发初体验(二)CE开发环境 收藏
  3. 微信浏览器的html5页面显示配置等问题汇集 1,禁止微信浏览器分享页面链接 (定点更新)...
  4. RGBD论文阅读笔记
  5. P7726-天体探测仪(Astral Detector)【构造】
  6. java bitmap取出数据库_bitmap一般如何取出其所表示的数据(以java为例)
  7. tp5 前台页面获取url链接里的参数,如下
  8. 请你努力成为一名优秀的软件工程师,拒绝做优秀的码农!
  9. [转]编程之美数组分割问题
  10. 防火墙虚拟系统互访配置实例
  11. repeater 的编辑功能
  12. 【优化求解】基于matlab遗传算法求解红绿灯管理优化问题【含Matlab源码 262期】
  13. 微型计算机的构成部件6,谈谈微机的主要部件与指标
  14. Amazon Dynamo论文中文版
  15. android表情功能开发
  16. 三维空间——点线面关系
  17. 赛灵思 PL 和 PS IBIS 模型解码器
  18. oracle开机启动监听,配置Oracle数据库和监听随Linux系统自启动
  19. getch()、getche()、kbhit()的使用
  20. 防止糖尿病的天然胰岛素——普洱熟茶

热门文章

  1. 关于中断处理程序中的关中断函数disable_irq和disable_irq_nosync
  2. 业余学python数据挖掘怎么赚钱_0基础转行学Python,学到什么地步能拿到月薪15k+?...
  3. SQL优化—— 优化insert语句
  4. 应用程序启动器选项卡以及页面内容的设置
  5. SpringMVC源码——未完待续
  6. Chrome 技术篇-json查看,json格式化,JSONView插件
  7. C# WinForm获取程序所在路径方法
  8. opencv中使用K-近邻分类算法KNN
  9. 自定义模板类(循环队列)
  10. 语音写出(wavwrite)