广告

[VB6.0自定义ActiveX控件]基本认知篇

【DIY控件一般流程】
1.新建控件:新建工程-选择ActiveX控件-菜单-工程-添加用户控件-确定
2.布局控件:拖动所以的已有控件到DIY控件上,布局(高层次的可能采用API绘制控件),此时可以添加一个EXE工程进来以便测试
3.添加属性Property
4.添加方法Funciton
5.添加事件Event
6.添加ReadProperties、WriteProperties
7.添加属性初始化设置语句UserControl_InitProperties()
8.添加控件变形语句UserControl_Resize()
9.后期处理,根据控件的功能做相应的处理即可
10.发布控件:先将控件的public属性设置为true,然后点击菜单-文件-生成OCX

 


 

【继承父窗体属性】Ambient 即继承父窗体的属性。如可以在属性初始化时继承到父窗体的背景颜色
Private Sub UserControl_InitProperties()
List1.BackColor = Ambient.BackColor
End Sub

 


 

【新建属性】
Property Get 返回一般属性的值
Property Let 设置一般属性的值
Property Set 设置对象属性的值(即该属性含有对象引用,比如Font)
-读取属性
Public Property Get Caption() As String
Caption = Label11.Caption
End Property
-设置属性
Public Property Let Caption(ByVal NewCaption As String)
Label1.Caption = NewCaption
PropertyChanged “Caption”
End Property

 


 

【颜色类型】对于Forecolor和Backcolor类型在属性声明时应声明成OLE_COLOR类型,一般的Get和Let成组存在,如:
Public Property Get ForeColor() As OLE_COLOR
‘语句
End Property
Public Property Let ForeColor(ByVal theCol As OLE_COLOR)
‘语句
End Property

 


 

【Font类型】对于Font类型在属性声明时应声明成Font类型,由于Font对象含有多重信息,所以用Set引用对象赋值给变量
对于只含有一个信息属性只需使用等号即可,如caption,backcolor等

Public Property Get Font() As Font
Set Font = List1.Font
End Property

Public Property Set Font(ByRef newFont As Font)
Set List1.Font = newFont
End Property

 


 

【其他类型】
OLE_TRISTATE :数据类型用于三态复选框。如果要制作具有复选框功能的控件,可以将其 Value 属性声明为 OLE_TRISTATE。
OLE_TRISTATE :是具有下列值的枚举:0-未被选中  1-被选中   2-灰色的

OLE_OPTEXCLUSIVE :如果要开发具有选项按钮功能的控件,那么控件的 Value 属性可以使用 OLE_OPTEXCLUSIVE 数据类型。这会使该控件的 Value 属性的行为类似于内

部的 OptionButton 控件的 Value 属性。也就是说,当控件实例被分组之后,如果用户单击未被选中的控件实例,则当前的被选中实例的 Value 将自动变为 0 (即不选这个

按钮),而被单击的实例的 Value 被置为 1。
这一行由容器处理。容器会检查它包含的每个控件的 Value 属性,并将那些类型为 OLE_OPTEXCLUSIVE 的组成一组。
注意 必须使用“过程属性”对话框使 Value 属性成为缺省属性,从而使控件宿主允许上述行为。
在内部,OLE_OPTEXCLUSIVE 是作为 Boolean 类型处理的。

OLE_CANCELBOOL:此数据类型可以作为事件的一个参数,允许用户取消事件。例如,标准的 KeyPress 事件传递一个 Cancel 参数作为最后一个参数。如果将此参数设置为

False,该事件就被取消了。
在内部,OLE_CANCELBOOL 作为 Boolean 类型处理。

 

 


 

【新建一维数组型属性】如listbox的.list(index)属性,举例如下:注意Get和Let分别的书写方法
Dim Arrlist() As String’先声明一个数组
Public Property Get list(ByVal Index As Long) As Variant
list = Arrlist(Index)
End Property
Public Property Let list(ByVal Index As Long, ByVal vNewValue As Variant)
Arrlist(Index) = vNewValue
List1.list(Index) = vNewValue
End Property

 


 

 

【新建多维数组型属性】这是一维数组的延伸,以此类推,不常用
Public Property Get Coordinate(ByVal X As Long,ByVal Y As Long) As Variant
End Property
Public Property Let Coordinate(ByVal X As Long, ByVal Y As Long,ByVal vNewValue As Variant)
End Property

 


 

 

【预读\预存属性】这两句是写注册表操作,目的是保存属性和下次读取所保存的属性。
一般的,ReadProperties和WriteProperties成对出现其参数依次为是键名、值、默认值
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
List1.BackColor = PropBag.ReadProperty(“BackColor”, &H80000008)
Set UserControl.Font = .ReadProperty(“Font”, UserControl.Font)
End Sub
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
Call PropBag.WriteProperty(“BackColor”, List1.BackColor, &H80000008)
Call PropBag.WriteProperty(“Font”, UserControl.Font)
End Sub

 

 


 

 

【通知属性已经变更】object.PropertyChanged PropertyName
通知容器某属性值已变更后,容器就可以用对象的新属性值同步自身的属性窗口。如果不通知容器某个属性值已经变更,容器就不知道某个对象的实例是否需要保存(通过产

生 WriteProperties 事件)。
例如,当更改属性页上的某个属性值时,或者当对象自己更改属性值时,需要调用该方法。当修改某个数据连结属性时,也需要调用该方法;否则数据源无法更新。
仅仅在运行时可用的属性不需要调用 PropertyChanged 方法,除非它们能被数据绑定。
作为示例,下面的代码说明了如何使用 PropertyChanged 方法:
Public Property Let Address(ByVal cValue As String)
m_Address = cValue
PropertyChanged “Address”
End Property
注意:PropertyChanged只是起一个通知的作用,保存需要触发 WriteProperties事件
一般地,在Public Property Let….End Property中都会添加PropertyChanged通知

 

 


 

 

【添加方法】
Public Function 方法名(参数列表) 返回类型
End Function
如:
Public Function AddItem(ByVal s As String)
‘适当语句
End Function

 

 


 

 

【添加事件】这里的事件指从无到有,添加后可以在事件查看组合框中看到添加的事件
一般的,Click、Dbclick、mousemove等都是需要预先添加的,否则在使用控件时是无法使用的
声明方法:分带参数和不带参数的
Public Event Click()
Public Event MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
当然你也可以自定义名称,如Public Event abc(),但这似乎是没有多大的意义的。

 

 


 

 

【调用或触发事件】在添加事件的时候或许你就发现了一个现象,在添加Public Event Click()后没有结束语句了
事件不同于函数和过程Public Function 有End Function和Public Sub有End Sub.
它需要一个语句在需要触发时间的时候来触发事件 这个语句就是RaiseEvent
一般地,使用RaiseEvent eventname [(argumentlist)]来触发事件。
如:RaiseEvent KeyDown(KeyCode, Shift) 和 RaiseEvent Click()
比如你添加了一个Click()事件,那么正常的情况下你应该这样写来触发事件
Private Sub UserControl_Click()
‘可以根据需要在这里添加相应语句
RaiseEvent Click()
‘可以根据需要在这里添加相应语句
End Sub
RaiseEvent Click() 的位置随意的 不一定要放在UserControl_Click()过程中,其他事件亦然。

 

 


 

 

【UserControl】它是什么呢,他就是自定义控件的总容器,这样理解吧,UserControl和Form的关系就像哥哥和弟弟一样
Form有初始化Private Sub Form_Initialize()
UserControl也有初始化Private Sub UserControl_Initialize()
它们都可以Show和Hide等很多共同点,当然也有不通电,比如UserControl可以直接设置背景透明而Form却不行
其他的属性自己到其属性窗口看吧

 

 


 

 

【UserControl的基本属性】
–Name 为控件起一个恰当的名字
–IsvisibleAtRuntime 控件定制完后运行时是否可见,比如timer控件就不可见
–ToolBoxbitmap 设定一个漂亮的图标,支持jpg,bmp,gif格式,不支持ico格式

 

 

One thought on “[VB6.0自定义ActiveX控件]基本认知篇

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>