c++(mfc)中如何实现类似于.Net中的事件机制

来源:百度知道 编辑:UC知道 时间:2024/06/17 06:17:45
我想用mfc设计一个类,类中有一个事件触发器,姑且叫做MyEvent。MyEvent会按照某种机制触发,并且MyEvent要带一个参数param,是一个自定义的结构类型MyStruct,这个类编译为Dll。另有一个测试类,调用Dll,MyEvent的处理函数类似为void MyEvent_Happen(MyStruct param).
我现在想到的是消息sendMessage和函数指针,如果用SendMessge参数怎么传递?如果用指针传递参数个数和内存如何管理?还有更好的方法吗?
请我心目中无限敬仰的高手指点一二,如果有源码就更感激不尽了,限上我仅有的积分。
致lieyan2024:我说的就是event delegate,但是不能调用.net 的东西

致lieyan2024:我不太懂回调函数,是不是这样:在触发事件的类中定义一个数据成员,指向某种函数类型的指针。然后在处理事件的类中将这个指针赋值为一个函数地址。那么在触发事件的类中调用这个函数指针就相当于调用了处理事件的类中的处理函数。

elfswallow和lieyan2024回答的都非常好,容我明天写段程序试试。elfswallow给的示例代码是hook(钩子)编程吧(挺复杂啊),没有用到你刚刚提到的SendMessage,不过用什么无所谓,主要是找到最好的解决方法。

感谢三位朋友的回答,我做了一下测试:
lieyan2024兄的方法可以,但有局限,给函数指针赋值的函数要求是全局的。虽有一些解决办法,但有些牵强,可参考文章http://hi.baidu.com/mzyse/blog/item/8fcff1220f8fbba14723e8c1.html
elfswallow兄的Hook编程在VC2005中可以,在VC6中好像不行(也许我没有掌握方法)。
14566666兄的回答也讲的相当透彻,在此表示感谢。
最终我选择了发送消

static LRESULT SendMessage(
HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam
)
上面是SendMessage的原型,这是你放送消息需要用到的函数,一方面传递你定义的事件的编号,就是那个message参数,然后把你要传递的参数放在wparam或者lparam,这两个参数都是放指针的,这样你就能传递任何参数给你的处理函数了。所以参数传递以后,需要你对这个指针做强制类型转换以得到你定义的MyStruct形式。
而你定义的MyEvent_Happen要符合Message Handler的形式,尤其是参数和返回类型,因为操作系统得到消息以后是按照那个格式准备好函数调用堆栈来调用你的处理函数的,这很像中断处理函数的形式。
最后你需要在MyEvent_Happen所在的那个类中做一个Message Map,把你的MyEvent_Happen函数与你定义的事件号(也就是SendMessage中的message参数)关联起来。
不知道为什么没反映。。。
我再给个纯C++的示例吧:
#include <stdio.h>

class CSource {
public:
__event void MyEvent(int nValue);//申明一个事件
};

class CReceiver {
public:
void MyHandler1(int nValue) {
printf_s("MyHandler1 was called with value %d.\n", nValue);
}

void MyHandler2(int nValue) {
printf_s("MyHandler2 was called with value %d.\n", nValue);
}

void hookEvent(