我所理解的VCL消息處理流程

一、VCL消息處理流程:
1.Application從windows消息隊列中取得屬於當前線程的所有消息。
2.Application:translatemessage.
3.Application:dispatchmessage分派消息
  3.1 dispatchmessage根據消息中的handle來找到目標元件的回調函數,並調用這個回調函數(wndproc)。
4.每個元件(TWincontrol及其子類)在其回調函數(wndproc)中處理消息。未處理的消息通過TObject的dispatch()方法進行再次分派。
  4.1Tobject.dispatch會在對象的VMT(或者說對象的內存結構)中去尋找處理了指定消息的方法,即我們在代碼裡常見到的:
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
    procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
    ...
  4.2 如果找到了,就調用它。如果沒有找到,把消息傳遞給TObject的這個方法:

procedure DefaultHandler(var Message); virtual

整個過程就是這樣。

二、另外說明一下,事件如何被觸發,以及事件的代碼是如何被調用到的:
我們常在VCL的類的代碼裡見到類似這樣一些變量:
...
  TCloseEvent = procedure(Sender: TObject; var Action: TCloseAction) of object;
...
    FOnClose: TCloseEvent;
    FOnCloseQuery: TCloseQueryEvent;
...
    property OnClose: TCloseEvent read FOnClose write FOnClose;
...
在第3.1,4.1,4.2這三個步驟中,在代碼中會根據接收到的消息的不同會調用,會調用類似下列的代碼:
if Assigned(FOnClose) then
  FOnClose;
 這樣,我們在OnClose事件中的代碼,就會在接收到close消息的時候被調用到。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章