方法1、重載WndProc
private: // User declarations
void __fastcall WndProc(Messages::TMessage &Message);
void __fastcall TForm1::WndProc(Messages::TMessage &Message)
{
if (Message.Msg == WM_MOUSEWHEEL && Message.WParam )
{
Caption = Now();
}
TForm::WndProc(Message);
}windows
方法二 、消息映射函數
使用消息映射,通常須要三步:
(1).聲明消息映射表,把某些消息的處理權,交給本身定義的函數
以一個沒有參數的BEGIN_MESSAGE_MAP宏開始,
以END_MESSAGE_MAP宏結束(惟一參數是組件的父類的名字,一般爲TForm)
在中間插入一個或多個MESSAGE_HANDLER宏,其將一個消息句柄和一個消息處理函數聯繫在一塊兒。
MESSAGE_HANDLER(windows消息名,消息結構體名,消息處理函數名)
(2)聲明消息處理函數
函數名稱和參數必須和MESSAGE_HANDLER宏定義的同樣
(3)實現消息處理函數
與通常類函數差很少,只是在最後加上一條語句,完成VCL對消息的默認處理
TForm::Dispatch(&Message);測試
VCL_MESSAGE_HANDLER寫法,是爲了調用ATL時,命名不衝突
class TForm1 : public TForm
{
__published: // IDE-managed Components
TEdit *Edit1;
private: // User declarations
void __fastcall OnEditMouseWell(TMessage &Message);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_MOUSEWHEEL, TMessage, OnEditMouseWell)
END_MESSAGE_MAP(TForm)
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
void __fastcall TForm1::OnEditMouseWell(TMessage &Message)
{
if(String(ActiveControl->ClassName())=="TEdit") //全部的Edit
Caption = Now(); //測試
//TForm::Dispatch(&Msg);
}
方法3、重載WindowProc
void __fastcall OnEditMouseWell(Messages::TMessage &Message); //增長
Classes::TWndMethod OldEdit1WndProc; //增長
void __fastcall TForm1::OnEditMouseWell(Messages::TMessage &Message)
{
if (Message.Msg == WM_MOUSEWHEEL)
{
//::MessageBox(NULL,"OK","Message",0); //測試
Caption = Now();
}
else
OldEdit1WndProc(Message);
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
OldEdit1WndProc=Edit1->WindowProc;
Edit1->WindowProc=OnEditMouseWell;
}spa