用VB写OCX控件
一、 OCX简介
OCX,即对象类别扩充组件。控件的最大好处是可重复利用,甚至可以在不同的编程语言之间使用,例如可以在VB中嵌入使用VC开发的控件。
二、用VB做一个OCX控件
1、打开VB6.0,鼠标点击左上角“文件(F)”,选择“新建工程(N)”。在弹出的对话框中选择“ActiveX控件”选项,点击“确定”按钮,如下图所示。
2、进入主界面,将工程名从默认的“工程1”改为“timectrl”,如下图所示。
3、在控件的界面里拖放一个“Label”控件和一个“Timer”控件,如下图所示。
4、将“Label”控件名称改为TimeShow,caption属性设为空。然后将“Timer”控件的Interval属性改为1000,表示“Timer”控件的Timer事件每1000ms(1s)发生一次,如下图所示。
5、双击“Timer”控件,在新出现的函数里添加Timer事件的处理代码。
(1)获取系统时间,需要用到GetLocalTime函数,其输入参数是一个SYSTEMTIME类型的结构体,GetLocalTime是kernel32.dll这个动态链接库中的导出函数。使用GetLocalTime的方法是先在VB文件的头部声明一下这个函数,然后再定义一个SYSTEMTIME类型的结构体,其代码如下:
Private Declare Sub GetLocalTime Lib "kernel32" (lpsystemtime As SYSTEMTIME)
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
(2)在“Timer”控件的事件处理函数中,将获取到的系统时间显示在“Label”控件中,其代码如下:
Private Sub Timer1_Timer()
Dim sysTime As SYSTEMTIME
Dim strTime As String
GetLocalTime sysTime
strTime = sysTime.wYear & "-" & _sysTime.wMonth & "-" & _sysTime.wDay & " " & _sysTime.wHour & ":" & _sysTime.wMinute & ":" & _sysTime.wSecond
TimeShow.Caption = strTime
End Sub
6、(1)点击“运行(R)”会出现如下所示界面。
(2)点击“允许阻止的内容(A)”,在弹出的对话框中选择“否”,如下图所示。
(3)点击“否”之后,将会出现如下界面。显示的内容为“2020-10-4 13:45:28”,也就是此时的系统时间,并且时间是一秒一秒地增加的。
7、在“文件”菜单里选择“生成timectrl.ocx”命令将这个OCX控件文件保存下来,这样一个OCX控件的制作就完成了。
注意:本人在实现上面一步的时候,点击“确定”按钮后,会弹出“访问系统注册表错误”提示对话框。采取的解决方案是:右击VB图标,打开属性,点击兼容性,设置为以管理员身份运行此程序。再打开就不会提示出错了。
三、 对OCX控件的测试
(一)在VB上的测试
1、打开VB6.0,选择“标准EXE”程序,然后在“工程”菜单里选择“部件”命令,这时会弹出如下图所示的“部件”对话框,点击“浏览”按钮,找到刚才生成的那个timectrl.ocx,然后点击“确定”按钮,完成部件的添加操作。如下图所示。
2、在控件工具条中会看到多一个控件(下图中的最后一个控件),这个多出来的控件就是刚才做的OCX控件。
3、将这个控件拖放到主界面上,然后执行程序,会看到类似于下图所示的结果,并且时间是一秒一秒地增加的。
(二)在VC上的测试
1、为了确保timectrl.ocx是已注册的控件,运行:regsvr32对这个OCX控件进行注册,即使注册过了,再注册也没什么负面影响。
详细步骤:以管理员身份运行命令提示符,访问timectrl.ocx所在位置,成功注册后,界面如下图所示。
2、打开VC6.0,建立一个MFC对话框工程。如下图所示。
3、在对话框任一空白处鼠标右击,选择“插入ActiveX控件 …”,如下图所示。
4、在“插入ActiveX控件”下拉框里找到timectrl.UserControl1,它所对应的路径是刚刚注册的路径,点击“确定”按钮,如下图所示。
5、结果如下图所示,并且上面的时间和VB测试程序上都是逐秒改变的。
至此,用VB写OCX控件就完成了。