用戶: 密碼:     忘記密碼 | 會員註冊
  

在C++Builder中定義事件

出處:2345軟件大全 時間:2011-06-27 人氣:10949

核心提示:在C++ BUILDER中,事件是一種委託模型,它是對消息的封裝。如果你用過VC,你就知道在VC中並不存在什麼事件

  在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事件,和其它事件一樣,用戶只要將代碼寫到這裡來就可以響應消息並根據應用的需求來給出這個事件觸發時的行為,上面代碼是隨手寫的,請各位自已加以調整。