3. 創(chuàng)建新的消息處理方法
因?yàn)镈elphi只為大多數(shù)普通Windows消息提供了處理方法,所以當(dāng)你定義自己的消息時(shí),就要?jiǎng)?chuàng)建新的消息處理方法。
用戶自定義消息的過(guò)程包括兩個(gè)方面:
● 定義自己的消息
● 聲明新的消息處理方法
、 定義自己的消息
許多標(biāo)準(zhǔn)部件為了內(nèi)部使用定義了消息。定義消息的最一般的動(dòng)因是廣播信息和狀態(tài)改變的通知。
定義消息過(guò)程分兩步:
● 聲明消息標(biāo)識(shí)符
● 聲明消息記錄類(lèi)型
、 聲明消息標(biāo)識(shí)
消息標(biāo)識(shí)是整型大小的常量。Windows保存了小于1024的消息用于自己使用,因此當(dāng)聲明自己的消息時(shí),你應(yīng)當(dāng)大于1024。
常量WM_USER代表用于自定義消息的開(kāi)始數(shù)字。當(dāng)定義消息標(biāo)準(zhǔn)時(shí),你應(yīng)當(dāng)基于WM_USER。
某些標(biāo)準(zhǔn)Windows控制使用用戶自定義范圍的消息,包括ListBox、ComboBox、EditBox和Button。如果從上述部件中繼承了一個(gè)部件,在定義新的消息時(shí),應(yīng)當(dāng)檢查一下Message單元是否有消息用于該控制。
定義消息的方法如下:
Const
WM_MYFIRSTMESSAGE=WM_USER+0;
WM_MYSECONDMESSAGE=WM_USER+1;
② 聲明消息記錄類(lèi)型
如果你想給予自定義消息的參數(shù)有含義的名字,就要為該消息聲明消息記錄類(lèi)型。消息記錄是傳給消息處理方法的參數(shù)的類(lèi)型。如果不使用消息參數(shù)或者想使用舊風(fēng)格參數(shù),可以使用缺省的消息記錄。
聲明消息記錄類(lèi)型要遵循下列規(guī)則
● 以消息名命名消息記錄類(lèi)型,以T打頭
● 將記錄中第一個(gè)域命名為Msg,類(lèi)型為T(mén)MsgPraram
● 將接著的兩個(gè)字節(jié)定義為word 以響應(yīng)word大小的參數(shù)
● 將接著的四個(gè)字節(jié)與long參數(shù)匹配
● 將最后的域命名為Result,類(lèi)型為L(zhǎng)ongint
下面是TWMMouse的定義
type
TWMMouse=record
Msg: TMsgParam; { 第一個(gè)是消息ID }
Keys: Word; { wParam }
case Integer of { 定義lParam的兩種方式 }
o: (
Xpos: Integer; { 或者以x,y座標(biāo) }
Ypos: Integer);
1: (
Pos : TPoint; { 或者作為單個(gè)點(diǎn) }
Result: Longint; ) { 最后是Result域 }
end;
TWMMouse使用變長(zhǎng)記錄定義了相同參數(shù)的不同名字集。
⑵ 聲明新的消息處理方法
有兩類(lèi)環(huán)境需要你定義新的消息處理方法:
● 自定義新部件需要處理沒(méi)有被標(biāo)準(zhǔn)部件處理的Windows消息
● 已定義了自定義部件使用的新消息
聲明消息處理方法的辦法如下:
● 在部件聲明中的protected部分聲明方法
● 將方法做成過(guò)程
● 以要處理的消息名命名方法 但不帶下劃線
● 傳遞一個(gè)命名為Message的var參數(shù),類(lèi)型為消息記錄類(lèi)型
● 編寫(xiě)用于該部件的特別處理代碼
● 調(diào)用繼承的消息方法
下面是用于用戶自定義消息CM_CHANGECOLOR的消息處理代碼:
type
TMyComponent=class(TControl)
…
protected
procedure CMChangeColor(var Message:TMessage);
message CM_CHANGECOLOR;
end:
procedure TMyComponent.CMChangeColor(var Message: TMessage);
begin
color := Message lParam;
inherited;
end;
19.2.2.4 注冊(cè)部件
編寫(xiě)部件及其屬性、方法和事件只是部件創(chuàng)建過(guò)程的一部分。盡管部件具有這些特征就可用,但部件真正功能強(qiáng)大的是在設(shè)計(jì)時(shí)操作它們的能力。
使部件在設(shè)計(jì)時(shí)可用需要經(jīng)過(guò)如下幾步:
● 用Delphi注冊(cè)部件
● 增加選擇板位圖
● 提供有關(guān)屬性和事件的幫助
● 存貯和讀取屬性
1. 用Delphi注冊(cè)部件
為了讓Delphi識(shí)別自定義部件,并將它們放置于Component Palette上,你必須注冊(cè)每一個(gè)部件。
注冊(cè)一個(gè)部件要在部件所在單元里加入Register方法,這包括兩個(gè)方面的內(nèi)容:
● 聲明注冊(cè)過(guò)程
● 實(shí)現(xiàn)注冊(cè)過(guò)程
一旦安裝了注冊(cè)過(guò)程,就可以將部件安裝在選擇板上。
注冊(cè)過(guò)程要在部件所在單元中寫(xiě)一個(gè)過(guò)程,該過(guò)程必須以Register命名。Register必須出現(xiàn)在庫(kù)單元的interface部分,這樣Delphi就能定位它。在Register過(guò)程中,可以為每個(gè)部件調(diào)用過(guò)程RegisterComponents。
下面的代碼演示了建立和注冊(cè)部件的概略方法:
unit MyBtns;
interface
type
… { 聲明自定義部件 }
procedure Register;
Implementation
procedure Register;
begin
… { 注冊(cè)部件 }
end;
end.
在Register過(guò)程中,必須注冊(cè)每一個(gè)要加入Component Palette的部件,如果庫(kù)單元包含若干部件,就要將它們一次性注冊(cè)。
注冊(cè)一個(gè)部件時(shí),為部件調(diào)用RegisterComponents過(guò)程。RegisterComponents告訴Delphi兩件有關(guān)所注冊(cè)的部件的事:: [1] [2] [3] [4] 下一頁(yè)
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!