在C++ BUILDER中,事件是一種委托模型,它是對(duì)消息的封裝。如果你用過VC,你就知道在VC中并不存在什么事件,而只有消息處理函數(shù),而在C++ BUILDER中則是由事件處理函數(shù)來負(fù)責(zé)響應(yīng)消息。同是,事件本身也是一指針,它是一個(gè)閉包,通常在C++ BUILDER中有兩種事件:通知類型事件(即TNOTIFYEVENT,對(duì)WINDOWS消息的封裝)和自定義事件。除此之外,我們也知道事件是通過一個(gè)虛擬函數(shù)來點(diǎn)燃的,考試,大提示ONEXIT事件是由DOEXIT虛擬函數(shù)點(diǎn)燃的,下面我寫一個(gè)自定義事件,很明顯以下我寫的代碼中的事件將是對(duì)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,........);//由這個(gè)虛擬函數(shù)來觸發(fā)事件
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,.....);
}
......
}
按照上而的代碼,我們就會(huì)在OBJECT INSPECTOR中看到一個(gè)ONMYEVENT事件,和其它事件一樣,用戶只要將代碼寫到這里來就可以響應(yīng)消息并根據(jù)應(yīng)用的需求來給出這個(gè)事件觸發(fā)時(shí)的行為,上面代碼是隨手寫的,請(qǐng)各位自已加以調(diào)整。
.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,........);//由這個(gè)虛擬函數(shù)來觸發(fā)事件
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,.....);
}
......
}
按照上而的代碼,我們就會(huì)在OBJECT INSPECTOR中看到一個(gè)ONMYEVENT事件,和其它事件一樣,用戶只要將代碼寫到這里來就可以響應(yīng)消息并根據(jù)應(yīng)用的需求來給出這個(gè)事件觸發(fā)時(shí)的行為,上面代碼是隨手寫的,請(qǐng)各位自已加以調(diào)整。