訊息處理:利用控制元件的動態派生[RunTime],為控制元件新增該控制元件未定義的訊息對映 (轉)

worldblog發表於2007-12-11
訊息處理:利用控制元件的動態派生[RunTime],為控制元件新增該控制元件未定義的訊息對映 (轉)[@more@]

問題:以TPageControl為例,中需要“滑鼠左鍵雙擊”關閉某啟用頁[如]。
  因該沒有定義滑鼠雙擊事件,只有自己為該控制元件新增訊息對映。對映的訊息為:
  左鍵雙擊(WM_LBUTTONLCLK)。本文利用執行時間派生控制元件的方法實現,較自己
  製作一個單獨控制元件的方法來講,這個更簡單些。

// ---------單元頭------------------------------------------------------
class TPageControlEx : public TPageControl
{  // TPageControl的公有派生類:增加了左鍵雙擊訊息對映
 protected:
  void __fastcall OnLeftDbClick(TMessage &Msg);
  BEGIN_MESSAGE_MAP
  VCL_MESSAGE_HANDLER(WM_LBUTTONDBLCLK,TMessage,OnLeftDbClick)
  END_MESSAGE_MAP(TPageControl)

 public: // 內聯構造:父類構造
  inline __fastcall TPageControlEx(TComponent* Owner):TPageControl(Owner){ };
};
// -----------------------------------------------------------------
class TForm1 : public TForm
{
 __published: 
  void __fastcall FormCreate(T *Sender);
 private:
 public:
  __fastcall TForm1(TComponent* Owner);
  TPageControlEx *PageControlEx;
};
// --------單元檔案---------------------------------------------------------------
void __fastcall TPageControlEx::OnLeftDbClick(TMessage &Msg) // 派生類訊息處理
{
 AnsiString area=Form1->PageControlEx->ActivePage->Caption;
 ShowMessage("收到左鍵雙擊訊息n雙擊區域:"+area); 
 // PageControl接受訊息的區域:Tab按鈕矩形區,無須再判斷了!
}
// --------------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 PageControlEx = new TPageControlEx(this);
  PageControlEx->Parent=Form1;
  PageControlEx->Align=alClient;
 // -------------生成2個TabSheet實驗一下------------------------
 TTabSheet* newTabSheet = NULL;
 newTabSheet = new TTabSheet(this);
  newTabSheet->PageControl=PageControlEx;
  newTabSheet->Caption="TabSheet1";
 newTabSheet = new TTabSheet(this);
  newTabSheet->PageControl=PageControlEx;
  newTabSheet->Caption="TabSheet2";
}
// --------------------------------------------------------------------------


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991450/,如需轉載,請註明出處,否則將追究法律責任。

相關文章