久久―日本道色综合久久,亚洲欧美精品在线,狼狼色丁香久久婷婷综合五月,香蕉人人超,日本网站黄,国产在线观看不卡免费高清,无遮挡的毛片免费

2023信創(chuàng)獨(dú)角獸企業(yè)100強(qiáng)
全世界各行各業(yè)聯(lián)合起來(lái),internet一定要實(shí)現(xiàn)!

C++ Builder中消息處理過(guò)程及應(yīng)用

2004-02-14 eNet&Ciweek

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

  有了以上Windows 系統(tǒng)消息驅(qū)動(dòng)模式程序設(shè)計(jì)的認(rèn)識(shí),下面分析一下C++ Builder中消息處理是如何封裝、實(shí)現(xiàn)的。

   Windows 程序框架,包括一些初始化、消息循環(huán)代碼等,在類 Application中封裝、實(shí)現(xiàn)。每一個(gè)用C++ Builder 編寫的Windows GUI 應(yīng)用程序,大部分缺省生成如下代碼:

  WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

  //Windows 應(yīng)用程序主函數(shù)

   {

      try

      {

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

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

  Application-〉Run();

  //其中包含消息循環(huán)

   }

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

   {

  Application-〉ShowException(&exception);

   }

   return 0;

  }

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

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

  三、應(yīng)用實(shí)例

  下面以增加新的自定義消息處理過(guò)程為例,對(duì)以上所述內(nèi)容做進(jìn)一步的說(shuō)明。

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

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

  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節(jié),依次寫入三個(gè)宏即可,其中宏VCL_MESSAGE_HANDLER可以根據(jù)處理消息的條數(shù)而出現(xiàn)多次。宏展開后,即生成一個(gè)新的Dispatch 函數(shù),它先判斷處理用戶定義消息,若是其他消息,則傳遞至父類的Dispatch 函數(shù)處理,從而完成自定義消息的處理并保證原來(lái)消息處理體系的完整性。

相關(guān)頻道: eNews

您對(duì)本文或本站有任何意見(jiàn),請(qǐng)?jiān)谙路教峤?,謝謝!

投稿信箱:tougao@enet16.com