网上第一本以TXT格式的VC++深入详解孙鑫的书.全文全以TXT格式,并每一章节都分了目录,清晰易读
源代码在线查看: 18.4 事件-18.4.1 标准事件.txt
18.4 事件
ActiveX控件有两种事件:标准事件和自定义事件。
18.4.1 标准事件
在VC++中,如果想要为Clock控件添加一个事件,可以利用ClassWizard来完成。首先打开ClassWizard对话框,并打开它的ActiveXEvents选项卡,在此选项卡上,确保Class name组合框中选择的是CClockCtrl。然后单击【Add Event】按钮,将显示添加事件对话框,在此对话框上有一个名称为Extemalname的组合框,当单击其右边向下的箭头时,将会看到该列表框中列出了一些预先准备好的事件(如图 18.41所示),即MFC提供的一些标准的事件,例如 Click事件。这里,我们先为 Clock控件增加一个标准事件,也就是一个Stock事件。在Extemalname下拉列表中选择Click,保持默认的Stock选项不变,然后
单击【OK】按钮关闭 Add Event对话框,井单击 ClassWizard对话框上的 【 OK】按钮,关
闭该对话框。
i[!i!llrz;m 咽. ~..!
TI田...........: Clldr: OblClldc Enor KeyOown U.
k町响e..
.
图 18.41添加事件对话框
这时,在ClassView选项卡中可以看到,在 DClockEvents接口下面增加了一个方法: Click,该方法就是刚刚添加的 Click事件。为什么添加的事件增加到一DClockEvents接口中,而没有放到-DClock接口中呢?读者可以在Clock.odl文件的最后看到下面例 18-14所示这段代码。
~IJ 18-14
// Class information for CClockCtrl
[ uuid(工BEEF2EO-6D34-4A57-A5AC-38408A8F0753) ,
helpstring("Clock Control ") , control 1
"‘ I 685
ActiveX搜佯
第 18
coclass Clock
[default] dispinterface _DClock;
[default, source] dispinterface _DClockEvents;
在如例 18-14所示代码中,可以看到在说明一DClockEvents接口时,其前面有一个 "source"标识,而 DClock接口前面并没有此标识。 " source"标识表明 DClockEvents接口是一个源接口。源接口表示控件将使用这个接口来发送通知事件,这个接口不是控件本身实现的接口。前面已经提过,作为利用接口进行通信的双方,肯定是一方调用接口所暴露出来的方法,另一方实现该接口所提供的方法。我们现在所实现的 Clock控件正是调用一DClockEvents接口提供的方法,向容器发出事件通知。既然是控件使用 DClockEvents接口提供的方法,那么谁负责实现这个方法呢?实际上, _DClockEvents接口中的方法是由容器实现的。容器通过一种机制知道控件中定义了一个源接口,于是它就实现该接口。对于 VB这一容器来说,它提供的接口方法实现就是调用某个窗体过程。程序员可以在这个窗体过程中,编写对事件进行响应的代码。这里,读者可能会有这样的疑问,为什么容器实现的接口由控件定义呢?一方面,对于每个控件来说,它可以有自己的事件接口,而容器是无法预先知道控件将使用哪一个事件接口发出通知,因此我们在编写控件的同时指定事件接口,井将其标识为源接口。另一方面,接口由谁来定义是无所谓的,例如,主板与显卡进行通信,那么是由主板厂商去定义接口,还是由显卡产商去定义接口,或者他们一起来定义接口,这都是一样的,关键是通信的双方能够遵照同一个接口进行通信就可以了。
现在,我们已经为 Clock控件增加了一个标准事件: Click,再次利用 ActiveX Control Test Container容器测试该控件。当插入 Clock控件后,在此控件上单击鼠标左键,这时,在该容器下面的窗口中可以看到这样一句话: Clock Control: Click,即触发了 Clock控件的 Click事件,如图 18.42所示。
'
:19:12:15
图 18.42单击 C 10ck控件后触发了该控件的 C 1ick事件
还可以在 VB中测试 Clock控件,打开 VBTest测试程序,用鼠标双击窗体上的 Clock控件,这时 VB将自动添加一个过程: Clockl_Click,这是因为已经为 Clock控件增加了 Click事件,所以当双击该控件时, VB将默认为此事件创建一个过程。在此过程中,我们利用 MessageBox显示一条信息 :"control is clicked"。代码如例 18-15所示。
详
肌灿
,
锣tl18-15
Private Sub Clockl_Click(} MsgBox "control is cl工cked " End Sub
1监j 然后,在 VB环境中运行当前程序,当在 Clock控件C田"trcllsckked 上单击鼠标左键时,将显示如图 18 .4 3所示的对话框。这是因为当在 Clock控件上单击鼠标左键时,该控件接收到E重3该单击消息,于是它就利用 DClockEvents接口中的方法
一..
图 1 8.43 VB容器程序对 Clock控( I1PClick方法〉向容器(即 VB的 Form窗体)发出事件
件的 Click事件的响应通知,因为 DCloc kEvents这个源接口是容器实现的,相
当于控件调用了容器的 Click方法,而容器将调用窗体过 程: ClockLClick,所以显示如图 18 .43所示的信息框。这就是在 VB容器程序中响应控件事件的工作原理。