所有組件接受所有的消息,但如果一個組件沒有分配的消息處理程序,它只是無助
如果你想發現如果VCL組件有特殊的處理程序,以特定的Windows消息,你要看看VCL源代碼,通常隨C++ Builder提供(XE和XE2的入門版除外)。
VCL源位於%CBuilderDir%的\ Sources \ VCL(看我CBuilder5/6)
來源是用Delphi編寫的,但它不會很難找到所有我們需要的。
首先,你必須找到你的目標類的定義。您可以通過整個VCL源代碼目錄與文件的在線搜索看起來像
TMemo = Class
(與TMemo你的例子)
,你發現你的類打開文件,(通常這將是stdctrls.pas或controls.pas - 最有用的組件位於那裏),去與類定義行和滾動一點點,直到找到一組程序,恰似
procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
procedure WMRButtonDown(var Message: TWMRButtonDown); message WM_RBUTTONDOWN;
...等等。這些過程是爲了響應某些消息而調用的,這些消息在過程定義之後提供。
如果一個類有特定消息的過程,那麼它提供了一些響應。
消息處理程序是在delphi中繼承的,所以如果您沒有找到消息的處理程序,則可以查看基類和它們的消息處理程序。要發現完整的類層次結構,只需查看幫助文件,或者再次查看類定義TMemo = class (TCustomMemo)
並從花括號中獲取父類名稱。
然後你可以重複搜索消息處理,直到你達到TObject
:-)
順便說所有父類。簡單搜索我的CBuilder5的VCL源代碼目錄我認爲比沒有VCL組件處理它。
如果您只需要爲特定消息提供特殊交互,而不是嘗試確定某個組件是否具有消息處理程序,則可以簡單地覆蓋組件的WindowProc
方法。 TControl
的所有後代都有這種方法。
此方法處理組件收到的所有消息,您可以在此處添加對其他系統或用戶消息的響應。
void __fastcall TMyForm::NewWndProc(Messages::TMessage &Message)
{
if (Message.Msg == EM_LINESCROLL)
// Do something special for this message
else OldWndProc(Message);
}
,你需要做的唯一一件事情就是維護舊的WindowProc的價值,你做你所有的東西后,它調用NewWndProc。
其更好地定義和分配NewWndProc
和存儲舊WindowProc
爲TMemo在保持你的組件的形式,所以你不需要亂用從TMemo
作出新的遺傳成分。所以,定義形式TWndMethod OldWndProc
,把下面的,例如,在形式上OnCreate()
處理
TWndMethod OldWndProc = MyMemo->WindowProc;
MyMemo->WindowProc = NewWndProc;
您還可以防止預定義的處理程序的射擊,通過不通過某些消息OldWndProc。要小心,如果你防止處理明智的系統消息(如WM_CREATE),你會得到錯誤。
謝謝謝謝你的詳細解答!將來我會發現通過查看VCL的源代碼! –