Delphi對Message訊息的處理 |
|
ddy
站務副站長 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
關於訊息處理,在BCB的討論區裡有不少討論,相信這篇文章對於Delphi的使用者有興趣了解message 的有些幫助^^
---------------------------------------------------------------- Delphi中對消息的處理D 劉文彥 張 翔D
(吉林化工學院)DD 摘要:本文對覆蓋消息和自定義消息的處理方法進行討論,總結出兩類消息處理的步驟, 並通過常式加以實現。D
關鍵字:Delphi; 消息; 通訊D
1. 引言D 在Windows作業系統中,可以同時運行多個應用程式,並且保持相對的獨立性。Windows和應用程式之間是通過發送消息的方法互相聯繫。Windows每一個應用程式建立一個消息佇列,當應用程式執行某一操作時,將生相應的消息事件,Windows將事件放入消息佇列中等候應用程式取走,應用程式取走消息後,將執行相應程式命令,處理完畢後再取下一條消息。同時,消息也可以在不同的應用程式中進行傳遞,這就保證了應用程式之間的相互聯繫和通訊。D
2.消息分析
處理Windows發往各個應用程式的消息是Windows編程的重要內容之一,深刻瞭解消息的處理方法是編寫一個好的應用程式的重要基礎。Delphi中提供了對消息的處理方法,並把Windows中的消息轉化自己的元件 在Delphi中處理Windows預定義的消息通常叫覆蓋消息,另一類是自定義消息。Windows在消息處理過程中?每一個消息確定了一個消息索引號,其範圍是1~49151。Windows保留了1~1024範圍。所以,覆蓋消息的索引號在1~1024範圍內,而自定義的消息就不要與預定義的消息發生衝突。下面對兩類消息的處理方法做一說明。D
2.1 覆蓋消息D
覆蓋消息是將Windows預定義的消息進行覆蓋。覆蓋消息的原理是通過給新的消息處理方法賦予原消息索引號。這樣,當某個事件?生消息的發生事件時,根據其索引號得到新的消息處理方法。覆蓋消息的處理步驟:D
1)確定所需處理的消息D
確定消息是確定覆蓋的系統消息,不同的事件有不同的消息,例如:滑鼠單擊視窗中的標題欄(視窗中的藍色彩條)所?生的消息是WM_SYSCOMMAND。D
2)在程式中聲明所處理的消息(覆蓋原消息)D
在派生類的protected部分聲明消息處理方法,此方法必須是過程:例如:D
Procedure mymessage(var msg:Tmessage);
message WM_messageindex;D
在protected中聲明主要是在該類的封裝時將其私有化(只允許該類使用),mymessage?此消息的過程名,用關鍵字message將WM_messageindex的索引號分配給mymessage,即覆蓋WM_messageindex消息。WM_messageindex可以是前面提到的WM_SYSCOMMAND消息。D
3)編寫消息處理過程D
在程式的implementation部分編寫消息的實現代碼。具體如下:D Procedure mymessage(var msg:Tmessage); BeginD //所要執行的具體內容。D End;D2.2 自定義消息D 自定義消息是聲明Windows沒有預定義的消息,因?不是預定義的消息,所以要編寫程式,發送消息。而且用戶可以定義一些本消息自帶的參數。通過自定義消息,作者可以編寫具有特色的應用程式。D 自定義消息的步驟:D 1)聲明消息的索引號D 前面已經提到了消息索引號的範圍以及分配情況。在Delphi中常量WM_USER=1024可以用做自定義消息索引號的起始值,如:D const WM_mymessage=WM_USER $100;D 但要注意的是一些Windows的標準元件已經佔用了1024以外的索引號,?了避免這樣的衝突,在Delphi中有另處一個常量WM_APP=32768,建議自定義消息的索引號以WM_APP?起點 ,如:D constD WM_mymessage=WM_APP $100D 2)定義消息記錄類型D 在定義完消息的索引號後,還需要定義消息的記錄類型。消息記錄類型是傳送給消息處理方法的參數結構類型。整個消息記錄類型共128bits。定義消息記錄類型時記錄大小不能超出此範圍。下面是一個消息記錄類型的例子:D Type TWMmymessage=record Msg:Cardinal;//該記錄對應的消息。D Name:DWORD;//對應參數wParamD Time:DWORD;//對應參數1Param; Result:Longint; end;D3)在程式中聲明所處理的消息D 聲明消息的方法和聲明覆蓋消息的方法是相同的,使用規則也是一樣的。D 4)編寫消息處理過程D 和前面提到的覆蓋消息處理過程方法一樣,可以參考前面的例子進行編寫。D 5)發送自定義消息D 自定義消息不是通過系統發生的某一件事所?生,而是需要我們自己發送到消息佇列中。這就涉及到消息的發送問題,在用戶發送消息時可以使用下面兩個Windows的API函數:D 1 LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM 1Param); 2 BOOL PostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM 1Param);D3. 應用程式設計 3.1 程式實例D 下面是該程式的部分代碼:D unit Unit1; interface uses Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs, shellapi,StdCtrls;//因?要用到Windows//API函數所以在此聲明ShellapiD //定義消息索引號D const WM_mymessage=WM_USER $100;D //定義消息類型D Type TWMmymessage=record Msg:Cardinal;//該記錄對應的消息。C Name:DWORD;//對應參數wParam Time:DWORD;//對應參數1Param; Result:Longint; end; type TForm1=class(TForm) Label1:TLabel; label2:TLabel; wp:TLabel; lp:TLabel; Button1:TButton; Button2:TButton; Edit1:TEdit; Edit2:TEdit; Procedure Button1Click(Sender:TObject); Procedure Button2Click(Sender:TObject); private {Private declarations} procedure mytitlemessage(var msg:TWmsyscommand);message WM_SYSCOMMAND; Procedure myownermessage(var msg:tWMmymessage);message WM_mymessage);message WM_mymessage; public {Public declarations} end; var Form1:TForm1; implementation {$R*.DFM}D //覆蓋消息的處理過程D procedure Tform1.mytitlemessage(var msg:TWmsyscommand); beginD //得到消息的參數D case msg.CmdType of SC_CLOSE:showmessage (您單擊了關閉按扭);//按了關閉按扭D SC_MAXIMIZE:showmessage (您單擊了最大化按扭);//按了最大化按扭D SC_MINIMIZE:showmessage (您單擊了最小化按扭);//按了最小化按扭D end; inherited; end; //自定義消息處理D procedure Tform1.myownermessage(var msg:TWMmymessage); begin //得到消息的參數D wp.Caption:=inttostr(msg.name); lp.caption:=inttostr(msg.time); end; //用sendmessage函數發送消息D procedure TForm1.Button1Click(Sender:TObject); var hwn:hwnd; begin //得到當前窗口的控制碼D hwn:=findwindow(`tform1',`消息處理'); //其中edit1.text、edit2.text?所要傳遞D //消息的參數D Sendmessage(hwn,cardinal(WM_mymessage), strtoint(edit1.text),strtoint(edit2.text); end; //用postmessage函數傳遞消息D procedure Tform1.Button2Click(Sender:TObject); var hwn:hwnd; begin //得到當前窗口的控制碼D hwn:=findwindow('tform1','消息處理'); //其中edit1.text、edit2.text?所要傳遞//消息的參數D postmessage(hwn,cardinal(WM_mymessage)), strtoint(edit1.text),strtoint(edit2.text); end; end.D3.2 程式說明D 該程式實現對標題欄單擊事件所?生的消息覆蓋,當用戶單擊標題欄的三個按扭時,彈出對話方塊提示用戶操作。D 本程式已在Delphi 5.0和Windows 98中調試通過。D 4. 結論 1)應用程式中有許多需要處理的消息,只要知道消息的索引號就可以對發向本應用程式的 消息進行特殊的處理,然後返回其默認的消息參數。比如Windows系統中的關閉操作,向各個應用程式發送的消息是WML-QUERYENDSESSION,這樣可以在應用程式中覆蓋這個消息來完成關閉程式所需要完成的工作,不影響Windows的正常關閉,而且返回其適當的值可以禁止Windows的關閉。這對製作監控類的應用軟體是非常重要的。D 2)通過自定義消息,可以實現不同應用程式之間的通訊。在開發具有多個可執行文件的軟 件時,可以通過自定義消息來完成兩個程式之間的通訊。D 參考文獻: 1朱宏偉。Delphi5.0編程指南。北京:冶金工業出版社。2000.1D 2新智工作室。Delphi5.0基礎與提高。北京:電子工業出版社。2000.3D 3呂宗智、汪世攀。Delphi實用技術精粹。北京:人民郵電出版社。2000.3D 發表人 - ddy 於 2002/08/10 00:12:15 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |