Delphi體系內部的4種消息傳遞辦法(Send,Post,Perform,Dispatch)


一、什么是消息?

消息是windows對應用程序發送的有關‘發生了某種事件’的通知。例如點擊鼠標,調整窗口大小或鍵盤上按下一個鍵,都會引起windows發送一條消息到應用程序中去,去通知應用程序發生了什么。

 

Windows以record的形式發送消息給應用程序。記錄中包括事件的類型以及附加的特定信息。Windows發送給應用程序的記錄類型是TMsg,定義在windows.pas單元中,定義如下

 

[delphi]  view plain  copy
 
  1. { Message structure }  
  2.  PMsg = ^TMsg;  
  3.  tagMSG = packed record  
  4.    hwnd: HWND;  
  5.    message: UINT;  
  6.    wParam: WPARAM;  
  7.    lParam: LPARAM;  
  8.    time: DWORD;  
  9.    pt: TPoint;  
  10.  end;  
  11.  {$EXTERNALSYM tagMSG}  
  12.  TMsg = tagMSG;  
  13.   MSG= tagMSG;  
  14.   {$EXTERNALSYM MSG}  

 

 

消息字段記錄說明:

Hwnd:32位windows句柄,指向消息要發往的窗口,這個窗口可以是幾乎所有的屏幕對象,因為window對大多數可是對象都維護了一個窗口句柄。

Message:代表某種消息的常量值,這些常量可以是在windows.pas中預定義的標准windows消息,也可以是用戶自定義的消息。

Wparam:這個字段常常包含和消息關聯的常量值,也可以包含一個窗口句柄或者消息關聯的某個窗口或控件的ID值。

Lparam:這個字段經常容納一個對內存數據的索引或指針,由於wparam和lparam都是32位大小,我們可以進行強制類型轉換。

WM開頭的通常是指WindowsMessage.

 

二、常用windows消息:

wm_active:窗口被激活

wm_char按下某個鍵發送wm_keydown和wm_keyup消息

wm_close窗口將要關閉

wm_keydown用戶正在按下鍵盤上的一個鍵

wm_keyup:用戶已經釋放按下的鍵

wm_lbuttondown用戶按下鼠標左鍵

wm_mousemove用戶正在移動鼠標

wm_paint必須重繪窗口區域

wm_timer發生了一個計時器事件

wm_quit:發送終止程序請求

 

三、windows消息系統的工作方式

三個部分:消息隊列、消息循環、窗口過程。

消息隊列:Windows為每個應用程序維護一個消息隊列,windows應用程序必須從這個隊列中取得消息,並且把得到的消息分派到合適的窗口。

消息循環:windows程序從應用程序隊列中取得一條消息,分派到適合的窗口中,然后再取得下一條消息,再分發到適合的窗口中,如此循環。這種消息機制就是消息循環。

窗口過程:應用程序中的每個窗口都有一個窗口過程,它接受消息循環中傳入的每條消息,。窗口過程的任務是接受各個窗口消息並且對此做相應的回應。窗口過程是所謂的回調函數,在處理完畢一條消息之后,窗口過程通常要給windows一個返回值。

 

四、發送自己的消息:

我們需要在應用程序窗口和控件之間發送消息。Delphi提供了以下幾種方法:

Perform()方法:VCL為所有的TContol派生類提供了perform()方法,可以發送消息給任何已知對象實例的對象或控件對象。Perform有三個參數:消息,對應的lparam和wparam。如下:

 

[delphi]  view plain  copy
 
  1. function Tcontrol.perform(Msg :cardinal;wparam,lparam:longint):longint;  

 

要發送一條消息給一個窗體或控件,使用下面的格式:

 

[delphi]  view plain  copy
 
  1. Retval:=controlname.perform(messageid,lparam,wparam);  

 

Perform是同步調用的,因此直到消息被處理完畢,才能得到返回值。Perform()方法把它的參數組合成一個TMessage記錄,然后調用該對象的Dispatch方法去發送這條消息,繞開了windowsAPI消息系統。

Sendmessage()和postmessage()API函數:

Sendmessage和perform()類似,是同步調用的。消息直接發往目的窗口,該消息被處理完畢才返回;postmessage是異步調用的,發送消息給windows隊列,然后立即返回。

 

通知消息:窗口的子控件發生事件,如果需要通知父窗口,就發送此消息。只發生在windows標准控件中如button、 listbox 、combox和通用控件如tree view、 list view等。

http://blog.csdn.net/sushengmiyan/article/details/7454919


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM