📄 18.4.2 自定义事件.txt
字号:
18.4.2 自定义事件
在 VC I I中,为了给 ActiveX控件增加自定义事件,同样可以利用 ClassWizard来完成,与上面添加标准事件的过程是一样的。另外,也可以在工程的 ClassView选项卡上,用鼠标右键单击 DClockEvents接口,井从弹出的快捷菜单中选择【 Add Event..】菜单项,从而也可以打开添加事件对话框。利用该对话框,我们为 Clock控件增加一个自定义的事件,将新添加的这个事件的外部名称设置为: NewMinute,系统将自动将该事件的内部名称设置为: FireNewMinute,结果如图 18.44所示。
MIUl'...J刑 1寸1if,,cJi4…·凶基j
…EF 3 巳」
旦旦」
ft?石平]
图 18.44为 Clock控件增加一个自定义的事件
单击【OK】按钮关闭添加事件对话框,并单击 ClassWizard对话框上的【OK】按钮关闭该对话框。这时,在 ClassView选项卡中,可以看到 DClockEvents接口下又增加了一个方法: NewMinute,并且在 CClockCtrl类中增加了一个 FireNewMinute方法。这样,在控件内部,就可以调用 FireNewMinute方法向容器发出事件通知,而在此方法内部,它会调用 DClockEvents接口中的 NewMinute方法向容器发出事件通知。自动生成的 FireNewMinute方法的实现代码如例 18-16所示。
" ‘ I 687
第 18章 ActlveX撞件
19IJ 18-16
11 Event maps 11 {{AFX_EVENT(CClockCtrl) void FireNewMinute()
{FireEvent(eventidNewMinute, EVENT_PARAM(VTS_NONE)) ;} II }}AFX_EVENT DECLARE_EVENT_MAP()
对于上面添加的 Click事件来说,因为它是 MFC提供的一个标准事件,它的触发过程被底层屏蔽了,所以我们没有看到。而对于自定义的事件来说,必须在某个条件到来时,显式地调用某个函数发出该事件通知。本例中,我们可以在新的一分钟到达时,发出 NewMinute事件通知。因此,在上述 18-5所示 CClockCtrl类 OnDraw函数中,在调用 GetCurrentTirne函数得到当前系统时间之后,添加下述代码:
if(O==time.GetSecond())
FireNewMinute() ;
也就是说,在得到当前系统时间之后,首先应对秒数进行判断,如果秒数为 0,即到达了新的一分钟,就调用 FireNewMinute方法,向容器发出 NewMinute事件通知。而 NewMinute事件是由容器实现的。对于 VB这一容器来说,这时它将调用某个事先己指定的窗体过程。
我们先利用 Build命令生成最新的 Clock控件,然后在 VB容器中测试该控件。打开已有的 VBTest测试程序,接着双击窗体上的 Clock控件,即可进入代码编辑窗口,在事件下拉列表中可以看到该控件多了一个事件: NewMinute。选择该事件, VB将自动为该事件生成一个过程: Clockl_NewMinute,为了简单起见,我们在此过程中只调用 MessageBox语旬,显示一则信息: "new minute"。代码如例 18-17所示。
例 18-17
Pr ivate Sub Cl ockl_NewMinute() MsgBox "new minute"
End Sub
在 VB环境中运行当前程序,将会看到当 Clock控件显示的时间到达新的一分钟时,该程序就会显示一个如图 18 .45所示的信息框。这是因为当新的一分钟到来时, Clock控件就会调用 FireNewMinute方法,向容器发出 NewMinute事件。而容器接收到这一事件后,就去调用窗体过程: Clockl_NewMinute,从而显示了如图 18 .45所示的信息框。
阳帽"帆阳
图 18.45 VB容器程序对 Clock控件的 NewMinute事件的响应
688 I ~~~
同样,也可以用 ActiveX Control Test Container容器中测试该控件。当插入该控件后,可以看到当该控件上显示的时间一旦到达新的一分钟时,该容器下面的窗口中就会显示这样一句话: Clock Control: NewMinute,即触发了一个NewMinute事件。如图 18.46所示。
4‘
图 18.46 ActiveX Control Test Container容器对Clock控件的NewMinute事件的响应
到此为止,我们为 Clock控件添加了一个标准事件: Click,和一个自定义事件: NewMinute。读者一定要注意,对标准事件来说,其触发过程由 MFC底层实现。但对自定义事件来说,必须要在某个条件到来时,在代码中显式地调用某个函数发出该事件通知。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -