WEB开发网
开发学院软件开发VC VC++.NET中事件编程剖析之什么是事件 阅读

VC++.NET中事件编程剖析之什么是事件

 2007-04-09 21:34:16 来源:WEB开发网   
核心提示: Windows 处理事件的方式完全是通过窗口过程以及一成不变的 WPARAM/LPARAM 参数,按照现代编程标准来说,VC++.NET中事件编程剖析之什么是事件(4),简陋而粗糙,即便是在今天,更不用说处理多个事件时的繁琐,相对于静态外部函数来说,每个 Windows 程序仍然在使用这种

Windows 处理事件的方式完全是通过窗口过程以及一成不变的 WPARAM/LPARAM 参数,按照现代编程标准来说,简陋而粗糙。即便是在今天,每个 Windows 程序仍然在使用这种机制。有些程序员为了传递事件,甚至创建 不可见窗口。窗口过程并不是真正意义上的事件机制,因为在 Winodows 中每个窗口只允许有一个窗口过程,虽然也可以链接多个过程,比如每个过程都调用其前面的过程,也就是众所周知的子类化过程。在真正的事件系统中,相同的事件可以不分等级地注册多个接收者。

在 .NET 框架中,事件是很成熟的机制。任何对象都可以定义事件,并且多个对象可以侦听这些事件。.NET 中的事件使用委托来实现,委托是 .NET 中的术语,它实际上就是以前说所的回调。最重要的是,委托是类型安全的。不再使用 void* 或者 WPARAM/LPARAM。

为了用托管扩展定义一个事件,你得用 __event 关键字。例如,Windows::Forms 中的 Button 类有一个 Click 事件:

// in Button class
public:
__event EventHandler* Click;

这里 EventHandler 是某个函数的委托,该函数带有参数:Object (也就是 sender) 和 EventArgs:

public __delegate void EventHandler(
Object* sender,
EventArgs* e
);

为了接收事件,你必须用正确的签名实现处理器成员函数并创建一个委托来包装该函数,然后调用事件的 += 操作符注册你的处理器/委托。对于上面的 Click 事件,代码应该像这样:

// event handler
void CMyForm::OnAbort(Object* sender, EventArgs *e)
{
...
}
// register my handler
m_abortButton->Click += new EventHandler(this, OnAbort);

注意该处理器函数必须具备由委托定义的签名。这是托管扩展的基本原则。但是你的问题涉及的不是托管事件,你问的是本机事件——如何实现本机 C++ 事件?C++ 本身没有内建的事件机制,那么该怎么实现呢?你可以用 typedef 来定义一个回调并让客户机来提供这个回调,这种做法有些类似 qsort——但那样太老土了。更不用说处理多个事件时的繁琐。相对于静态外部函数来说,用成员函数作为事件处理器是最丑陋的做法。

上一页  1 2 3 4 5 6  下一页

Tags:VC NET 事件

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接