Delphi中的消息處理

一、windows的消息驅動體系 
  在windows系統中,消息傳遞是實現對象間通訊和控制的主要手段。能夠系統都以消息驅動的方式工做。系統中發生的用戶輸入操做、顯示信息的改變、系統環境參數變化等全部事件都以系統定義消息的形式出如今相關的應用程序和窗口。因此程序設計的主要任務就是爲這些消息的處理設計代碼。 html

  在應用程序中,發送者能夠經過發送消息,要求接收者完成相應的處理。當程序運行時,windows系統爲每一個應用程序實例創建一個消息隊列,依次保存發送給該程序實例的消息,在應用程序的主控部分,須要設置一個消息循環,利用一組系統函數從該程序實例的消息隊列中依次讀取和分析消息,並將他們發送給指定的消息。這種消息傳遞可使用系統定義消息,也可使用用戶自定義的消息。現有的多種可視化開發環境,都已經將這一過程封裝到了各類類,部件,以及部件的方法中。windows

  當咱們利用它們寫一個應用程序時,必須考慮每一個對象要作什麼,將他們分解爲不一樣的消息處理函數,而且對應不一樣的消息。雖然有的控件(部件)種類繁多,編寫程序很是便利。但這些畢竟是一些通用的對象和消息處理函數,若是咱們要編寫本身的部件或者想要更加靈活的運用現有控件,就必須深入瞭解消息驅動體系以及消息的映射消息處理函數編寫系統有關消息操做的函數。 
二、DELPHI開發環境: 
  DELPHI已成爲日益普及的優秀的32位WINDOWS開發環境,其中一個最大的特色就是在DELPHI 中可自定義消息寫本身的構件(Cmponent)的,由於編寫構件通常要對相應的消息進行處理.。 
三、DELPHI中的消息: 
  在Delphi 中全部的類都有一個內建的用於處理消息、調用消息處理過程的機制。VCL定義了發送全部WINDOWS消息(包括自定義消息)的消息派送系統,你只須要創建消息處理方法。一個Windows 消息是一個包含多個字段的數據記錄。其中最重要的是消息標識,在WINDOWS中已經定義了許多消息,其餘有用的字段是兩個參數和一個結果字段。一個16位和一個32位參數wparan錄數據類型:ide

type 
TMessage = packed record 
Msg: Cardinal; 
case Integer of 
0: ( 
WParam: Longint; 
LParam: Longint; 
Result: Longint); 
1: ( 
WParamLo: Word; 
WParamHi: Word; 
LParamLo: Word; 
LParamHi: Word; 
esultLo: Word; 
ResultHi: Word); 
end;

四、消息的使用: 函數

  在DELPHI 中用戶能夠自定義消息及消息處理句柄消息處理句柄的定義有以下幾個原則:spa


  一、消息處理句柄方法必須是一個過程 
  二、方法聲明後要有一個message命令型常數. 
  三、消息處理句柄方法不須要用override 命令來顯式指明重載祖先的一個消息處理句柄 
  四、在消息處理句柄中通常先是用戶本身對消息的處理,用祖先類中對應此消息的處理句柄(有些狀況下可能正相反).因爲可能對祖先類中對此消息的處理句柄的名字和參數類型不清楚避免,此麻煩調用Defaulthandler方法.(固然若是要屏蔽掉此消息了)。翻譯

消息處理句柄方法聲明爲:設計

procedure Mymsgmethod(var message:Tmessage); message Msgtype;

一樣用戶也能夠定義本身的消息自定義消息及消息處理句柄舉例以下:指針

const my_paint=Wm_user 1; 
type 
Tmypaint=record 
msgid:cardinal; 
msize:word; 
mcolor:longint; 
msgresult:longint; 
end; //也可使用Tmessage類型 
type 
Tmycontrol=class(TCustomControl) 
protected 
procedure change(var message:Tmypaint); message my_paint; 
..... 
end; 
...... 
procedure Tmycontrol.change(var message:Tmypaint); 
begin 
size:=message.msize; { 設 置Tmybutton 尺 寸 屬 性} 
color:=message.mcolor; { 設 置Tmybutton 顏 色 屬 性} 
{do something else} 
inherited; { 交 由Tcustomcontrol 處 理} 
end;

  重載消息句柄方法:你能夠直接重載windows定義的窗口消息添加本身的處理。例如在應用中重載windows的窗口消息wm_paint:code

type 
TMyComponent = class(...) 
... 
procedure WMPaint(var Message: TWMPaint); message WM_PAINT; 
end;

  而後再實現部分添加消息句柄的過程。 orm

五、delphi中有關消息的重要函數和屬性:


(1) procedure DefaultHandler(var Message); virtual; 
若是一個對象處理某個消息,則該函數提供對消息的默認處理。 
(2) procedure Dispatch(var Message); virtual; 
這個函數用於調用對象的消息處理函數。 
(3)Windowproc屬性: 
type TWndMethod = procedure(var Message: TMessage) of object; 
property WindowProc: TWndMethod;


  這個屬性用於指定一個函數,用這個函數來響應message參數指定的windows消息。例如:


procedure TMyListBoxDescendant.ToggleSubClass(On: Boolean); 
begin 
if On then 
WindowProc := SubClassWndProc; 
else 
WindowProc := WndProc; 
end;


(4)function Perform(Msg: Cardinal; WParam這個函數用來向控件本身發一個消息。 
例如:


procedure TForm1.Button1Click(Sender: TObject); 
begin 
with RichEdit1 do 
Begin 
SelStart := StrToInt(MaskEdit1.Text); 
RichEdit1.Perform(EM_SCROLLCARET 
end; 
end;


(5)procedure Broadcast(var Message);這個函數用於向全部的子控件廣播一個消息。 
(6)procedure DefaultHandler(var Message); virtual;該函數提供了隊全部消息的默認處理,能夠重載這個虛擬函數。Message參數是無類型的,但能夠強制轉換成Tmessage類型。

六、windows API中有關消息的幾個重要函數:


(1)GetMessage函數: 
BOOL GetMessage(LPMSG lpMsg HWND hWnd 
UINT wMsgFilterMin UINT wMsgFilterMax// 最後的消息); 
delphi中的定義: 
function GetMessageA(var lpMsg: TMsg; hWnd: HWND; wMsgFilterMin 
這個函數能夠有選擇的從消息隊列重獲得消息。 
(2)TranslateMessage函數: 
BOOL TranslateMessage(CONST MSG *lpMsg // 消息的地址); 
delphi中的定義: 
function TranslateMessage(const lpMsg: TMsg): BOOL; stdcall; 
這個函數用於將virtul-key消息翻譯爲字符消息。 
(3)DispatchMessage函數: 
LONG DispatchMessage(CONST MSG *lpmsg // 消息的指針); 
delphi中的定義: 
function DispatchMessage(const lpMsg: TMsg): Longint; stdcall; 
這個函數派送消息到窗口過程。 
(4)PostMessage函數: 
BOOL PostMessage(HWND hWnd UINT Msg WPARAM wParam 
LPARAM lParam // 第二個消息參數); 
delphi中的定義: 
function PostMessageA(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;這個函數用於將消息傳送到窗口的消息隊列。

 

轉自:http://www.cnblogs.com/railgunman/articles/1790078.html

相關文章
相關標籤/搜索