麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

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

2019-11-17 05:51:16
字體:
來源:轉載
供稿:網友
  一個非可視的組件必須對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中調試通過。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 成人午夜免费在线视频 | 国产高潮好爽好大受不了了 | 91久久久久久久 | 国产精品久久久久久久久久久久久久久久 | 日本在线高清 | 日韩av在线播放一区 | 老司机免费福利午夜入口ae58 | 免费一级毛片在线播放视频 | 成人在线视频在线观看 | 一区二区三区视频在线播放 | 国产一级二级视频 | 成人男女啪啪免费观看网站四虎 | 一级做受毛片免费大片 | 欧美成年性h版影视中文字幕 | 国产成人高清在线观看 | 国产精品久久二区 | 网站激情| 国产成人精品一区二区三区电影 | 91精品国产91热久久久做人人 | 免费毛片小视频 | 免费看真人a一级毛片 | hd性videos意大利复古 | 毛片视频网址 | 宅男噜噜噜66国产在线观看 | 黄视频在线网站 | 操操操日日日干干干 | 久久草草影视免费网 | 免费特黄| 久久国产精品一区 | 欧美日韩在线视频一区 | 视频一区二区三区在线播放 | 国产精品久久久久久久久久妇女 | 毛片一级免费看 | 亚洲第一成人久久网站 | 干一夜综合 | 久久久亚洲欧美综合 | 综合国产一区 | 日本黄色一级电影 | 精品二区在线观看 | 日本在线一区二区 | 日本精品二区 |