網站建設| 數據庫類| 圖形圖象| 程序設計| 現代辦公| 操作系統| 考試認證| 網絡技術| 軟件工程| 電腦相關| 文學作品
網站開發| 網頁制作| 操作系統| 圖象圖形| 考試認證| 數據庫類| 程序設計| 硬件技術| 現代辦公| 網絡技術| 笑話頻道
 
您的位置: 電腦書庫首頁-> 電腦文摘-> 程序設計-> C++Builder-> C++ Builder中消息處理過程及應用

C++ Builder中消息處理過程及應用
作者:佚名 來源:InterNet 加入時間:2005-1-28
相關文章
  • C++ Builder構建算二十四點小游戲
  • 用C++ Builder實現桌布自動更新
  • 用C++ Builder開發多層數據庫應用程序
  • 用C++ Builder創建數字簽名
  • C++ Builder下數據庫報表Master/Detail關系功能的實現
  • 用C++ Builder實現網絡連接檢測程
  • 相關書籍:
  • C++ Builder 5.0經典入門
  • C++ Builder 3 核心編程技術
  • C++ Builder作為一種RAD方式的程序開發工具,其全新的可視化編程環境、面向組件的開發模式無疑會大大地提高編程效率。它對繁雜的Windows 消息及API作了較全面的封裝,編程者在大多數情況下不需理會Windows消息的細節,只要將心思放在組件的事件處理函數上即可。然而,畢竟Windows操作系統是一個以消息驅動的系統,運行其上的應用程序,自然無法脫離系統之外,因此掌握并運用消息處理,對一些問題的處理會有事半功倍的效果。

      盡管C++ Builder的VCL控件封裝了大多數常用的消息,C++ Builder所提供的事件處理能力也具備了相當程度的完備性,但當處理C++ Builder 未定義的Windows消息或自定義消息時,掌握C++ Builder 的內部消息處理機制還是十分必要的。下面,從Windows 操作系統消息驅動機制開始,進而探討C++ Builder的VCL控件中消息的封裝、傳遞和處理機制,最后以新增消息處理過程的應用實例作為對所講內容的驗證和實踐。

      一、Windows 消息驅動機制

      Windows是以消息驅動的操作系統,Windows 消息提供了應用程序與應用程序以及應用程序與Windows系統之間進行通訊的手段。

      Windows 中有一個系統消息隊列,對于每一個正在執行的Windows應用程序,系統為其建立一個“消息隊列”,即應用程序隊列,用來存放該程序可能創建的各種窗口的消息。應用程序中含有一段稱作“消息循環”的代碼,用來從消息隊列中檢索這些消息并把它們分發到相應的窗口函數中。

      消息循環代碼是應用程序中主函數winmain ( )中類似如下的程序段:

      while(GetMessage(&&msg,NULL,NULL,NULL))

      { //從消息隊列中取得消息

      TranslateMessage(&&msg);

      //檢索并生成字符消息WM_CHAR

      DispatchMessage(&&msg);

      //將消息發送給相應的窗口函數

       }

      由此可見,所謂“消息循環”,實際是程序循環。

      Windows 應用程序創建的每個窗口都在系統核心注冊一個相應的窗口函數,窗口函數程序代碼形式上是一個巨大的switch 語句,用以處理由消息循環發送到該窗口的消息,窗口函數由Windows 采用消息驅動的形式直接調用,而不是由應用程序顯示調用的,窗口函數處理完消息后又將控制權返回給Windows。

      系統消息隊列、應用程序隊列、消息循環和窗口函數之間的關系如圖1所示。

    二、C++ Builder 中的消息處理

      有了以上Windows 系統消息驅動模式程序設計的認識,下面分析一下C++ Builder中消息處理是如何封裝、實現的。

       Windows 程序框架,包括一些初始化、消息循環代碼等,在類 Application中封裝、實現。每一個用C++ Builder 編寫的Windows GUI 應用程序,大部分缺省生成如下代碼:

      WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

      //Windows 應用程序主函數

       {

          try

          {

      Application-〉Initialize();//作初始化

      Application-〉CreateForm(__classid(TForm1), &&Form1);

      Application-〉Run();

      //其中包含消息循環

       }

       catch (Exception &&exception)  //例外處理

       {

      Application-〉ShowException(&&exception);

       }

       return 0;

      }

      對于消息處理,C++ Builder采用基于控件(component)的程序設計模式,每種控件都繼承一套完整的消息派送體系。其實現方法如下: 它為每一種類型的控件都注冊一個名為 MainWndProc 的方法函數作為窗口函數,接受“消息循環”派送來的消息,它是一個非虛擬方法,不對任何特定消息作特別處理,它僅僅調用 WndProc 方法函數,并作一些例外處理。不同控件對消息處理的定制發生在WndProc 方法中,因為它是一個虛擬方法,每一種控件可以通過覆蓋它來適應特別的情況。WndProc 方法檢查不同的條件,作不同的處理,從而能夠濾掉不希望處理的各種消息。例如:當控件正被拖動時,應忽略鍵盤事件,所以在Twincontrol 類的WndProc 方法中,有判斷當控件不是被拖放狀態、才繼續傳遞鍵盤消息這樣功能的代碼。最終,WndProc 調用 Dispatch 方法,它是一個從所用控件的起始祖先Tobject 繼承而來的虛擬方法,它確定調用哪個方法處理傳來的消息。Dispatch 使用消息結構(Tmessage)中的 msg 成員變量確定如何處理一個特定的消息,如果控件定義了處理這一消息的函數,則調用它,否則,就逐級向上追溯,看祖先類是否定義此類的處理方法,直到起始祖先類(Tobject)。如果都沒有定義處理方法,則調用缺省的處理方法(DefaultHandler)。

      以上是消息在控件中的傳遞過程,INPRISE公司為方便用戶,對消息處理作了進一步的封裝,把常用的消息封裝成相應的事件屬性,這樣編程者完全不用考慮消息細節,只要編寫事件處理方法,并給事件屬性賦值即可。

      三、應用實例

      下面以增加新的自定義消息處理過程為例,對以上所述內容做進一步的說明。

      通過以上分析我們知道,每一條消息的具體處理過程,是在 Dispatch 中派發完成的,因此增加新的消息, 只要覆蓋虛擬函數 Dispatch 即可。

      C++ Builder為了方便地處理消息,定義了以下三個處理消息的宏:

      BEGIN_MESSAGE_MAP

      VCL_MESSAGE_HANDLER(msg,type,meth)

      END_MESSAGE_MAP(base)

      定義如下:

      #define BEGIN_MESSAGE_MAP virtual void __fastcall Dispatch(void Message)

      {                     switch (((PMessage)Message)-〉Msg)    

      {

      #define VCL_MESSAGE_HANDLER(msg,type,meth)    

      case  msg:

      meth(((type)Message));       break;

      #define END_MESSAGE_MAP(base)  default:

       base::Dispatch(Message);

         break;

      }

       }

      我們只需在控件類或自定義控件類的public節,依次寫入三個宏即可,其中宏VCL_MESSAGE_HANDLER可以根據處理消息的條數而出現多次。宏展開后,即生成一個新的Dispatch 函數,它先判斷處理用戶定義消息,若是其他消息,則傳遞至父類的Dispatch 函數處理,從而完成自定義消息的處理并保證原來消息處理體系的完整性。


    [文章錄入員:nancy]

    相關文章
  • C++ Builder構建算二十四點小游戲
  • 用C++ Builder實現桌布自動更新
  • 用C++ Builder開發多層數據庫應用程序
  • 用C++ Builder創建數字簽名
  • C++ Builder下數據庫報表Master/Detail關系功能的實現
  • 用C++ Builder實現網絡連接檢測程
  • 相關書籍:
  • C++ Builder 5.0經典入門
  • C++ Builder 3 核心編程技術
  • 本站推薦內容

    近期主機類熱搜關鍵詞:
    美國服務器 美國服務器租用 海外服務器租用 國外服務器租用

    C++Builder
    C/C++/VC
    C++Builder
    Basic/VB類
    Delphi/Pascal
    Java編程
    FORTRAN
    其它
    電腦教程閱讀排行
    ·模擬鍵盤按鍵 自動輸入文字
    ·在C++Builer中多線程的實...
    ·C++ Builder構建算二十...
    ·C++ Builder中消息處理...
    ·用C++ Builder實現桌布...
    ·用C++ Builder實現網絡...
    ·用C++ Builder開發多層...
    ·用C++Builder 建立數據...
    ·用BCB開發有身份認證功能的Em...
    ·個性凸現的動畫 特技效果
    福建22选5号码走势图