在C++Builder中定義事件

字號(hào):

在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)整。