CB非可視組件的訊息處理技巧

來源:互聯網
上載者:User

    一個非可視的組件必須對Windows作業系統或使用者定義的訊息作出響應。然而,由於一個非可視組件沒有視窗,因此它也沒有視窗控制代碼,自然它也不能接收到訊息,為瞭解決這一問題,我們的思路是建立一個隱藏的視窗,使非可視組件能夠接收到訊息。為了給你的非可視組件建立一個隱藏的視窗,需要有以下:      

         1.一個私人變數型(Private Variable)的HWnd來取得視窗控制代碼。
   2.一個用來捕捉視窗發送給組件的函數(a WndProc)。
   3.對AllcolateHwnd的調用使之建立視窗控制代碼並設定WndProc。
  為了清楚的解釋上述思路和展示建立過程,下面我們將以一個具體的執行個體來說明。
  首先我們先建立一個新的組件,在C++Builder中,選擇FILE|NEW...雙擊元件圖表標顯示一個新的組件對話方塊改變Ancestor Type為Tcomponent和Class name為TTest並設定完畢。   然後,切換到新組件的標頭檔,在類的私人部分(private section)加入以下聲明:   HWnd FHandle;   void—fastcall WndProc(TMessage& Msg);
  第一行聲明了一個調用Fhandle的HWnd變數,這個變數將用於視窗建立後捕獲視窗控制代碼。第二行聲明了一個用於接收訊息的WndProc函數。這個函數的聲明必須加以標識,以便限定它是一個WndProc,然後在類聲明Public(公有)部分構造以下聲明:
  Viod DoIt( );
  這個公有函數將被我們用來測試組件,類聲明應如下:
  class PACKAGE TTest : public TComponent
  {
   private:
           HWnd FHandle;
           void—fastcall WndProc(TMessage& Msg);
   protected:
   public:
           __fastcall TTest(TComponent* Owner);
           void DoIt( );
  __published:
  };
  現在切換到組件的代碼單元,將下面一行加入到單元的頂部(在函數上也許是不錯的地方)   #define MY_Message.WM_USER+1
  這一行聲明了一個在DoIt函數被調用時,組件將發送給它自己的使用者自訂訊息。此時我們必須為組件分配一個視窗控制代碼。這個控制代碼將提供一個隱藏的視窗使我們可以捕捉組件中的訊息。找到組件構造代碼,加入下面代碼:  
    __fastcall Test::Test(TComponent* Owner): TComponent(Owner)
  {
     FHandle=AllocateHWnd(WndProc);
  }
  好,重要的一步已完成,AllocateHWnd函數建立了一個隱藏視窗並且返回它的控制代碼,注意這裡我們為了使Windows知道哪裡發來了訊息,傳遞WndProc的地址;   
    現在我們來建立WndProc的函數部分。在源檔案中加入:
  void—fastcall TTest::WndProc(TMessage& Msg)
  {
   if (Msg.Msg == MY_MESSAGE)
          MessageBox(0, ″Got here!″, ″Message″, 0);
   try {
        Dispatch(&Msg);
   }
   catch (...) {
        Application-〉HandleException(this);
   }
  }
  無論何時Windows發送訊息給組件,Windows都會調用這個函數。這部分程式碼完成了兩件事。首先,它檢查被接收的訊息是否是我們使用者自訂的訊息。如果是,一個訊息框將被顯示,你可以看到實際上我們接收到的訊息。其次,這段代碼傳送了系統(或VCL)處理過程中的訊息,try/catch塊用來保證,如果異常出現,它將成為預設風格下的控制代碼。   概括地說,WndProc函數在為預設控制代碼傳遞所有其他訊息,監控了所有客戶訊息。現在我們建立DoIt函數,完成我們的組件,加入我們建立DoIt函數,完成我們的組件,加入代碼:
  void TTest::DoIt()
  {
     PostMessage(FHandle, MY_MESSAGE, 0, 0);
  }
  這個函數發送一個訊息組件的視窗控制代碼(記住,這個視窗控制代碼是以前存入到Fhandle資料成品中的)。現在我們已經完成了建立組件選擇,用SelectFile|ColseAll來儲存我們的工作測試組件。   下一步將測試組件。如果你使用BCB3,那麼你必須把組件加入到“包”(Packege)中,然後用Componet|install(可以使用DCLSTD35 Packege來快速測試)。再選擇你剛存的TestBCB.Cpp,一旦你安裝完成組件後,它將出現在組件板上。雙擊按鈕,為按鈕的OnClick事件建立以下代碼:
   Test1-〉 DoIt( );
  現在運行程式,當你點擊按鈕時,將看到一個訊息框顯示“Got here/". 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.