CB非可视组件的动静处理惩罚能力
当前位置:以往代写 > C/C++ 教程 >CB非可视组件的动静处理惩罚能力
2019-06-13

CB非可视组件的动静处理惩罚能力

CB非可视组件的动静处理惩罚能力

副标题#e#

一个非可视的组件必需对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:
    };


#p#副标题#e#

此刻切换到组件的代码单位,将下面一行插手到单位的顶部(在函数上也许是不错的处所)

#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".

总结:一个可以响应Windows动静的非可视组件有很多用途。最显而易见的就是用来封装某些方面的WindowsAPI。譬喻:TAPI和WinSock发送动静给事件的指定用户。假如你写的组件封装了一个这样的API。你将需要捕获Windows发送的动静。而在你的组件中插手埋没窗口将很好的帮你做到这一点。

以上措施在C++ BUILDER 3.0中调试通过。

    关键字:

在线提交作业