教你如何用VB做控件*.ocx
一个控件有很多事件如:Click、MouseDown、MouseUp、MouseMove等。要触发这些事件都需要你加入代码。在控件的声明处加入Public Event Click()就表明该控件有一“Click”事件。自己编写的控件有什么事件就在声明处加几条事件
如今OCX控件在编程中已占领了很重要的地位,我们可以利用OCX控件完成一些相当复杂的编程操作.同时OCX 控件还有利于主程序的简单化、功能的重用、隐常程序实现细节、便于升级、传播方便等优点。现在我们可以利用VB 5.0方便的制作出自己的OCX控件供我们在编程中使用同时还可以把它送给你周围喜欢编程的朋友!
下面列出制作OCX控件的步骤:
一:新建OCX 打开VB 5.0选择新建工程在对话框中选择ActiveX 控件(如图一(map1.gif))打开后会见一空的文档这就是 OCX控件的初始界面。想看一看空OCX控件的效果吗?选择“添加工程”选中标准EXE,这时你就可以像调用其它控件一样在左边的工具栏里选择刚才新建的OCX控件图标放在标准的EXE文档中看一看有什么效果!(什么也没有!) 自然因为刚才的OCX文档是空的嘛(废话太多,数个痰盂向我飞来)!
二:创建界面
一般我们用VB创建OCX控件都是在我们的控件里添加其它的控件来组合成一个完整的控件(也可以让它只完成某种算法)比如:你可以在上面添加一按钮、编辑框这时你再用第一部的方法看一看效果,是不是控件上多了一个按钮和一个编辑框。
三:OCX属性
一个OCX控件有许多的属性,比如控件背景是否透明(BackStyle),控件是否可以获得焦点 (CanGetFocus)等。这些属性都可以在控件的“属性框”中找到。
四:添加事件
一个控件有很多事件如:Click、MouseDown、MouseUp、MouseMove等。要触发这些事件都需要你加入代码。在控件的声明处加入Public Event Click()就表明该控件有一“Click”事件。自己编写的控件有什么事件就在声明处加几条事件。关于触发事件是使用“RaiseEvent”语句来完成的如:RaiseEvent 事件名(参数)。
五:用户属性
一个控件应有许多属性供用户设置如:控件的背景色、控件要显示的图形等。它们通常用Property Get和 Property Let两条语句来完成。前者表示给用户显示一个属性的值,后者表示用户设置一个属性的值。
六:保存属性和读取属性
当属性被用户更改后需要将该属性值保存,以便控件运行时读取更改后的属性值。它们分别用 ReadProperty和WriteProperty两种方法来完成。前者表示读取一个属性值,后者表示写入一个属性值。
好了一个简单的OCX控件制作方法大概就需要以上几步就可完成。下面本人将编写一个简单的OCX控件供大家参考。此控件的功能是在控件中显示一个圆,当鼠标移到控件上的时候控件上的圆便会在鼠标不离开控件的前提下跟随鼠标移动。
新建一OCX控件,将控件的BorderStyle属性改为1,再加入一SHAPE控件将其形状改为Circle(如图二(map2.gif)) 添加以下代码:
@H_404_29@ Public @H_404_29@ Event Click() 注释:定义该控件要产生的事件 Dim @H_404_29@ CircleX As @H_404_29@ Integer @H_404_29@,CircleY As @H_404_29@ Integer @H_404_29@ Private @H_404_29@ Sub @H_404_29@ UserControl_Click() RaiseEvent Click 注释:触发Click事件 End Sub @H_404_29@ Private @H_404_29@ Sub @H_404_29@ UserControl_Initialize() CircleX @H_404_29@= @H_404_29@ Shape1.Width @H_404_29@/ @H_404_29@ @H_404_29@2 @H_404_29@ CircleY @H_404_29@= @H_404_29@ Shape1.Height @H_404_29@/ @H_404_29@ @H_404_29@2 @H_404_29@ End Sub @H_404_29@ Private @H_404_29@ Sub @H_404_29@ UserControl_MouseDown(Button As @H_404_29@ Integer @H_404_29@,Shift As @H_404_29@ Integer @H_404_29@,X As @H_404_29@ Single @H_404_29@,Y As @H_404_29@ Single @H_404_29@) Shape1.BackColor @H_404_29@= @H_404_29@ RGB @H_404_29@( @H_404_29@0 @H_404_29@, @H_404_29@0 @H_404_29@, @H_404_29@255 @H_404_29@) End Sub @H_404_29@ Private @H_404_29@ Sub @H_404_29@ UserControl_MouseMove(Button As @H_404_29@ Integer @H_404_29@,Y As @H_404_29@ Single @H_404_29@) Dim @H_404_29@ MoveX As @H_404_29@ Integer @H_404_29@,MoveY As @H_404_29@ Integer @H_404_29@ MoveX @H_404_29@= @H_404_29@ X @H_404_29@- @H_404_29@ Shape1.Width @H_404_29@/ @H_404_29@ @H_404_29@2 @H_404_29@ MoveY @H_404_29@= @H_404_29@ Y @H_404_29@- @H_404_29@ Shape1.Height @H_404_29@/ @H_404_29@ @H_404_29@2 @H_404_29@ If @H_404_29@ (MoveX @H_404_29@< @H_404_29@ @H_404_29@0 @H_404_29@) Or @H_404_29@ (MoveX @H_404_29@+ @H_404_29@ Shape1.Width @H_404_29@> @H_404_29@ UserControl.ScaleWidth) Or @H_404_29@ _ (MoveY @H_404_29@< @H_404_29@ @H_404_29@0 @H_404_29@) Or @H_404_29@ (MoveY @H_404_29@+ @H_404_29@ Shape1.Height @H_404_29@> @H_404_29@ UserControl.ScaleHeight) Then @H_404_29@ Exit @H_404_29@ Sub @H_404_29@ Shape1.Move MoveX,MoveY End Sub @H_404_29@ Private @H_404_29@ Sub @H_404_29@ UserControl_MouseUp(Button As @H_404_29@ Integer @H_404_29@,Y As @H_404_29@ Single @H_404_29@) Shape1.BackColor @H_404_29@= @H_404_29@ RGB @H_404_29@( @H_404_29@255 @H_404_29@, @H_404_29@0 @H_404_29@) End Sub @H_404_29@ Property @H_404_29@ Get @H_404_29@ PosX() As @H_404_29@ Integer @H_404_29@ 注释:取得CircleX的值显示给用户 PosX @H_404_29@= @H_404_29@ CircleX End Property @H_404_29@ Property @H_404_29@ Let @H_404_29@ PosX(ByVal New_X As @H_404_29@ Integer @H_404_29@) 注释:把用户写入的值设置到OCX控件内部 If @H_404_29@ (New_X @H_404_29@< @H_404_29@ Shape1.Width @H_404_29@/ @H_404_29@ @H_404_29@2 @H_404_29@) Or @H_404_29@ _ (New_X @H_404_29@> @H_404_29@ UserControl.ScaleWidth @H_404_29@- @H_404_29@ Shape1.Width @H_404_29@/ @H_404_29@ @H_404_29@2 @H_404_29@) Then @H_404_29@ MsgBox ( @H_404_29@" @H_404_29@圆的X值超出界限了 @H_404_29@" @H_404_29@) Else @H_404_29@ CircleX @H_404_29@= @H_404_29@ New_X Call @H_404_29@ UserControl_Resize End @H_404_29@ If @H_404_29@ End Property @H_404_29@ Property @H_404_29@ Get @H_404_29@ PosY() As @H_404_29@ Integer @H_404_29@ PosY @H_404_29@= @H_404_29@ CircleY End Property @H_404_29@ Property @H_404_29@ Let @H_404_29@ PosY(ByVal New_Y As @H_404_29@ Integer @H_404_29@) If @H_404_29@ (New_Y @H_404_29@< @H_404_29@ Shape1.Height @H_404_29@/ @H_404_29@ @H_404_29@2 @H_404_29@) Or @H_404_29@ _ (New_Y @H_404_29@> @H_404_29@ UserControl.ScaleHeight @H_404_29@- @H_404_29@ Shape1.Height @H_404_29@/ @H_404_29@ @H_404_29@2 @H_404_29@) Then @H_404_29@ MsgBox ( @H_404_29@" @H_404_29@圆的Y值超出界限了 @H_404_29@" @H_404_29@) Else @H_404_29@ CircleY @H_404_29@= @H_404_29@ New_Y Call @H_404_29@ UserControl_Resize End @H_404_29@ If @H_404_29@ End Property @H_404_29@ Private @H_404_29@ Sub @H_404_29@ UserControl_ReadProperties(PropBag As @H_404_29@ PropertyBag) CircleX @H_404_29@= @H_404_29@ PropBag.ReadProperty( @H_404_29@" @H_404_29@CircleX @H_404_29@" @H_404_29@,Shape1.Width @H_404_29@/ @H_404_29@ @H_404_29@2 @H_404_29@) 注释:将用户设置的值读出来 CircleY @H_404_29@= @H_404_29@ PropBag.ReadProperty( @H_404_29@" @H_404_29@CircleY @H_404_29@" @H_404_29@,Shape1.Height @H_404_29@/ @H_404_29@ @H_404_29@2 @H_404_29@) 注释:同上 Call @H_404_29@ UserControl_Resize End Sub @H_404_29@ Private @H_404_29@ Sub @H_404_29@ UserControl_Resize() Shape1.Move CircleX,CircleY End Sub @H_404_29@ Private @H_404_29@ Sub @H_404_29@ UserControl_WriteProperties(PropBag As @H_404_29@ PropertyBag) Call @H_404_29@ PropBag.WriteProperty( @H_404_29@" @H_404_29@CircleX @H_404_29@" @H_404_29@,CircleX,Shape1.Width @H_404_29@/ @H_404_29@ @H_404_29@2 @H_404_29@) 注释:将用户设置的值保存 Call @H_404_29@ PropBag.WriteProperty( @H_404_29@" @H_404_29@CircleY @H_404_29@" @H_404_29@,CircleY,Shape1.Height @H_404_29@/ @H_404_29@ @H_404_29@2 @H_404_29@) 注释:同上 End Sub @H_404_29@
麻雀虽小,五脏俱全。这个OCX控件完成的任务虽然简单,但是OCX控件的基本操作全都有喔! 有兴趣的朋友不妨一试