为 ShapeLabel 控件添加事件

区分清 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 事件,请按照以下步骤执行:

  1. 在“工程资源管理器”窗口单击“ShapeLabel”,选择它后按下 F7 键或单击“工程资源管理器”窗口工具栏的“代码”按钮来打开“代码”窗口。

  2. 在“对象”框选择“通用”。 在“过程”框选择“声明”以定位到代码模块的顶部。 添加下列代码:
    Option Explicit
    ' 声明一个不带参数的公共 Click 事件。
    Public Event Click()
    
  3. 在“对象”框选择“lblCaption”。 在“过程”框为这个选项卡控件选择 Click event。 把下列代码添加到 lblCaption_Click 事件过程中:
    Private Sub lblCaption_Click()
    ' 无论何时在此选项卡上单击均
    ' 引发 Click 事件。
    RaiseEvent Click
    End Sub
    

    仅当用户单击子控件 lblCaption 时,上述代码才引发 Click 事件。若能够在 ShapeLabel 的椭圆背景的任意处单击,那么看上去显得更自然,所以下一步所示的是单击彩色椭圆时如何引发 Click 事件。

  4. 在“对象”框选择 UserControl。在“过程”框选择 UserControls'MouseUp 事件。 把下列代码添加到 UserControl_MouseUp 事件过程中:
    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 控件”中的“绘制控件”部分讨论关于创建非规则形状控件时透明背景的使用。

  5. 在“工程资源管理器”窗口单击“Form1”以选择它,然后按下 F7 键或单击“工程资源管理器”窗口工具栏的“代码”按钮来打开“代码”窗口。

  6. 在“对象”框选择一个添加到 Form1 中的 ShapeLabel 控件。 在“过程”框选择 Click 事件。

    注意   如果 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 容器自动提供。

  7. 在工具栏单击“启动”按钮或按下 CTRL+F5 键运行 TestCtlDemo。尝试单击窗体和 ShapeLabel 控件的各种位置,以验证只有在椭圆背景内单击时才会引发 Click 事件。

  8. 在 ShapeLabel 的 click 事件的击点检测中有一个微妙错误。要查看这个错误,当鼠标指针在红色椭圆的下半部时按下鼠标键。 保持鼠标键按下,小心地移动鼠标指针,直至箭头的尖端指在 ShapeLabels 标题的白色正文上时再释放鼠标键。 消息框不会出现!

    lblCaption_Click 事件过程不能执行,其原因是 MouseDown 事件在 UserControl 之上出现。 因此当 MouseUp 事件发生时,它会被 UserControl 接收,甚至鼠标已经完全移出了 Form1 时亦如此。

    MouseUp 事件中的击点检测代码是当鼠标键在由 lblCaption 的透明背景所显示的红色背景上释放时工作,而当鼠标键在正文的白色前景颜色上释放时,击点检测代码不工作。(如果在 ShapeLabel 以外释放鼠标键,则 Point 函数返回 -1,因此在某些随机的红色位置上释放鼠标键不会引发 Click 事件。)

    改正这个错误的对象留给读者作为练习。(提示: 把击点检测移到 UserControl 的 Click 事件没有用处,因为当 MouseUp 事件处在不 MouseDown 的对象上时,Click 事件不会引发。)

详细信息 请参见“建立 ActiveX 控件”中的“在控件中添加事件”部分。

步骤

 本主题是演示创建示例性 ActiveX 控件的一系列步骤中的一部分。

请参阅
转到下一步 编译 ControlDemo 部件
从头开始 创建 ActiveX 控件