欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Delphi的消息處理

Delphi的消息處理

時(shí)間:2011-5-26來(lái)源:yang 作者: peng點(diǎn)擊: 14次

Delphi的消息處理
Delphi是Borland公司的一種面向對象的可視化軟件開(kāi)發(fā)工具。

  Delphi集中了Visual C + +和Visual Basic兩者的優(yōu)點(diǎn):容易上手、功能強大,特別是在界面設計、數據庫編程、網(wǎng)絡(luò )編程方面更有其獨特的優(yōu)勢。
Delphi中的消息

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

  在Delphi中消息以TMessage記錄的方式定義。打開(kāi)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是區別于其他消息的常量值,這些常量值可以是Windows單元中預定義的常量,也可以是用戶(hù)自己定義的常量。Wparam通常是一個(gè)與消息有關(guān)的常量值,也可以是窗口或控件的句柄。LParam通常是一個(gè)指向內存中數據的指針。

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

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

TWMKey = packed record

    Msg: Cardinal;

    CharCode: Word;

    Unused: Word;

    KeyData: Longint;

    Result: Longint;

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

    TWMChar = TWMkey; TWMKeyDown =

    TWMkey;TWMKeyUp = TWMkey; TWMSys

    - KeyDown = TWMkey; TWMSysKeyUp =

    TWMkey;TWMSysChar = TWMkey;

    消息的發(fā)送

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

    前面我們提到的消息都是標準的Windows消息(WM_X), 除此之外還有VCL內部消息、通知消息和用戶(hù)自定義消息。

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

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

  const

  {$EXTERNALSYM BN_CLICKED}

     BN_CLICKED = 0;

  {$EXTERNALSYM BN_PAINT}

     BN_PAINT = 1;

  {$EXTERNALSYM BN_HILITE}

   BN_HILITE = 2;

    以上是按鈕的通知消息,分別表示用戶(hù)單擊了按鈕、按鈕應當重畫(huà)、用戶(hù)加亮了按鈕。

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

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

    1 .Tcontrol類(lèi)的Perform對象方法??梢韵蛉魏我粋€(gè)窗體或控件發(fā)送消息,只需要知道窗體或控件的實(shí)例。其聲明如下:

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

  2 .Windows的API函數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函數將消息添加到應用程序的消息隊列中去。應用程序的消息循環(huán)會(huì )從消息隊列中提取登記的該消息,再發(fā)送到相應的窗口中。

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

  VCL消息處理機制

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

    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ā)送給應用程序的所有消息,這是一個(gè)非常繁忙的事件,因此在處理OnMessage事件的處理過(guò)程中設置斷點(diǎn)進(jìn)行消息處理是不明智的。

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

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Delphi 7 定義你自己的消息
windows消息處理機制
Windows消息機制
Delphi避免程序重復運行
Windows API函數使用技巧
Intercepting Keyboard Input with Delphi - Implementing a Keyboard Hook
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久