麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Delphi > 正文

Delphi的消息處理

2019-11-18 18:26:52
字體:
供稿:網(wǎng)友
Delphi是Borland公司的一種面向?qū)ο蟮目梢暬浖_發(fā)工具。 Delphi集中了Visual C++和Visual Basic兩者的優(yōu)點(diǎn):容易上手、功能強(qiáng)大,特別是在界面設(shè)計(jì)、數(shù)據(jù)庫編程、網(wǎng)絡(luò)編程方面更有其獨(dú)特的優(yōu)勢。

Delphi中的消息

消息是Windows發(fā)出的一個(gè)通知,它告訴應(yīng)用程序某個(gè)事件發(fā)生了。在Delphi中,大多數(shù)情況下Windows的消息被封裝在VCL的事件中,我們只需處理相應(yīng)的VCL事件就可以了,但如果我們需要編寫自己的控件、截獲或過濾消息就必須深入研究Win32的消息處理機(jī)制。

在Delphi中消息以TMessage記錄的方式定義。打開Message.pas文件,我們可以看到Tmessage是這樣定義的:

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;

ResultLo: Word;

ResultHi: Word);

end;

其中,Msg是區(qū)別于其他消息的常量值,這些常量值可以是Windows單元中預(yù)定義的常量,也可以是用戶自己定義的常量。Wparam通常是一個(gè)與消息有關(guān)的常量值,也可以是窗口或控件的句柄。LParam通常是一個(gè)指向內(nèi)存中數(shù)據(jù)的指針。

Result是消息處理的返回值。Wparam、Lparam和Result都是32位的,如果想訪問其中的低16位或高16位可以分別使用WparamLo、WparamHi、 LParamLo、LparamHi、ResultLo和ResultHi。

在Delphi中除了通用的Tmessage外,還為每個(gè)Windows定義了一個(gè)特殊的消息記錄。我們可以瀏覽Message.pas文件,下面是鍵盤的消息記錄:

TWMKey = packed record

Msg: Cardinal;

CharCode: Word;

Unused: Word;

KeyData: Longint;

Result: Longint;

與鍵盤相關(guān)的消息如:WM_KEYDOWN、 WM_KEYUP、 WM_CHAR、 WM_SYSKEYDOWN WM_SYSKEYUP、 WM_SYSCHAR的記錄也被定義為TWMkey。在Message.pas文件中有以下聲明:

TWMChar=TWMkey; TWMKeyDown=

TWMkey;TWMKeyUp=TWMkey; TWMSys

-KeyDown=TWMkey; TWMSysKeyUp=

TWMkey;TWMSysChar=TWMkey;

消息的發(fā)送

消息處理就是定義應(yīng)用程序如何響應(yīng)Windows的消息。在Delphi中每一個(gè)消息都有自己的處理過程,它必須是一個(gè)對象中的方法,且只能傳遞一個(gè)Tmessage或其他特殊的消息記錄,方法聲明后要有一個(gè)message命令,后接一個(gè)在0到32767之間的常量。

前面我們提到的消息都是標(biāo)準(zhǔn)的Windows消息(WM_X),除此之外還有VCL內(nèi)部消息、通知消息和用戶自定義消息。

VCL內(nèi)部消息通常以“CM_”開頭,用于管理VCL內(nèi)部的事物。如果改變了某個(gè)屬性值或組件的其他一些特性后,需要通過內(nèi)部消息將該變化通知其他組件。例如,激活輸入焦點(diǎn)消息是向被激活的或被停用的組件發(fā)送的,用于接受或放棄輸入焦點(diǎn)。

另外還有通知消息,一個(gè)窗口內(nèi)的子控件發(fā)生了一些事情,需要通知父窗口,這是通過通知消息實(shí)現(xiàn)的。它只適用于標(biāo)準(zhǔn)的窗口控件,如按鈕、列表框、編輯框等等。打開Message.pas文件,在標(biāo)準(zhǔn)的Windows后就是通知消息的聲明:

const

{$EXTERNALSYM BN_CLICKED}

BN_CLICKED = 0;

{$EXTERNALSYM BN_PAINT}

BN_PAINT = 1;

{$EXTERNALSYM BN_HILITE}

BN_HILITE = 2;

以上是按鈕的通知消息,分別表示用戶單擊了按鈕、按鈕應(yīng)當(dāng)重畫、用戶加亮了按鈕。

用戶也可以自己定義消息、給自己發(fā)送消息和編寫消息處理過程。消息的常量值為WM_USER+100到$7FFF, 這個(gè)范圍是Windows為用戶自定義消息保留的。

Delphi消息的發(fā)送有三種方法:

1.Tcontrol類的Perform對象方法。可以向任何一個(gè)窗體或控件發(fā)送消息,只需要知道窗體或控件的實(shí)例。其聲明如下:

function Tcontrol.Perform(Msg:Cardinal;Wparam,Lparam:Longint):Longint

2.Windows的API函數(shù)SendMessage()和Postmessage()。其聲明如下:

function SendMessage(hWnd: HWND; Msg: UINT;wParam:WPARAM; lParam: LPARAM):LRESULT;stdcall;

function SendMessage(hWnd: HWND; Msg: UINT;wParam: WPARAM; lParam:LPARAM):LRESULT;stdcall

PostMessage函數(shù)將消息添加到應(yīng)用程序的消息隊(duì)列中去。應(yīng)用程序的消息循環(huán)會(huì)從消息隊(duì)列中提取登記的該消息,再發(fā)送到相應(yīng)的窗口中。

SendMessage函數(shù)可以越過消息隊(duì)列直接向窗口過程發(fā)送。所以當(dāng)Windows需要立刻返回值時(shí)使用SendMessage,當(dāng)需要不同的應(yīng)用程序依次處理消息時(shí)使用PostMessage。而Perform從本質(zhì)上和SendMessage相似,它們直接向窗口過程發(fā)送。SendMessage、Postmessage函數(shù)只需要知道窗口的句柄就可以發(fā)送消息,所以它們可以向非Delphi窗體發(fā)送一條消息,但而Perform必須知道窗體或控件的實(shí)例。

VCL消息處理機(jī)制

在Delphi應(yīng)用程序的源代碼中有語句application.Run,它的作用是啟動(dòng)消息循環(huán),然后調(diào)用Application.PRocessMessage,該函數(shù)會(huì)在應(yīng)用程序的消息隊(duì)列中查找一條消息。當(dāng)在消息隊(duì)列中檢索到一條消息后,觸發(fā)Application.OnMessage事件。這樣在Windows本身對消息處理之前,就會(huì)響應(yīng)OnMessage事件的處理過程,它優(yōu)于任何消息處理,而且只接收登記的消息,即前面所述的由PostMessage發(fā)送的消息。響應(yīng)Application.OnMessage事件的處理過程必須是TmessageEvent類型,其聲明如下:

type TMessageEvent = procedure (var Msg: TMsg; var Handled: Boolean) of object;

其中TMsg是Windows中定義的消息記錄,我們可以這樣聲明:

Procedure OnMyMessage(var Msg:TMsg;var Handled:Boolean);

然后把此方法賦給Application.OnMessage事件:

Application.OnMessage :=OnMyMessage;

OnMessage事件將捕獲發(fā)送給應(yīng)用程序的所有消息,這是一個(gè)非常繁忙的事件,因此在處理OnMessage事件的處理過程中設(shè)置斷點(diǎn)進(jìn)行消息處理是不明智的。

VCL對象用于接收消息的方法叫MainWndProc。它是定義在Twincontrol類中的靜態(tài)方法,不能被重載。它不直接處理消息,當(dāng)消息離開MainWndProc后,消息被傳遞給對象的WndProc方法,WndProc方法是在Tcontrol類中定義的一個(gè)虛擬方法,由它調(diào)用Dispatch方法。Dispatch根據(jù)傳入的Message來尋找相應(yīng)的處理方法,如果最后找不到,就繼續(xù)向上到父類中尋找消息處理方法,一直到找到為止,如果找不到則調(diào)用Defaulthandler。Defaulthandler方法對消息進(jìn)行最后的處理,然后把消息傳遞給Windows的DefWindowProc函數(shù)或其他默認(rèn)的窗口過程。


上一篇:Delphi操作ACCESS技巧集

下一篇:真正的Delphi面向?qū)ο缶幊?一)

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點(diǎn)

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 俄罗斯16一20sex牲色另类 | 久久久久久免费 | 国产一区毛片 | 亚洲网站免费观看 | 久久久久久久免费精品 | 免费黄色在线 | 姑娘第四集免费看视频 | 日韩视频在线不卡 | 在线成人免费视频 | 毛片av网 | 久久里面有精品 | 手机av免费在线 | 91九色视频在线播放 | 中国黄色一级生活片 | 色污视频| hd日本xxxx | 国产免费观看视频 | 国产视频在线一区 | av成人免费 | 水多视频在线观看 | 午夜视 | 成人免费观看av | 精品国产一区二区三区在线观看 | 爱逼爱操综合网 | 黄色一级电影网 | 久久亚洲精品国产一区 | 猫咪av在线 | 91在线视频在线观看 | 久久久久久久国产a∨ | 欧美日本在线播放 | 爱看久久| 叶子楣成人爽a毛片免费啪啪 | 国产成人av在线播放 | 亚洲成人福利电影 | 一级黄色电影网站 | 高清国产免费 | 欧美精品电影一区 | 日韩视频一区二区三区在线观看 | 久久草在线观看视频 | 国产亚洲精久久久久久蜜臀 | 国产日韩久久久久69影院 |