重載WndProc、WindowProc、消息映射BEGIN_MESSAGE_MA 轉載

方法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

相關文章
相關標籤/搜索