玩转VC++实现CallBack

题目有点大,其实本文只是要DEMO一下用函数指针在VC++实现回调。

一、函数指针

那么什么是函数指针呢?说白了就是指向函数的指针,它是一个变量。

通常,函数会被编译为一段二进制机器码。每个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。

可以把函数的这个首地址(入口地址)赋予一个指针变量,使该指针变量指向该函数。

那么就可以通过该指针变量就可以找到并且调用这个函数了。

int (*p)();//声明一个指向返回值是整型的函数指针
void (*pf)();//声明一个指向返回值是void的函数指针

二、函数指针实现回调

简单的用法如下:

int add(int a,int b) {
return a+b;
}

int main() {
int i;
int (*pf)();
pf = add;
i = (*pf)(2,3);
printf("the result is %d\n",i);
return 0;
}

三、VC++中的DEMO

在用MFC开发界面程序时会遇到逻辑层会发送动态信息给UI层更新界面的情况。下面我们用回调函数来完成这个需求。

下面的例子用Color类和Dlg类做演示,当颜色变化时更新界面信息。

Color类:

#pragma once
#include <string>

using namespace::std;

typedef void (* COLOR_CALL_BACK)(string color);//函数指针

class Color
{
public:
    Color();
    ~Color();
    void RegisterColorCallback(COLOR_CALL_BACK callback)//注册特洛伊木马的地方
    {
        ColorListener = callback;//将要回调的函数首地址赋值给你的指针变量
    }

public:
    void SetColor(string color)
    ColorListener(color);//当颜色有变化时调用回调通知界面
private:
    COLOR_CALL_BACK ColorListener;//我们的指针变量
};

Dlg类:

static void ListenColor(string color);
Color mColor;

mColor.RegisterColorCallback(ListenColor);

四、静态函数调用类成员方法

由于回调函数必须是类静态方法,所以当我使用的时候需要调用类成员方法。发现这样做不可以。

思来想去,由于我这个界面类是类似于单例,所以用类静态指针来完成这个任务。

static CCallBackDlg *pThis;

CCallBackDlg *CCallBackDlg::pThis;

void CCallBackDlg::ListenColor(string color)
{
    pThis->ChangeColor(color);
}

完整代码在这里

玩转VC++实现CallBack

时间: 2024-10-07 23:19:22

玩转VC++实现CallBack的相关文章

玩转VC++ 实现Wifi on与wifi off

 有心栽花花不开,无心插柳柳成排. 今天要说的这个wifi on\off是在软件层面控制无线网卡的开和关. 问题听起来简单,调查起来复杂,但解决起来却也简单.关键函数便是Native wifi api中的WlanSetInterface.其实这个API功能也是非 常强大的,我只用到其中控制wifi radio state的功能.官网文档在此. 函数原型: DWORD WINAPI WlanSetInterface( _In_ HANDLE hClientHandle, _In_ const

玩转VC++实现程序开机运行及注册表修改

 一.方案 要实现Windows程序开机运行,需要在注册表中相关位置加入键值.所谓的键可以是你程序的名称,值就是你程序的所在目录.所谓的相关位置有两处: 主键HKEY_LOCAL_MACHINE,Software\Microsoft\Windows\CurrentVersion\Run下. 主键HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Run下. 区别就是前者针对机器上所有用户,而后者只针对当前用户. 在编程中对

玩转VC++系统托盘程序(WIN8)

 WINDOWS系统托盘是一个特殊区域,通常在桌面的右下角,也就是任务栏的右边.系统常驻在托盘的程序有时钟,音量控制,输入法,网络状态等.第三方应用如QQ程序也是一个典型的托盘程序,当最小化时企鹅会乖乖的待在屏幕右下角等待主人的呼唤. 系统托盘的方便之处在于,程序在暂时不用时,将它放到托盘里,随用随叫,不必将其关闭.而QQ在接收到消息后,也会在托盘中闪动提示,十分人性化. 那么如何用VC++来开发托盘程序呢?下面会用一个例子来玩转WINDOWS托盘程序. 首先,定义一下需要的功能.(需求确定

原生JS实现Ajax的跨域请求

原生JS如何实现Ajax的跨域请求? 在解决这个问题之前,我们务必先清楚为什么我们要跨域请求,以及在什么情况下会跨域请求. 了解一下:"同源策略",你就知道了: 同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互.这是一个用于隔离潜在恶意文件的关键的安全机制. 它的定义是: 一段脚本向后台请求数据,只能读取属于同一协议名.同一主机名.同一端口号下的数据: 所以,请求不同协议名.不同端口号.不同主机名下面的文件时, 将会违背同源策略,无法请求成功,需要进行跨越处理!!

什么值得买:一家论坛式导购网站的自我修养

什么值得买 的用户把这个网站亲切称为"色魔张大妈"(SMZDM演化而来),虽然这个昵称有些恶搞的成分,但这是一家我印象中这个时代为数不多的"正常"公司.它没有颠覆什么,但重新定义了什么是"值",并且改变了一大批人的消费习惯. 在电商领域,什么值得买从创立初始就在节奏与气质上特立独行,包括其至今都没有涉及"交易"环节.电商行业里,如果一家公司不擅长赶政策热点.赶创业故事热潮,很难在资本市场为自己谈到一个好价钱,没钱烧就没有资源支

VC++玩转Native Wifi API 3---GOTO在释放资源时的作用

GOTO语句有着很臭的名声,我们的老师经常教导我们说,不要轻易使用它. C++跳转语句有三个:goto.break和continue.它们只是工具,我觉得问题不能归咎于工具,问题在于人. 就像指针一样,goto这个无条件跳转语句力量还是很强大的,如果滥用,出现问题很难排查. 但有些时候goto确实是不二选择,例如我遇到的,在函数中有多个出口,而每个出口都遇到释放资源的时候,与其都把释放语句不厌其烦的写一遍, 不如一个goto语句来的干脆利落. 下面的例子取自上一篇Native Wifi API文

VC++玩转Native Wifi API

 Windows应用想要实现连接wifi,监听wifi信号,断开连接等功能,用NativeWifi API是个不错的选择. 打开MSDN,搜索NativeWifi Api,找到Native Wifi页.在这里. 信息量很大,如果像我着急实现上述功能,看海量的文档有些来不及.如果直接给我例子,在运行中调试,阅读代码,效率会更高. 但是,我并没有成功.首先,Sample在SDK 中,参见这里.我下载几次都失败了,最后放弃这条路.后来同事给了我一份Sample,我不敢确定是否就是这个,但是代码写的

VC++玩转炫酷悬浮窗1---悬浮窗的实现

?? 目标实现像迅雷那样炫酷的悬浮窗.计划&方案首先第一步要实现一个悬浮窗,窗体无边框,能够随意拖动.对于一个窗体来说,只有我们把鼠标放到标题栏中才进入到拖拽模式.由于是无边框的窗体,默认是不能够移动的.我们尝试用两种办法使其跟随鼠标移动.一个是用OnNcHitTest函数,另一个是在OnLButtonDown时发消息.实践一. OnNcHitTest方案这个CWnd类的一个方法,我们可以捕捉鼠标点击的坐标,然后将其HTCLIENT结果偷换成HTCAPTION,这样就可以让系统误以为鼠标左键点击

带你玩转Visual Studio——带你了解VC++各种类型的工程

上一篇文章带你玩转Visual Studio--带你新建一个工程一文中提到新建一个工程时会有很多的工程类型(图1),现在将简单介绍各种类型工程的含义和主要用途.由于这里包含的工程类型太多,有很多本人也没有接触过,有些可能理解的不太对的地方还请谅解. 图 1:New Project 理解几个概念 在开讲之前先大概理解几个概念,这是理解后面各种工程含义的基础. COM COM(Component Object Model)组件对象模型是microsoft制定的一个组件软件标准,跟unix上的CORB