VB如何制作控件?

解决方案 »

  1.   

    显露子控件的事件
    显露事件的机制不同于用来显露属性和方法的委派。通过产生制作者的事件,可以显露子控件中的事件,请参阅 UserControl 代码模块中的这段代码:'控件的 Click 事件声明。
    Public Event Click()'当 txtBase 文本框产生 Click 时,
    '   控件通过产生前面声明的 Click 事件,
    '   将其转发。
    Private Sub txtBase_Click()
       RaiseEvent Click
    End Sub'当用户单击 UserControl 对象时,
    '   也可能希望产生自己的 Click 事件。
    Private Sub UserControl_Click()
       RaiseEvent Click
    End Sub注意 Click 事件会从代码中多个地方产生。在产生 Click 事件之前和之后可以添加自己的代码。事件与属性、方法的区别
    将属性和方法认为是向内的,而事件是向外的,对于了解它们可能会有帮助。也就是说,方法是由使用控件的开发者从控件的外面调用的。这样,开发者调用了 UserControl 对象的方法,而制作者以委派子控件的方法进行响应。与此相反,事件是从控件内部产生,并向外传播到开发者,以便能够执行事件过程中的代码。这样,UserControl 对象产生的 Click 事件来响应来自其子控件的单击事件,从而将该事件向外转发到开发者。鼠标事件和转换坐标
     UserControl 对象的MouseDown、 MouseMove 和 MouseUp 事件进程具有在 UserControl 的 ScaleMode 中为事件定位的参数。在发生控件的MouseDown、 MouseMove 和 MouseUp 事件之前,必须将事件的位置转换成容器的坐标。怎样才能知道容器的 ScaleMode 是什么呢?您不会知道的。您甚至不会知道容器是否有 ScaleMode 属性。但不必担忧,因为 Visual Basic 提供了转换坐标的 ScaleX 和 ScaleY 方法。以下代码段说明如何暴露来自 UserControl 的 MouseMove 事件,而且, UserControl 的 ScaleMode 是 Twips。这里假定已用正确参数声明了 MouseMove 事件(可用 “ActiveX 控件接口向导”生成事件声明)。Private Sub UserControl_MouseMove(Button As Integer, _
          Shift As Integer, X As Single, Y As Single)    RaiseEvent MouseMove(Button, Shift, _
          ScaleX(X, vbTwips, vbContainerPosition), _
          ScaleY(Y, vbTwips, vbContainerPosition))
    End SubScaleX 方法从 vbTwips 转换到容器的任何坐标系;Visual Basic 使用低层次的 ActiveX 调用获得这一信息。从 ScaleX 返回的值(新的 X 坐标)被当作 MouseMove 事件的 X 参数传递。如果在运行时改变您的 UserControl 的 ScaleMode ,则应在以上代码中用 UserControl.ScaleMode 代替 vbTwips ,使不管当前的 ScaleMode 设置是什么,都可正确进行转换。测试的重要性
    如果在设计时永远改变 UserControl 的 ScaleMode ,则也必将改变以上具有显式 vbTwips 的代码。测试控件对鼠标在具有各种 ScaleMode 设置的窗体上的移动是重要的,以保证 ScaleX 和 ScaleY 有正确的参数。子控件
    如果您的控件包含具有鼠标事件的子控件,则必须也要在此引发控件的鼠标事件。否则在控件上将会出现死点,在这里,鼠标事件不会发生。子控件鼠标事件要稍复杂些,因为他们要提供子控件的 X 和 Y 坐标 而不是 UserControl 的坐标。以下代码段说明在子控件和 UserControl 具有相同的 ScaleMode 时如何处理这种情况:Private Sub Label1_MouseMove(Button As Integer, _
          Shift As Integer, X As Single, Y As Single)    RaiseEvent MouseMove(Button, Shift, _
          ScaleX(X + Label1.Left, _
             vbTwips, vbContainerPosition), _
          ScaleY(Y + Label1.Top, _
             vbTwips, vbContainerPosition))
    End Sub将 Label1 的 Left 和 Top 属性添加到 X 和 Y 坐标上就将它们转换成 UserControl 的坐标;然后,ScaleX 和 ScaleY 将结果转换成容器坐标。如果将 UserControl 的 ScaleMode 设置成 Pixels,则在将结果添加到 Label1.Top 和 Label1.Left 之前,先要调用 ScaleX 和 ScaleY 将 X 和 Y 转换成象素。如上所述,添加的结果就被传递到 ScaleX 和 ScaleY。确定位置的其它事件
    如果创建自己的将定位信息传递到容器的事件,则必须使用相同的技术将位置转换成容器的坐标。在调用 ScaleX 和 ScaleY 时,如果想要传递宽度和高度信息,则请用 vbContainerSize 代替 vbContainerPosition。使用 ActiveX 控件接口向导
    “ActiveX 控件接口向导”可以极大地简化转发事件的工作。关于内容请参阅相关主题“控件应该产生的事件”。
      

  2.   

    建立 ActiveX 控件
    本章将深入讨论控件的创建。大部分的主题按照“创建一个 ActiveX 控件”后面的“重述创建控件的步骤”中描述的控件开发任务的顺序进行组织。首先介绍的内容,也是最重要的内容,是控件创建的术语和概念,这些内容包含在如下主题中:“控件创建术语”、“控件创建基础”和“与容器交互作用”。然后,介绍与开发任务有关的主题: 确定控件需要提供的功能。
    “Visual Basic ActiveX 控件功能”
    设计控件的外观。
    “绘制控件”
    设计控件的接口,即控件显示出来的属性、方法和事件。
    “在控件中添加属性”、“在控件中添加方法”、“从控件中产生事件”和“为控件提供命名的常数”。
    创建一个工程组,包含控件工程和一个测试工程。