熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

Delphi的消息處理[2]

2013-11-23 17:41:00  來源: Delphi編程 

    消息的發送

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

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

    VCL內部消息通常以CM_開頭用於管理VCL內部的事物如果改變了某個屬性值或組件的其他一些特性後需要通過內部消息將該變化通知其他組件例如激活輸入焦點消息是向被激活的或被停用的組件發送的用於接受或放棄輸入焦點

    另外還有通知消息一個窗口內的子控件發生了一些事情需要通知父窗口這是通過通知消息實現的它只適用於標准的窗口控件如按鈕列表框編輯框等等打開Messagepas文件在標准的Windows後就是通知消息的聲明:

    const

  {$EXTERNALSYM BN_CLICKED}

      BN_CLICKED = ;

  {$EXTERNALSYM BN_PAINT}

      BN_PAINT = ;

  {$EXTERNALSYM BN_HILITE}

      BN_HILITE = ;

    以上是按鈕的通知消息分別表示用戶單擊了按鈕按鈕應當重畫用戶加亮了按鈕

    用戶也可以自己定義消息給自己發送消息和編寫消息處理過程消息的常量值為WM_USER + 到$FFF 這個范圍是Windows為用戶自定義消息保留的

    Delphi消息的發送有三種方法

    .Tcontrol類的Perform對象方法可以向任何一個窗體或控件發送消息只需要知道窗體或控件的實例其聲明如下

function TcontrolPerform(Msg: Cardinal; Wparam Lparam: Longint): Longint

   .Windows的API函數SendMessage()和Postmessage()其聲明如下

  function SendMessage(hWnd: HWND; Msg: UINTwParamWPARAM; lParam: LPARAM)LRESULTstdcall

  function SendMessage(hWnd: HWND; Msg: UINTwParam: WPARAM; lParamLPARAM)LRESULTstdcall

  PostMessage函數將消息添加到應用程序的消息隊列中去應用程序的消息循環會從消息隊列中提取登記的該消息再發送到相應的窗口中

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

  VCL消息處理機制

  在Delphi應用程序的源代碼中有語句ApplicationRun它的作用是啟動消息循環然後調用ApplicationProcessMessage該函數會在應用程序的消息隊列中查找一條消息當在消息隊列中檢索到一條消息後觸發ApplicationOnMessage事件這樣在Windows本身對消息處理之前就會響應OnMessage事件的處理過程它優於任何消息處理而且只接收登記的消息即前面所述的由PostMessage發送的消息響應ApplicationOnMessage事件的處理過程必須是TmessageEvent類型 其聲明如下

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

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

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

  然後把此方法賦給ApplicationOnMessage事件:

  ApplicationOnMessage := OnMyMessage;

  OnMessage事件將捕獲發送給應用程序的所有消息這是一個非常繁忙的事件因此在處理OnMessage事件的處理過程中設置斷點進行消息處理是不明智的

  VCL對象用於接收消息的方法叫MainWndProc它是定義在Twincontrol類中的靜態方法不能被重載它不直接處理消息當消息離開MainWndProc後消息被傳遞給對象的WndProc方法WndProc方法是在Tcontrol類中定義的一個虛擬方法由它調用Dispatch方法Dispatch根據傳入的Message來尋找相應的處理方法如果最後找不到就繼續向上到父類中尋找消息處理方法一直到找到為止如果找不到則調用DefaulthandlerDefaulthandler方法對消息進行最後的處理然後把消息傳遞給Windows的DefWindowProc函數或其他默認的窗口過程

[]  []  


From:http://tw.wingwit.com/Article/program/Delphi/201311/24882.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.