在C++ BUILDER中,事件是一种委托模型,它是对消息的封装。如果你用过VC,你就知道在VC中并不存在什么事件,而只有消息处理函数,而在C++ BUILDER中则是由事件处理函数来负责响应消息。同是,事件本身也是一指针,它是一个闭包,通常在C++ BUILDER中有两种事件:通知类型事件(即TNOTIFYEVENT,对WINDOWS消息的封装)和自定义事件。除此之外,我们也知道事件是通过一个虚拟函数来点燃的,比如说ONEXIT事件是由DOEXIT虚拟函数点燃的,下面我写一个自定义事件,很明显以下我写的代码中的事件将是对WM_MYMESSAGE消息的封装. .h File #include <....> ..... #define WM_MYMESSAGE WM_USER+100 typedef void __fastcall (__closure *TMyEvent)(TObject *Sender,Param1,Param2,......);
class TMyControl:public TWinControl { private: TMyEvent FOnMyEvent;//保存指向事件的指针. void __fastcall DoSomething(TMessage &Message); public: BEGIN_MESSAGE_MAP VCL_MESSAGE_HANDLER(WM_MYMESSAGE,TMessage,DoSomething); END_MESSAGE_MAP(TControl); protected: virtual void __fastcall DoMyEvent(Param1,........);//由这个虚拟函数来触发事件 virtual void __fastcall WndProc(TMessage &Message); __published: ......... __property TMyEvent OnMyEvent={read=FOnMyEvent,write=FOnMyEvent}; ..... };
.cpp File
//Omiting constructor and deconstructor //Virtual function,which will spring the event:TMyEvent void __fastcall TMyControl::DoMyEvent(Param1,.....) { if(FOnMyEvent) { FOnMyEvent(this,Param1,Param2,.....Paramn); } } //Message Handler void __fastcall TMyControl::DoSomething { //TODO:Add your code here.... } void __fastcall TMyControl::WndProc(TMessage &Message) { if(Message.Msg==WM_MYMESSAGE) { DoMyEvent(Message.WParam,.....); } ...... } 按照上而的代码,我们就会在OBJECT INSPECTOR中看到一个ONMYEVENT事件,和其它事件一样,用户只要将代码写到这里来就可以响应消息并根据应用的需求来给出这个事件触发时的行为,上面代码是随手写的,请各位自已加以调整. 
|