区分清 UserControl 对象(或者它所包含的控件)接收的事件与控件引发的事件这一点非常重要。控件所接收的那些事件提供了做某些感兴趣事情的一些机会,而控件引发的那些事件则为使用该控件的开发者提供了做某些感兴趣事情的一些机会。
图 4.1 所示是当控件的作者使用由 UserControl 对象所接收的事件并且对购买此控件的开发者不引发任何事件时所发生的情况。
图 4.1 一个简单使用事件的 ActiveX 控件
图 4.2所示是当 ControlDemo.ocx 的作者(无疑已厌倦开发者的抱怨)通过引发让开发者响应的 Click 事件改进 ShapeLabel 控件时所发生的事情。
图 4.2 一个引发供开发者使用事件的控件
有许多可能引起 ShapeLabel 控件用户感兴趣的事件。 Visual Basic 的 Label 控件引发一个 Click 事件,而 ShapeLabel 正是一个设想的选项卡,因此下列过程将添加一个 Click 事件。 为了使该事件更有意思,仅当用户单击椭圆背景时才引发。
在控件中加入特定事件的重要原因是出于与相同类型的其它控件兼容。 引发何种事件的其它选择标准可参见“建立 ActiveX 控件”中的“在控件中产生事件”部分。
注意 本主题是演示创建示例性 ActiveX 控件一系列步骤中的一部分。 它是从创建 ActiveX 控件的主题开始。
要为 ShapeLabel 控件添加 Click 事件,请按照以下步骤执行:
Option Explicit '
声明一个不带参数的公共Click
事件。Public Event Click()
Private Sub lblCaption_Click() '
无论何时在此选项卡上单击均'
引发Click
事件。RaiseEvent Click
End Sub
仅当用户单击子控件 lblCaption 时,上述代码才引发 Click 事件。若能够在 ShapeLabel 的椭圆背景的任意处单击,那么看上去显得更自然,所以下一步所示的是单击彩色椭圆时如何引发 Click 事件。
Private Sub UserControl_MouseUp(Button As Integer, _ Shift As Integer, X As Single, Y As Single) '
仅当被单击色点的颜色和' Shape
控件的颜色匹配时才引发
'
一个Click
事件。'
忽略椭圆以外'
的单击。If Point(X, Y) = shpBack.FillColor Then
RaiseEvent Click
End If
End Sub
确定一个事件是否发生在特定的位置称为击点检测。
或许会希望把击点检测代码放在 shpBack_Click 事件过程中,因为 shpBack 总是要改变大小以便覆盖 ShapeLabel 控件的整个表面。 然而 Shape 控件不会接收 Click 事件。而由包含 Shape 对象的对象来接收 Click 事件,就本例来说是 UserControl 对象。
“建立 ActiveX 控件”中的“绘制控件”部分讨论关于创建非规则形状控件时透明背景的使用。
注意 如果 Click 事件没有出现,则应确定 ShapeLabel 设计器是否关闭。
把下列代码添加到 ShapeLabel1_Click 事件过程中:
Private Sub ShapeLabel1_Click()
MsgBox "Thanks for clicking! My caption is: " _
& ShapeLabel1.Caption
End Sub
注意 如果所选的 ShapeLabel 的命名不是 ShapeLabel1 时,那么输入以上代码时应当使用相应的名字。
可单击 Procedure 框上的箭头,查看 ShapeLabel 控件的所有事件。除了 Click 事件之外,还有四个事件:DragDrop,DragOver,GotFocus 和 LostFocus 作为 Click 事件的补充,它们由 Form1 容器自动提供。
lblCaption_Click 事件过程不能执行,其原因是 MouseDown 事件在 UserControl 之上出现。 因此当 MouseUp 事件发生时,它会被 UserControl 接收,甚至鼠标已经完全移出了 Form1 时亦如此。
MouseUp 事件中的击点检测代码是当鼠标键在由 lblCaption 的透明背景所显示的红色背景上释放时工作,而当鼠标键在正文的白色前景颜色上释放时,击点检测代码不工作。(如果在 ShapeLabel 以外释放鼠标键,则 Point 函数返回 -1,因此在某些随机的红色位置上释放鼠标键不会引发 Click 事件。)
改正这个错误的对象留给读者作为练习。(提示: 把击点检测移到 UserControl 的 Click 事件没有用处,因为当 MouseUp 事件处在不 MouseDown 的对象上时,Click 事件不会引发。)
详细信息 请参见“建立 ActiveX 控件”中的“在控件中添加事件”部分。
本主题是演示创建示例性 ActiveX 控件的一系列步骤中的一部分。
到 | 请参阅 |
转到下一步 | 编译 ControlDemo 部件 |
从头开始 | 创建 ActiveX 控件 |