C++BUILDER非可視組件的消息處理

一個非可視的組件必須對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中調試通過。

CB非可視組件的消息處理技巧
  一個非可視的組件必須對Windows操作系統或用戶定義的消息作出響應。然而,由于一個非可視組件沒有窗口,因此它也沒有窗口句柄,自然它也不能接收到消息,爲了解決這一問題,我們的思路是創建一個隱藏的窗口,使非可...查看完整版>>CB非可視組件的消息處理技巧
 
BCB非可視組件的消息處理技巧
CB非可視組件的消息處理技巧              一個非可視的組件必須對Windows操作系統或用戶定義的消息作出響應。然而,由于一個非可視組件沒有窗口,因此它也沒有窗口句柄,自然它也不能接收到消息,爲了...查看完整版>>BCB非可視組件的消息處理技巧
 
C++BUILDER非可視組件的消息處理技巧
C++BUILDER非可視組件的消息處理技巧  一個非可視的組件必須對Windows操作系統或用戶定義的消息作出響應。然而,由于一個非可視組件沒有窗口,因此它也沒有窗口句柄,自然它也不能接收到消息,爲了解決這一問題,我...查看完整版>>C++BUILDER非可視組件的消息處理技巧
 
正確使用C++Builder組件縮寫代碼
  將資料型態寫在前面有助於以元件分辦你所有要的資料類似于這樣:edtInputBox, mmFile, BTnCalc;下列中左側爲縮寫,右側爲組件名稱。------------------------Standard Tab------------------------mm TMainMe...查看完整版>>正確使用C++Builder組件縮寫代碼
 
C++Builder高手進階 (三)用BCB設計DBTreeView組件(續一)
//DBTreeView詳細設計.CPP文件__fastcall TDBTreeView::TDBTreeView(TComponent* Owner) : TTreeView(Owner){ //在構造函數中對相關數據進行初始化FDataLink = new TFieldDataLink; //建立數據連接類 FPar...查看完整版>>C++Builder高手進階 (三)用BCB設計DBTreeView組件(續一)
 
C++Builder 高手進階 (三)用BCB設計DBTreeView組件
C++Builder 高手進階 前段時間買了本書《C++ Builder深度曆險》,暫且不論這本書寫的如何,但其作者獨特的寫作角度令我折服。于是我就有了個想法,能不能將自己多年從事軟件開發的經驗寫成一系列的文章在CSDN上與大...查看完整版>>C++Builder 高手進階 (三)用BCB設計DBTreeView組件
 
用C++Builder對圖像進行特殊效果處理
  在Windows編程中圖像處理相對比較複雜,好在C++ Builder提供了一些圖形類,它們通過對Windows中的圖形對象進行包裝,從而大大簡化了圖像操作的難度。下面就通過對圖像進行柔化、銳化、浮雕效果等幾個非凡效果處理...查看完整版>>用C++Builder對圖像進行特殊效果處理
 
.NET可複用TCP通信層之消息分派器組件
  上一篇主要講到了Tcp通信層中的核心組件――Tcp組件的實現,Tcp組件是整個通信層的消息驅動源,甚至,...查看完整版>>.NET可複用TCP通信層之消息分派器組件
 
通過CDO組件對NNTP服務器發送消息
class CDOSend{ public void sendMessageBox(){ try { CDO.Message oMsg = new CDO.Message(); CDO.NNTPPostConnectorClass p=new CDO.NNTPPostConnectorClass(); oMsg.From = "xxx@xxx.xxx&qu...查看完整版>>通過CDO組件對NNTP服務器發送消息
 
 
回到王朝網路移動版首頁