VS2013MFC中回调函数的使用&出现的问题

来源:互联网 发布:淘宝客手机可以开通吗 编辑:程序博客网 时间:2024/05/22 03:04

要在MFC类的成员函数中写一个回调函数,首先要了解什么是回调函数。

回调函数就是函数指针的调用,在一个函数写成指针的形式,在另一个函数中可以把那个写成指针形式的函数当成参数来使用。通常情况是在动态库函数里定义好回调函数的形式,然后在封装的函数里注册回调函数。

这个时候在自己的工程中按照库函数头文件中定义回调函数的格式来定义函数。然后调用动态库中的注册的回调函数的参数里就可以直接使用自己定义的回调函数。

这里概念参考回调函数的那些事儿,写的比较易懂。

接下来说我使用过程中出现的几个问题:

1.回调函数定义时一定要和库函数中的定义完成一致。

我使用的库中回调函数定义为

typedef  BOOLEAN(__stdcall *XXX_CALLBACK)(unsigned char*cXXX, unsigned long uXXX);

我在我的工程时定义没有加__stdcall,这个错误找了好久才找到。

2.回调函数在MFC类中只能是静态函数或者全局函数

这样会有个问题,那就是没有直接使用当前类中的控件。我是使用的回调函数中使用MFC类的成员或对话框控件的简单方法中的方式。但是没有办法直接调用StatusBar类来显示。现在还有个问题,没法获取tab子窗口的句柄,来操作子窗口中的控件。网上有说采用发送消息的方式,可是回调函数在库文件中已经定义好了,不能再修改。没法通过参数发送消息的方法。现在使用的方法是设置全局变量来传递参数,不推荐这种方式。

3.在子窗口中使用回调函数

我是在主窗口类中定义的静态回调函数,要在几个tab子窗口中同时使用。在使用的时候就不能直接把主窗口中定义的回掉函数名传递给注册回调函数了。这时必须得先在子窗口中获取主窗口的句柄才能使用主窗口类中的成员。
在这里我使用的
CXXXDlg *pdlg = (CXXXDlg*)GetParent()->GetParent();

参考文章:
玩转VC++实现CallBack
C/C++之回调函数

原创粉丝点击