Borland C++ Builder的API後門 (轉)
攔截訊息需要以下幾步:
在表單頭內(如Unit1.h)
1. 在類宣告中建立訊息對映表,把某條訊息的處理權交給自定義的訊息處理。
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(Windows訊息名,TMessage,訊息處理函式名)
MESSAGE_HANDLER(...)
END_MESSAGE_MAP(TForm)
2. 在類宣告的private區內宣告訊息處理函式。
private: // User declarations
void __fastcall 訊息處理函式名(TMessage &Message);
在表單檔案內(如Unit1.cpp)
3. 寫出訊息處理函式,在這裡實現你需要的功能。比如
void __fastcall MainForm::OnWMHScroll (TMessage &Message)
{
... // 在此加入你自己的程式碼
TForm::Dispatch(&Message);
}
------ 解釋
1. 關於TMessage
TMessage是VCL預定義的結構,定義如下:
struct TMessage
{
unsigned int Msg; 息
int WParam; 引數
int LParam; 字引數
int Result; 息結果
};
2. 關於TForm::Dispatch(&Message)
自定義的訊息處理函式末尾最好加一句TForm::Dispatch(&Message),這一句的作用是讓訊息繼續傳遞下去。如果沒有這一句,訊息將被完全攔截,VCL類可能由於得不到訊息而無法實現正常功能。
------ 例項一:修改選單
有一些,主視窗很小,選單也沒有,如果想加入關於或設定對話方塊,最好的辦法是拿系統選單開刀。Windows 中,修改系統選單與實現其他功能一樣,不太容易,也不會太難。但在C++ Builder中,表單類(TForm)沒有提供有關係統選單的任何屬性與方法,實現其他功能易如反掌,而修改系統選單似乎難於上青天。
還好,Borland公司允許程式設計師自已處理Window訊息,於是機會來了!
一、用Window API函式修改系統選單
假定表單名為MainForm,設定MainForm::OnCreate()函式:
用GetSystemMenu(MainForm->Handle,false)取得系統選單控制程式碼;
用AppendMenu,DeleteMenu,ModifyMenu函式修改系統選單,把新的ID號賦於自定義的選單項。
這時執行程式,可以看到系統選單也被修改,但自定義的選單項卻不能被響應。
二、攔截WM_SYMMAND訊息以響應自定義的選單項
在表單標頭檔案內(如Unit1.h)
在表單類定義末尾加入訊息響應表,取得WM_SYSCOMMAND訊息的處理權
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_SYSCOMMAND,TMessage,OnWMSysCommand)
END_MESSAGE_MAP(TForm)
在表單類定義的private區內加入訊息處理函式宣告
private: // User declarations
void __fastcall OnWMSysCommand(TMessage& Message);
在表單檔案內(如Unit1.h)
寫出訊息響應函式
void __fastcall TForm1::OnWMSysCommand(TMessage& Message)
{
if(Message.WParam==ID_SysMenu_MyItem)
{
// Your Code Here, Do Something
}
TForm::Dispatch(&Message);
}
三、完整程式示例
例項二:給跟蹤欄增加OnStartTrack和OnEndTrack事件
當跟蹤欄用於進度控制時,OnStartTrack和OnEndTrack很可能是你需要的事件。比如在控制多進度的場合,當移動滑塊時,你需要OnStartTrack事件讓播放停止,需要OnEndTrack事件定位新的播放位置。但Borland公司沒有提供這兩個事件,我等程式設計愛好者只好自力更生,打攔截Windows訊息的主意了。
一、攔截WM_HSCROLL訊息,給跟蹤欄增加OnStartTrack和OnEndTrack事件
在表單標頭檔案內(如Unit.h)
在表單類定義末尾加入訊息響應表,把WM_HSCROLL訊息處理權交給OnWMHScroll函式。
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_HSCROLL,TMessage,OnWMHScroll)
END_MESSAGE_MAP(TForm)
在表單類定義的private區內加入OnWMHScroll函式宣告。
private: // User declarations
void __fastcall OnWMHScroll(TMessage &Message);
在表單類定義的private區內加入StartTrack和EndTrack函式宣告。
private: // User declarations
void __fastcall TrackBar1StartTrack(T *Sender);
void __fastcall TrackBar1EndTrack(TObject *Sender);
在表單檔案內(如Unit.cpp)
寫出OnWMHScroll函式,使它能根據訊息引數StartTrack和EndTrack函式,在實際意義上產生OnStartTrack和OnEndTrack事件。
寫出StartTrack和EndTrack函式。
如果是垂直跟蹤欄,把上面的WM_HSCROLL改為WM_VSCROLL即可。
二、完整程式示例
尾聲
Borland C++ Builder程式設計中,攔截Windows訊息是一項高階程式設計技術,能讓你儘量挖掘Windows的潛力,尤其讓曾用API程式設計的程式設計師感到心慰。攔截Windows訊息是API盡情發揮的舞臺,當VCL不能為你做什麼時,請想起底層的API。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-989125/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Borland C++ Builder 5 企業版使用BDE訪問 Oracle方法 (轉)C++UIOracle
- Borland C++Builder .RES 中文化 (轉)C++UI
- Borland C++ 5.02 IDE 中的 bug (轉)C++IDE
- Automation In C++ Builder (轉)C++UI
- borland c++ bulder的檔案操作總結-2 (轉)C++
- borland c++ bulder的檔案操作總結-1 (轉)C++
- borland c++ bulder的檔案操作總結-3 (轉)C++
- borland c++ bulder的檔案操作總結-4 (轉)C++
- c++ builder中的ado使用 (轉)C++UI
- C++ BUILDER 訊息處理的深入探索 (轉)C++UI
- 在C++ Builder中定義事件 (轉)C++UI事件
- 用C++ Builder檢測Windows的啟動模式(轉)C++UIWindows模式
- C++ Builder 初學問與答 (十一) (轉)C++UI
- C++ Builder 初學問與答 (十二) (轉)C++UI
- C++ Builder 初學問與答(三) (轉)C++UI
- C++ Builder 初學問與答(八) (轉)C++UI
- 用C++ Builder在桌面上畫圖 (轉)C++UI
- Borland C++ 6安裝Indy9C++
- Visual C++與Delphi/C++Builder之比較 (轉)C++UI
- 用C++ Builder來定製系統選單(轉)C++UI
- C++ Builder 學習1C++UI
- 在C++ Builder中用socket api來寫網路通訊程式(同時支援TCP和UDP協議) (轉)C++UIAPITCPUDP協議
- Borland與Microsoft關於Delphi的對話 (轉)ROS
- 用C++ Builder 實現類似ie位址列的ComboBox (轉)C++UI
- 用C++ Builder中的TServerSocket,TClientSocket來寫網路通訊程式 (轉)C++UIServerclient
- (轉貼) C++ Builder 2007六月上市 (C/C++) (News)C++UI
- IBM收購Rational後續 市場分析微軟將收購Borland (轉)IBM微軟
- 在C++ Builder3下實現程式自動執行的方法 (轉)C++UI
- c++ builder裡四種處理“滑鼠離開窗體”事件的方法 (轉)C++UI事件
- Borland 關注Java和.NET之間的裂口 (轉)Java
- C++ Builder 5 和 6中VCL的一個記憶體洩漏 BUG (轉)C++UI記憶體
- 魔力拼圖(Builder) (轉)UI
- 在C++ Builder中使用ActiveX控制元件顯示Flash動畫 (轉)C++UI控制元件動畫
- Borland推出全新Linux開發工具Kylix (轉)Linux
- 匯出 C/C++ API 給 Lua 使用[轉]C++API
- c++ Builder 關於檔案和目錄的操作C++UI
- 用idl2cpp.exe編譯idl 檔案[C++ Builder] (轉)編譯C++UI
- SAP與Borland合作 ,整合JAVA開發環境 (轉)Java開發環境