一、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消息的時候被調用到。