Visual C++中回调函数使用的变身大法

Visual Studio 2022 C++ 调用matplotlib-cpp 绘图 利用matplotlib-cpp在Visual Studio 2022中绘图 阅读详情
对于回调函数的编写始终是写特殊处理功能程序时用到的技巧之一。先介绍一下回调的使用基本方法与原理。

  1、在这里设:回调函数为A()(这是最简单的情况,不带参数,但我们应用的实际情况常常很会复杂),使用回调函数的操作函数为B(), 但B函数是需要参数的,这个参数就是指向函数A的地址变量,这个变量一般就是函数指针。使用方法为:

int A(char *p); // 回调函数
typedef int(*CallBack)(char *p) ; // 声明CallBack 类型的函数指针
CallBack myCallBack ; // 声明函数指针变量
myCallBack = A; // 得到了函数A的地址

  B函数一般会写为 B(CallBack lpCall,char * P,........); // 此处省略了p后的参数形式 。

  所以回调机制可解为,函数B要完成一定功能,但他自己是无法实现全部功能的。 需要借助于函数A来完成,也就是回调函数。B的实现为:

B(CallBack lpCall,char *pProvide)
{
 ........... // B 的自己实现功能语句
 lpCall(PpProvide); // 借助回调完成的功能 ,也就是A函数来处理的。
 ........... // B 的自己实现功能语句
}
// -------------- 使用例子 -------------
char *p = "hello!";
CallBack myCallBack ;
myCallBack = A ;
B(A, p);

  以上就是回调的基本应用,本文所说的变身,其实是利用传入不同的函数地址,实现调用者类与回调函数所在类的不同转换。

  1、问题描述

  CUploadFile 类完成数据上传,与相应的界面进度显示。

  主要函数Send(...) 和回调函数 GetCurState() ;

class CUploadFile : public CDialog
{
 ......
 int Send(LPCTSTR lpServerIP, LPCTSTR lpServerPort, LPCTSTR UploadFilePath) ;
 static int GetCurState(int nCurDone, int nInAll, void * pParam) ;
 ......
}
int CUploadFile ::Send(LPCTSTR lpServerIP, LPCTSTR lpServerPort, LPCTSTR UploadFilePath)
{
 ... // 导出传输数据的函数
 int ret = Upload( (LPSTR)(LPCTSTR)m_strData,
    GetCurState, // 在这个回调函数中处理界面
    this, // CUploadFile 的自身指针 ,也就是pParam 所接受的参数
    (LPSTR)(LPCTSTR)UploadFilePath,
    "",
    "",
 );
}
int CUploadFile ::GetCurState(int nCurData, int nInAll, void * pParam)
{
 .........
 UploadFile *pThis = (UploadFile *)pParam; // nCurData 当前以传出的数据量
 // nInAll 总的数据量
 // 有了pThis可以对界面进行各种操作了。
 .............
}

  但大家仔细观察就可以发现,这个类把数据传送和界面显示聚和到了一起,不容易得到复用。而且在复用过程中需要改动较多的地方 。

  请大家记住现在的回调函数传入的类本身的静态成员函数。

  现在我们把数据的传送和界面的显示分离。回调则要传入的是界面处理类的静态函数。

  界面处理类 CShowGUI,数据上传类 CUploadData

class CUploadData
{
 ......
 typedef int(*SetUploadCaller)(int nCurData, int nInAll, void * pParam);
 int UploadFile(LPCTSTR lpFileNamePath,LPVOID lparam,SetUploadCaller Caller );
 // 接受外界出入的参数,主要是回调函数的地址通过参数Caller,
 int Send(LPCTSTR lpServerIP, LPCTSTR lpServerPort, LPCTSTR UploadFilePath) ;
 ...... // 注意此时不在需要GetCurState 函数了 。
}

class CShowGUI: public CDialog
{
 .......
 typedef int(*SetUploadCaller)(int nCurData, int nInAll, void * pParam);
 void SetCallBack(LPCTSTR strPath);
 static int GetCurState(int nCurData, int nInAll, void * pParam) ;
 CUploadData m_Uploa
 d ; // 数据上传类是界面显示类的一个成员变量。
 .......
}

void CShowGUI :: SetCallBack(LPCTSTR strPath)
{
 CUploadData myUploadData ;
 SetUploadCaller myCaller; // 声明一个函数指针变量
 myCaller = CurState ; // 取得界面处理函数的地址
 myUploadData .UploadFile(strPath,this,myCaller); // 界面处理类的函数传入,实现了数据传入与界面处理的分离 .
}

  通过上面的演示做到了界面与数据的分离,回调函数分别扮演了不同角色,所以随着处理问题的不同应灵活应用,但同样因为处理数据类不知道界面处理类或外部调用类的类型,而更无法灵活地处理界面的不同显示方式。这方面还希望喜欢钻研技术的朋友继续研究。
visual C++ 调用颜色对话框,鼠标的回调函数 调用颜色对话框 阅读详情

相关推荐

C++/CLI入门系列 第三篇:C#通过C++/CLI,实现C++的回调函数

前言:照例啰嗦一下,心急的可略过。做程序员也好些年了,从iOS强转C++,兜兜转转过来,也有四年了。给后来者一个忠告:如果想要延长自身技术寿命,一定要珍惜时间,好好利用,拼命提升自己技术。因为技术差,多少机会从手中滑过,说多了都是泪。 不说了,怎么过都是一生,即便未来失业了,也不代表活不下去。这个时代,不要给自己添加承受不了的重担,选择自己喜欢的,轻装度过这一生。 O了,开始搞起! 已经2020年了,公司要求用VS2019,所以就用这个版本做演示,大差不差~ 第一步:打开VS2019,依次创建三个空

fx_odyssey的博客 3496

Vc 中回调函数简要说明

Vc 中回调函数简要说明如:void CALLBACK OnProcessData);函数申明中加上CALLBACK就表示该函数为回调函数。 凡是由你设计却由windows系统呼叫的函数,统称为callback函数。 但这么说又对回调的理解局限了些。 回调函数和普通函数没什么区别,只是使用上的区别。回调是一种解决问题的

图像识别讨论学习 1122

初识C++与Visual Studio(1)——安装Visual Studio2017及删除右键菜单“使用Visual Studio打开”

从本文开始,将用一个系列对Visual Studio2017与C++进行详细讲解(主要是Visual Studio2017,包括基本操作及各种功能介绍),希望能帮助到各位。 目录一、Visual Studio2017的安装方法二、删除Visual Studio右键菜单“使用Visual Studio打开” 一、Visual Studio2017的安装方法 Visual Studio2017的安装方法为直接去官网下载安装即可。官网地址: https://docs.microsoft.com/zh-cn/vis

Wendy的博客 6545

16.VC(custom)-回调函数(callback function)

1. 回调函数(callback function)? 回调,就是两个程序A和C,程序A中含有函数b,程序C中含有函数d,当A要调用C的某个功能时,C需要反过来调用A中的函数b,而且是A不得不为C提供函数b,而C不知道A提供的b叫什么,有什么参数,所以C会规定b有什么参数,然后由A通过C中的函数d传入函数b的名字(也就函数d的一个参数和b的函数原型一致),这时b就是回调函数,而d就是注册函数. 举个例子 HHOOK SetWindowsHookEx( int idHo

hgy413的专栏 1338

使用 Visual Studio Code 配置 C++ 开发环境的详细指南

通过本文,你已经学会了如何在 Visual Studio Code 中配置 C++ 开发环境。无论是在 Windows、macOS 还是 Linux 上,使用 VSCode 配置 C++ 开发环境都相对简单,并且可以利用丰富的插件实现高效的编写、编译和调试功能。这种轻量、灵活的 C++ 开发环境不仅适合学习者,也非常适合日常开发者使用。希望本文能帮助你顺利搭建并高效使用 VSCode 进行 C++ 开发。

好看资源网的博客 3180

vc DLL中使用回调函数

dll typedef void(__stdcall *Callback_GetYUV420P)( unsigned char * ); typedef void(__stdcall *Callback_GetH264Stream)( unsigned char * ,int ); Callback_GetYUV420P pfun; Callback_GetH264Stream pfun2;...

技术联盟 1203

vc的dll中实现回调函数

在很多编程过程中,我们遇到回调函数的情况很多,无论是一个应用程序内部,还是应用程序与动态库之间,都会经常涉及到回调函数的编程.那么什么是回调函数呢,它的实现机制是什么呢?下面我就简单在这里介绍一下        使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你

dxy408460910的专栏 4740

使用 Visual Studio C++ 调用 matplotlib-cpp 绘图

最后,使用 show 函数将图表显示出来。在本文中,我们将介绍如何使用 Visual Studio C++ 调用 matplotlib-cpp 库来进行绘图。matplotlib-cpp 是一个基于 Python 的库,可以方便地在 C++ 程序中进行数据可视化。除了折线图,matplotlib-cpp 还支持其他类型的图表,如散点图、柱状图等。接下来,我们创建一个简单的 C++ 程序来调用 matplotlib-cpp 绘制图表。然后,我们就可以使用 matplotlib-cpp 的函数来进行绘图了。

HackQuestR的博客 1106

【C++】11 Visual Studio 2019 C++安装matplotlib-cpp绘图

使用C++调用matplotlib-cpp绘图

记录专业模型开发、算法程序设计、软件学习笔记、生活日志。 9394

VC++ 回调函数使用实例

回调函数的理论我说不上多少,但以前给同事写的类中用到过,这次面试中又被问到相关的理论,故将其摘录出来,做一个实例,以后参考。

angular中访问本地json文件

先在assets文件夹下写一个json文件,这样在打完包之后也可以手动修改json文件内容 1、在需要访问本地json文件的ts文件里面引入 import{HttpClient}from'@angular/common/http'; 2、用ajax请求调用,我这里是用已经封装好的ajax请求调用 gethttp = ()=>{ var self = this self.ajax.getAjax("../../assets/server.json","g...

蜗牛~~ 1830

【C++版】visual studio 2019安装教

也勾上,一般这个模块已经很少用了,因为比较老,用Qt软件写可视化项目的比较多。注:想用visual studio写可视化项目的,把右侧的一个。登录visual studio 官网。打开visual studio,选择。如果想要好一点的编程感觉可以点击工具。如果有疑问可以私信我哦!选择字体和颜色,分别对。选择模块,C++选择。

千禧皓月的博客 6万+

新手必看!Stata工具变量分析中的三大陷阱:如何正确解读LM统计量、CDW检验和Hansen J值

本文深度解析Stata工具变量分析中的三大核心检验:不可识别检验、弱IV检验和过度识别检验,帮助新手避开常见陷阱。详细解读LM统计量、CDW检验和Hansen J值的正确使用方法,提供实战案例和Stata操作指南,确保研究结论的可靠性。

weixin_29231027的博客 573

【CMake】使用CMake在Visual Studio 构建多cpp文件项目

【代码】【CMake】在Visual Studio 构建多cpp文件项目。

Antonio915的博客 886

Jasper Report使用JSON数据源创建报表

最近在做一个项目小功能,表单结案要生成PDF报表。 起初,想用HTML模板(art-template模板引擎)编写,利用浏览器的打印功能保存成pdf文件下载。但是HTML编写好的模板,页码、页眉、页脚设置有坑,表单内容中的表格较多,表格不能设置跨页,导致跨页的表格内容与页眉重叠,没能解决这个问题。 于是,转战研究Jasper report生成报表,用更加专业的报表生成工具来做。刚开始,也是跌跌撞撞,遇到了很多问题,因为觉得没有退路了,必须要用这个搞出来,所以就硬着头皮去找各种资料。 主要使用的json

xiaogege2012的专栏 3320

transformer中QKV的通俗理解(剩女与备胎的故事)

用vit的时候读了一下transformer的思想,前几天面试结束之后发现对QKV又有点忘记了, 写一篇文章来记录一下 参考链接: 哔哩哔哩:在线激情讲解transformer&Attention注意力机制(上)在线激情讲解transformer&Attention注意力机制(上)_哔哩哔哩_bilibiliAttention is all you need介绍 更具体的介绍可以去阅读论文在Attention is all you need这篇文章中提出了著名的Transformer模型Transforme

Peter的博客 1万+

Visual C++ 2010 Express使用教程

1、打开Visual C++ 2010 Express。界面如下: 2、新建一个工程。点击“New Project…”,如图: 3、在弹出的窗口下选择Visual C++下的CLR下的CLR Empty Project Visual C++,即 Visual C++→CLR→CLR Empty Project Visual C++;然后在下方填入工程名字(name),工程位置(l...

QQ_1595386336的博客 6万+

华为OD机试真题 新系统【小花获胜的奶茶】

华为OD机试真题 新系统【小花获胜的奶茶】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【小花获胜的奶茶】多语言题解。

qq_45776114的博客 386

在Visual Studio中编译.c文件和.cpp文件主要有哪些不同

在链接阶段,它会将编译生成的目标文件(.obj)和所需的库文件(如C标准库)进行链接,生成可执行文件。比如在预处理阶段,除了处理C语言的预处理指令外,还会处理C++特有的指令,如#pragma once(一种防止头文件重复包含的机制)。在编译阶段,C++编译器会处理类的定义和对象的创建,包括构造函数和析构函数的调用、成员函数的绑定等。在链接阶段,C++编译器会处理C++特有的名称修饰(name mangling),因为C++允许函数重载,所以编译器会对函数名进行修饰,以区分同名但参数不同的函数。

erfan_lang的博客 4081

GEE:变异系数法在遥感影像分析中的应用及权重计算

本文介绍了在Google Earth Engine(GEE)平台上基于变异系数法的多指标加权遥感影像分析方法。该方法通过计算每个指标的平均值和标准差,进而计算变异系数来评估指标的变化程度。利用变异系数,我们可以计算每个指标的权重,并将其应用于加权和指数的计算,从而提高遥感影像分析的准确性和可靠性。方法应用于计算Risk-Screening Environmental Indicators (RSEI),并以此为例。

养乐多的博客 2281

国产化操作系统shell常用脚本

国产操作系统常用脚本:统信、麒麟。

Reyn_观极 598

用llama.cpp实战入门C++:Windows下从编译到CUDA加速

C++是一门强调内存控制与系统交互的编程语言,其核心在于理解编译构建、运行时依赖、指针与RAII等底层机制。llama.cpp作为纯C++实现的轻量级大模型推理框架,以约3万行聚焦代码提供了极佳的学习沙盒——它不抽象、不封装,让std::vector、struct、CMakeLists.txt、Visual C++ Redistributable等概念在真实报错与调试中自然浮现。通过在Windows 11下配置VS2022、编译CLI工具、启用CUDA加速及加载qwen3-embedding模型,学习者可同

weixin_30235225的博客 511

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: How to save a web page as HTML or MHT
下一篇: AJAX开发简略
桂林哈秋
博客等级 码龄24年 70粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值