2011-10-18 66 views
0

如何找出某一個VCL組件可以接受???/什麼樣的消息VCL接受?/

例如郵件列表,如果我想通過發送消息給它 我滾動Memo1可能會寫下面的代碼行明知備忘錄可以接受EM_LINESCROLL

SendMessage(Memo1->Handle,EM_LINESCROLL,-1,0); 
//Memo1->Perform(EM_SCROLL,SB_LINEUP,0); 
Memo1->Perform(EM_SCROLL,SB_LINEDOWN,0); 

如何查找,以找出是否某些VCL譜曲可以接受或不接受的消息???

回答

5

所有組件接受所有的消息,但如果一個組件沒有分配的消息處理程序,它只是無助

如果你想發現如果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),你會得到錯誤。

+0

謝謝謝謝你的詳細解答!將來我會發現通過查看VCL的源代碼! –

0

TMemo是圍繞標準Win32 API多行EDIT控件的薄包裝。您必須閱讀MSDN文檔以查看EDIT控件本身處理的消息。 TMemo不會直接處理EM_LINESCROLL,但Windows可以。

相關問題