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中调试通过。