VB如何制作控件? VB如何制作控件? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 显露子控件的事件显露事件的机制不同于用来显露属性和方法的委派。通过产生制作者的事件,可以显露子控件中的事件,请参阅 UserControl 代码模块中的这段代码:'控件的 Click 事件声明。Public Event Click()'当 txtBase 文本框产生 Click 时,' 控件通过产生前面声明的 Click 事件,' 将其转发。Private Sub txtBase_Click() RaiseEvent ClickEnd Sub'当用户单击 UserControl 对象时,' 也可能希望产生自己的 Click 事件。Private Sub UserControl_Click() RaiseEvent ClickEnd 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 控件接口向导”可以极大地简化转发事件的工作。关于内容请参阅相关主题“控件应该产生的事件”。 建立 ActiveX 控件本章将深入讨论控件的创建。大部分的主题按照“创建一个 ActiveX 控件”后面的“重述创建控件的步骤”中描述的控件开发任务的顺序进行组织。首先介绍的内容,也是最重要的内容,是控件创建的术语和概念,这些内容包含在如下主题中:“控件创建术语”、“控件创建基础”和“与容器交互作用”。然后,介绍与开发任务有关的主题: 确定控件需要提供的功能。“Visual Basic ActiveX 控件功能”设计控件的外观。“绘制控件”设计控件的接口,即控件显示出来的属性、方法和事件。“在控件中添加属性”、“在控件中添加方法”、“从控件中产生事件”和“为控件提供命名的常数”。创建一个工程组,包含控件工程和一个测试工程。 在VB中,如何实现网址和邮箱链接? 怎么实现一个小球的运动? 各位朋友,我有一个问题,请教大家一下,请大家多多指教!!!再线等候 在线的朋友帮帮!!! 请问567缇为什么会大于1厘米,1逻辑厘米是什么概念? 又是关于msflexgrid,快头疼死了,求求大伙了 高手救命!!! 程序无法完全退出 求教一个关于关于制作安装文件的简单问题。 为什么我的程序在WIN 98中运行正常,而在2000中却不正常呢? EXCEL对象的问题---------------帮帮忙啦!!!!!! 难题:如何方便的制做动态ToolTipText?(即鼠标移动过去出现动态提示文本)
显露事件的机制不同于用来显露属性和方法的委派。通过产生制作者的事件,可以显露子控件中的事件,请参阅 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 控件接口向导”可以极大地简化转发事件的工作。关于内容请参阅相关主题“控件应该产生的事件”。
本章将深入讨论控件的创建。大部分的主题按照“创建一个 ActiveX 控件”后面的“重述创建控件的步骤”中描述的控件开发任务的顺序进行组织。首先介绍的内容,也是最重要的内容,是控件创建的术语和概念,这些内容包含在如下主题中:“控件创建术语”、“控件创建基础”和“与容器交互作用”。然后,介绍与开发任务有关的主题: 确定控件需要提供的功能。
“Visual Basic ActiveX 控件功能”
设计控件的外观。
“绘制控件”
设计控件的接口,即控件显示出来的属性、方法和事件。
“在控件中添加属性”、“在控件中添加方法”、“从控件中产生事件”和“为控件提供命名的常数”。
创建一个工程组,包含控件工程和一个测试工程。