全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1090
推到 Plurk!
推到 Facebook!

如何攔截繼承來的元件之message?

尚未結案
cc12345
一般會員


發表:32
回覆:35
積分:13
註冊:2005-01-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-14 16:39:09 IP:61.219.xxx.xxx 未訂閱
假設我現有一個TMyPanel, 是繼承自TPanel, 接著在Form裡動態產生一個TMyPanel物件: m_pMyPanel = new TMyPanel( this ); 請問我該如何在TMyPanel裡攔截並處理MouseDown的Message? 謝謝
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-14 17:21:37 IP:210.68.xxx.xxx 未訂閱
您好: 
在.h中加入
private:        // User declarations
        TWndMethod OldPanelWndProc; 
        void __fastcall MyPanelWndProc(TMessage& Message);      在.cpp中加入
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
   m_pMyPanel = new TMyPanel(this);
   m_pMyPanel->Parent=Form1;
   m_pMyPanel->Top=10;
   m_pMyPanel->Left=10;
   OldPanelWndProc = m_pMyPanel->WindowProc;
   m_pMyPanel->WindowProc = MyPanelWndProc;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MyPanelWndProc(TMessage& Message)
{
   if (Message.Msg == WM_LBUTTONDOWN)
      ShowMessage("Mouse Down!");
    else
       OldPanelWndProc(Message);
}
//---------------------------------------------------------------------------
順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
cc12345
一般會員


發表:32
回覆:35
積分:13
註冊:2005-01-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-15 14:51:34 IP:61.219.xxx.xxx 未訂閱
謝謝版主, 這樣可以動,  不過我原先的想法是以為, 可否在TMyPanel裡頭自己加入攔截Message的能力, 然後寫自己的event handler來處理, 而不是靠parent來的訊息加以判斷?! 另外, 我嘗試加入WM_PAINT,    if( Message.Msg == WM_LBUTTONDOWN )      ShowMessage("Mouse Down!"); else if( Message.Msg == WM_PAINT )      // ask panel to draw some text else      OldPanelWndProc(Message);    結果似乎是一直不斷收到WM_PAINT, 造成draw 出來的text不斷的閃動... 還是一樣的問題, 是否可在元件自己內部攔截並處理WM_PAINT( any message )?    謝謝 !!        
引言: 您好:
在.h中加入
private:        // User declarations
        TWndMethod OldPanelWndProc; 
        void __fastcall MyPanelWndProc(TMessage& Message);      在.cpp中加入
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
   m_pMyPanel = new TMyPanel(this);
   m_pMyPanel->Parent=Form1;
   m_pMyPanel->Top=10;
   m_pMyPanel->Left=10;
   OldPanelWndProc = m_pMyPanel->WindowProc;
   m_pMyPanel->WindowProc = MyPanelWndProc;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MyPanelWndProc(TMessage& Message)
{
   if (Message.Msg == WM_LBUTTONDOWN)
      ShowMessage("Mouse Down!");
    else
       OldPanelWndProc(Message);
}
//---------------------------------------------------------------------------
順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~ < face="Verdana, Arial, Helvetica">
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-15 15:26:33 IP:210.68.xxx.xxx 未訂閱
您好: 我照您所說的方式 ask panel to draw some text,但是沒有閃動的現象耶 BCB6.0, Win2000  
 
   if (Message.Msg ==  WM_LBUTTONDOWN)
    {
       ShowMessage("Mouse Down!");
    }        else if( Message.Msg == WM_PAINT )
    {
       test->Canvas->TextOutA(10, 10, "123");
    }
    else
      OldPanelWndProc(Message);
順心
cc12345
一般會員


發表:32
回覆:35
積分:13
註冊:2005-01-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-02-15 16:58:22 IP:61.219.xxx.xxx 未訂閱
您好, 可是我有許多個Panel都內含一些資料,並且提供一個ReDraw()的function來做重畫的動作,如果寫成 if( Message.Msg == WM_PAINT ) {   m_Panel1->ReDraw();   m_Panel2->ReDraw();   m_Panel3->ReDraw();   m_Panel4->ReDraw();   .   .   . } 會不會很奇怪? 所以我才想讓那些Panel自已來處理OnPaint()... VC好像都是這樣做的?!    
引言: 您好: 我照您所說的方式 ask panel to draw some text,但是沒有閃動的現象耶 BCB6.0, Win2000
 
   if (Message.Msg ==  WM_LBUTTONDOWN)
    {
       ShowMessage("Mouse Down!");
    }        else if( Message.Msg == WM_PAINT )
    {
       test->Canvas->TextOutA(10, 10, "123");
    }
    else
      OldPanelWndProc(Message);
順心 < face="Verdana, Arial, Helvetica">
系統時間:2024-05-12 9:53:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!