WEB开发网
开发学院软件开发VC 事件编程(一) 阅读

事件编程(一)

 2007-03-15 21:53:34 来源:WEB开发网   
核心提示: // raise Foo eventfor (/* each registered object */) {obj->FooHandler(/* args */);}控制立即传到事件处理器,并且不会返回,事件编程(一)(3),除非处理完成,某些系统提供某种以异步触发事件的方式,你得用
// raise Foo event
for (/* each registered object */) {
obj->FooHandler(/* args */);
}

控制立即传到事件处理器,并且不会返回,除非处理完成。某些系统提供某种以异步触发事件的方式,例如,在 Windows 中,你可以用 PostMessage 代替 SendMessage。控制会从 PostMessage 立即返回,该消息是后来才处理的。但是 .NET 框架中的事件以及我在这里讨论的事件是在触发时被立即处理的。当然,你总是可以触发来自运行在单独的线程中的消息代码事件,或者使用异步委托调用在线程池中执行每个事件处理器,在这种情况下,相对于主线程来说,事件是异步发生的。
  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:

上一页  1 2 3 4 5  下一页

Tags:事件 编程

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