在C++ Builder中定義事件 (轉)

worldblog發表於2007-12-13
在C++ Builder中定義事件 (轉)[@more@]

在C++ BUILDER中,事件是一種委託模型,它是對訊息的封裝。如果你用過VC,你就知道在VC中並不存在什麼事件,而只有訊息處理,而在C++ BUILDER中則是由事件處理函式來負責響應訊息。同是,事件本身也是一指標,它是一個閉包,通常在C++ BUILDER中有兩種事件:通知型別事件(即TNOTIFYEVENT,對訊息的封裝)和自定義事件。除此之外,我們也知道事件是透過一個虛擬函式來點燃的,比如說ONEXIT事件是由DOEXIT虛擬函式點燃的,下面我寫一個自定義事件,很明顯以下我寫的程式碼中的事件將是對WM_MYMESSAGE訊息的封裝.
.h File
#include <....>
.....
#define WM_MYMESSAGE WM_USER+100
typedef void __fastcall (__closure *TMyEvent)(T *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 yEvent(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 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事件,和其它事件一樣,只要將程式碼寫到這裡來就可以響應訊息並根據應用的需求來給出這個事件觸發時的行為,上面程式碼是隨手寫的,請各位自已加以調整.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992472/,如需轉載,請註明出處,否則將追究法律責任。

相關文章