C++ Builder作為一種RAD方式的程序開發(fā)工具,其全新的可視化編程環(huán)境、面向組件的開發(fā)模式無疑會大大地提高編程效率。它對繁雜的Windows 消息及API作了較全面的封裝,編程者在大多數(shù)情況下不需理會Windows消息的細(xì)節(jié),只要將心思放在組件的事件處理函數(shù)上即可。然而,畢竟Windows操作系統(tǒng)是一個以消息驅(qū)動的系統(tǒng),運(yùn)行其上的應(yīng)用程序,自然無法脫離系統(tǒng)之外,因此掌握并運(yùn)用消息處理,對一些問題的處理會有事半功倍的效果。
盡管C++ Builder的VCL控件封裝了大多數(shù)常用的消息,C++ Builder所提供的事件處理能力也具備了相當(dāng)程度的完備性,但當(dāng)處理C++ Builder 未定義的Windows消息或自定義消息時,掌握C++ Builder 的內(nèi)部消息處理機(jī)制還是十分必要的。下面,從Windows 操作系統(tǒng)消息驅(qū)動機(jī)制開始,進(jìn)而探討C++ Builder的VCL控件中消息的封裝、傳遞和處理機(jī)制,最后以新增消息處理過程的應(yīng)用實例作為對所講內(nèi)容的驗證和實踐。
一、Windows 消息驅(qū)動機(jī)制
Windows是以消息驅(qū)動的操作系統(tǒng),Windows 消息提供了應(yīng)用程序與應(yīng)用程序以及應(yīng)用程序與Windows系統(tǒng)之間進(jìn)行通訊的手段。
Windows 中有一個系統(tǒng)消息隊列,對于每一個正在執(zhí)行的Windows應(yīng)用程序,系統(tǒng)為其建立一個“消息隊列”,即應(yīng)用程序隊列,用來存放該程序可能創(chuàng)建的各種窗口的消息。應(yīng)用程序中含有一段稱作“消息循環(huán)”的代碼,用來從消息隊列中檢索這些消息并把它們分發(fā)到相應(yīng)的窗口函數(shù)中。
消息循環(huán)代碼是應(yīng)用程序中主函數(shù)winmain ( )中類似如下的程序段:
while(GetMessage(&msg,NULL,NULL,NULL))
{ //從消息隊列中取得消息
TranslateMessage(&msg);
//檢索并生成字符消息WM_CHAR
DispatchMessage(&msg);
//將消息發(fā)送給相應(yīng)的窗口函數(shù)
}
由此可見,所謂“消息循環(huán)”,實際是程序循環(huán)。
Windows 應(yīng)用程序創(chuàng)建的每個窗口都在系統(tǒng)核心注冊一個相應(yīng)的窗口函數(shù),窗口函數(shù)程序代碼形式上是一個巨大的switch 語句,用以處理由消息循環(huán)發(fā)送到該窗口的消息,窗口函數(shù)由Windows 采用消息驅(qū)動的形式直接調(diào)用,而不是由應(yīng)用程序顯示調(diào)用的,窗口函數(shù)處理完消息后又將控制權(quán)返回給Windows。
盡管C++ Builder的VCL控件封裝了大多數(shù)常用的消息,C++ Builder所提供的事件處理能力也具備了相當(dāng)程度的完備性,但當(dāng)處理C++ Builder 未定義的Windows消息或自定義消息時,掌握C++ Builder 的內(nèi)部消息處理機(jī)制還是十分必要的。下面,從Windows 操作系統(tǒng)消息驅(qū)動機(jī)制開始,進(jìn)而探討C++ Builder的VCL控件中消息的封裝、傳遞和處理機(jī)制,最后以新增消息處理過程的應(yīng)用實例作為對所講內(nèi)容的驗證和實踐。
一、Windows 消息驅(qū)動機(jī)制
Windows是以消息驅(qū)動的操作系統(tǒng),Windows 消息提供了應(yīng)用程序與應(yīng)用程序以及應(yīng)用程序與Windows系統(tǒng)之間進(jìn)行通訊的手段。
Windows 中有一個系統(tǒng)消息隊列,對于每一個正在執(zhí)行的Windows應(yīng)用程序,系統(tǒng)為其建立一個“消息隊列”,即應(yīng)用程序隊列,用來存放該程序可能創(chuàng)建的各種窗口的消息。應(yīng)用程序中含有一段稱作“消息循環(huán)”的代碼,用來從消息隊列中檢索這些消息并把它們分發(fā)到相應(yīng)的窗口函數(shù)中。
消息循環(huán)代碼是應(yīng)用程序中主函數(shù)winmain ( )中類似如下的程序段:
while(GetMessage(&msg,NULL,NULL,NULL))
{ //從消息隊列中取得消息
TranslateMessage(&msg);
//檢索并生成字符消息WM_CHAR
DispatchMessage(&msg);
//將消息發(fā)送給相應(yīng)的窗口函數(shù)
}
由此可見,所謂“消息循環(huán)”,實際是程序循環(huán)。
Windows 應(yīng)用程序創(chuàng)建的每個窗口都在系統(tǒng)核心注冊一個相應(yīng)的窗口函數(shù),窗口函數(shù)程序代碼形式上是一個巨大的switch 語句,用以處理由消息循環(huán)發(fā)送到該窗口的消息,窗口函數(shù)由Windows 采用消息驅(qū)動的形式直接調(diào)用,而不是由應(yīng)用程序顯示調(diào)用的,窗口函數(shù)處理完消息后又將控制權(quán)返回給Windows。