線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1485
推到 Plurk!
推到 Facebook!

[推薦] C++BUILDER非可視組件的消息處理技巧

 
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-07-25 11:35:39 IP:61.218.xxx.xxx 未訂閱
C++BUILDER非可視組件的消息處理技巧    資料來源: http://go5.163.com/yarrows/tips/cbc_02.htm     一個非可視的組件必須對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". ListingA和B包含了頭文件和源代碼以下列出。 總結:一個可以響應Windows消息的非可視組件有許多用途。最顯而易見的就是用來封裝某些方面的WindowsAPI。例如:TAPI和WinSock發送消息給事件的指定用戶。如果你寫的組件封裝了一個這樣的API。你將需要捕捉Windows發送的消息。而在你的組件中加入隱藏窗口將很好的幫你做到這一點。 以上程序在C++ BUILDER 3.0中調試通過。 時間就是金錢---[ 發問前請先找找舊文章] 發表人 - axsoft 於 2002/07/25 11:37:24
系統時間:2024-03-28 20:44:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!