国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

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

2019-11-17 05:51:16
字體:
供稿:網(wǎng)友
  一個(gè)非可視的組件必須對Windows操作系統(tǒng)或用戶定義的消息作出響應(yīng)。然而,由于一個(gè)非可視組件沒有窗口,因此它也沒有窗口句柄,自然它也不能接收到消息,為了解決這一問題,我們的思路是創(chuàng)建一個(gè)隱藏的窗口,使非可視組件能夠接收到消息。  為了給你的非可視組件創(chuàng)建一個(gè)隱藏的窗口,需要有以下:   1.一個(gè)私有變量型(PRivate Variable)的HWnd來取得窗口句柄。   2.一個(gè)用來捕捉窗口發(fā)送給組件的函數(shù)(a WndProc)。   3.對AllcolateHwnd的調(diào)用使之創(chuàng)建窗口句柄并設(shè)置WndProc。   為了清楚的解釋上述思路和展示創(chuàng)建過程,下面我們將以一個(gè)具體的實(shí)例來說明。
首先我們先創(chuàng)建一個(gè)新的組件,在C++Builder中,選擇FILE|NEW…雙擊組件圖標(biāo)顯示一個(gè)新的組件對話框改變Ancestor Type為Tcomponent和Class name為Ttest并設(shè)置完畢。
然后,切換到新組件的頭文件,在類的私有部分(private section)加入以下聲明:   HWnd Fhandle;
    void—fastcall WndProc(Tmessage& Msg);   第一行聲明了一個(gè)調(diào)用Fhandle的HWnd變量,這個(gè)變量將用于窗口創(chuàng)建后捕捉窗口句柄。第二行聲明了一個(gè)用于接收消息的WndProc函數(shù)。這個(gè)函數(shù)的聲明必須加以標(biāo)識(shí),以便限定它是一個(gè)WndProc,然后在類聲明Public(公有)部分構(gòu)造以下聲明:   Viod DoIt( );   這個(gè)公有函數(shù)將被我們用來測試組件,類聲明應(yīng)如下:   class PACKAGE Ttest : public     Tcomponent
{
private:    HWnd Fhandle;
void—fastcall WndProc(Tmessage& Msg);    protected:    public:       —fastcall Ttest(Tcomponent* Owner);      void DoIt( );
  
—published:   };   現(xiàn)在切換到組件的代碼單元,將下面一行加入到單元的頂部(在函數(shù)上也許是不錯(cuò)的地方)   #define MY—Message.WM_USER+1   這一行聲明了一個(gè)在DoIt函數(shù)被調(diào)用時(shí),組件將發(fā)送給它自己的用戶自定義消息。此時(shí)我們必須為組件分配一個(gè)窗口句柄。這個(gè)句柄將提供一個(gè)隱藏的窗口使我們可以捕捉組件中的消息。找到組件構(gòu)造代碼,加入下面代碼:   —fastcall Test::Test(Tcomponent* Owner): Tcomponent(Owner)
{
Fhandle=AllocateHWnd(WndProc);
}   好,重要的一步已完成,AllocateHWnd函數(shù)創(chuàng)建了一個(gè)隱藏窗口并且返回它的句柄,注重這里我們?yōu)榱耸筗indows知道哪里發(fā)來了消息,傳遞WndProc的地址;   現(xiàn)在我們來創(chuàng)建WndProc的函數(shù)部分。在源文件中加入:   void—fastcall Ttest::WndProc(Tmessage& Msg)
{
if (Msg.Msg == MY_MESSAGE)
     MessageBox(0, ″Got here!″, ″Message″, 0);
try {
          Dispatch(&Msg);
        }
catch (…) {    application-〉HandleException(this);    }   }   無論何時(shí)Windows發(fā)送消息給組件,Windows都會(huì)調(diào)用這個(gè)函數(shù)。這部分代碼完成了兩件事。首先,它檢查被接收的消息是否是我們用戶自定義的消息。假如是,一個(gè)消息框?qū)⒈伙@示,你可以看到實(shí)際上我們接收到的消息。其次,這段代碼傳送了系統(tǒng)(或VCL)處理過程中的消息,try/catch塊用來保證,假如異常出現(xiàn),它將成為缺省風(fēng)格下的句柄。   概括地說,WndProc函數(shù)在為缺省句柄傳遞所有其他消息,監(jiān)控了所有客戶消息。現(xiàn)在我們創(chuàng)建DoIt函數(shù),完成我們的組件,加入我們創(chuàng)建DoIt函數(shù),完成我們的組件,加入代碼:   void Ttest::DoIt()   {   PostMessage(Fhandle, MY—MESSAGE, 0, 0);   }   這個(gè)函數(shù)發(fā)送一個(gè)消息組件的窗口句柄(記住,這個(gè)窗口句柄是以前存入到Fhandle數(shù)據(jù)成品中的)。現(xiàn)在我們已經(jīng)完成了創(chuàng)建組件選擇,用SelectFile|ColseAll來保存我們的工作測試組件。   下一步將測試組件。假如你使用BCB3,那么你必須把組件加入到“包”(Packege)中,然后用Componet|install(可以使用DCLSTD35 Packege來快速測試)。再選擇你剛存的TestBCB.Cpp,一旦你安裝完成組件后,它將出現(xiàn)在組件板上。雙擊按鈕,為按鈕的OnClick事件創(chuàng)建以下代碼:    Test1-〉 DoIt( );   現(xiàn)在運(yùn)行程序,當(dāng)你點(diǎn)擊按鈕時(shí),將看到一個(gè)消息框顯示“Got here".   ListingA和B包含了頭文件和源代碼以下列出。   總結(jié):一個(gè)可以響應(yīng)Windows消息的非可視組件有許多用途。最顯而易見的就是用來封裝某些方面的WindowsAPI。例如:TAPI和WinSock發(fā)送消息給事件的指定用戶。假如你寫的組件封裝了一個(gè)這樣的API。你將需要捕捉Windows發(fā)送的消息。而在你的組件中加入隱藏窗口將很好的幫你做到這一點(diǎn)。   以上程序在C++ BUILDER 3.0中調(diào)試通過。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 前郭尔| 定安县| 梓潼县| 安远县| 昭平县| 大化| 台安县| 涡阳县| 大姚县| 西林县| 漳浦县| 资溪县| 团风县| 富蕴县| 罗甸县| 竹北市| 伊宁县| 武穴市| 卓资县| 穆棱市| 崇仁县| 罗城| 陆川县| 金华市| 九龙县| 托里县| 兴安盟| 建湖县| 江陵县| 牡丹江市| 页游| 东海县| 新绛县| 通辽市| 梅河口市| 南溪县| 外汇| 从化市| 太湖县| 四会市| 巧家县|