VB activex ocx控件菜单编辑器

Ocx控件对于开发过Windows应用的朋友来说并不陌生。它以外部组件的形式为程序提供了强大的支持,如VB工具栏中的picturebox、label和image。但是,开发自己的ocx很难。在过去,大多数程序员使用CDK(控件开发工具包)来设计ocx,但这需要掌握相当的C语言技能。其实VB从5.0开始就支持ocx控件开发了,我们可以从VB的例子中找到一些例子。但是,这些例子很抽象,很难理解。请跟我来做一个非常实用的OCX控件,只要你懂一些VB编程基础!

大家对Windows菜单都很熟悉了。这种统一格式的灰色菜单无法满足某些应用的要求,尤其是那些界面要求较高的多媒体设计。问题是VC和VB中提供的菜单编辑器不支持图形化菜单功能!别担心,我们马上自己开发一个!

创建菜单项目

首先,打开VB6.0,在新项目中选择Activex控件。这时,在设计窗口中会出现一个类似表单的界面。这是您的ocx设计器,默认名称是UserControl1。

1.在“项目”菜单上,单击“Project1属性”以打开“项目属性”对话框。选择“常规”选项卡,并将项目名称更改为菜单。

2.在UserControl1的“属性”窗口中单击“名称”属性,将用户控件名称更改为menuControl。

您可能会注意到,menuControl的“属性”窗口类似于标准的VB窗体“属性”窗口,但有所不同。记住,现在我们设计的是ocx控件,而不是VB中的窗体!

添加测试项目

自从。ocx项目不能独立运行,我们将添加一个测试项目。将设计工程(menus engineering)和测试工程(Test engineering)加载到同一个工程组中,将非常有利于调试运行中的组件。

1.在“文件”菜单上,单击“添加项目”打开“添加项目”对话框。

注意:不要单击“打开项目”或“新建项目”,因为这将关闭控制项目。

2.双击“标准EXE”图标添加一个普通的。exe项目(也就是我们的测试项目)。

新项目立即成为这个工程组的“启动”项目。“项目浏览器”窗口通过以粗体显示其名称来标识“启动”项目。

注意:ActiveX控件项目不能用作启动项目。

3.在"文件"菜单上,点击"保存工程组"来保存测试工程和工程组。

& ampOcx代码设计&;

1.在menus项目的模块模块中添加以下代码:

Type menuRect '创建用户定义的类型。

左为整数

顶部为整数

作为整数向右

底部为整数

结束类型

2.将picturebox控件添加到控件设计窗口中,并将其命名为bmpmenu。

向bmpmenu添加另一个picturebox控件,并将其命名为menuitem。

注意:menuitem是bmpmenu的子控件。还有,这两个画框

AutoSize属性设置为true,而True,BorderStyle属性设置为None。

3.常规->在控件设计窗口中;将以下代码添加到声明中:

Public g_selectedItem作为字符串

Dim g_fileName As String '菜单文件名

作为整数的Dim g_height的高度' ocx控件。

Dim g_width作为Integer 'ocx控件的宽度。

Dimbmprechts()作为menurerect ' bmprechts()用于记录所有菜单项的位置。

Dim currentItemNumbers为整数

Dim currentItemNumber为整数

公共事件MENUITEMDOWN()

注意:MENUITEMDOWN是我们添加到控件中的一个事件,后面会介绍它的详细功能。

4.向菜单控件添加两个属性:children和BmpName。

children属性指示menu控件的菜单项数目,BmpName属性指示menu控件的菜单文件名。

首先,打开menuControl的代码窗口。单击“工具”菜单上的“添加进程”,打开“添加进程”对话框。在“名称”框中输入名称children。单击“属性”和“公共* * *”,然后单击“确定”。

您将看到以下代码:

公共属性Get childs()作为变量

结束属性

公共属性字母del1(ByVal vNewValue作为变量)

结束属性

然后,在代码窗口中更改我们新创建的属性流程(修改的部分以粗体显示):

公共属性Get childs()为整数

childs = currentItemNumbers

结束属性

公共属性字母childs(ByVal vNewValue为整数)

currentItemNumbers = vNewValue

属性已更改“childs”

这是一个子流程。

结束属性

当您为子属性分配新值时,您将执行propertylet过程,当您从子属性中检索属性值时,您将执行Property Let过程。

BmpName属性也是如此,其代码部分如下所示:

公共属性Get BmpName()作为字符串

BmpName = g_fileName

结束属性

公共属性Let BmpName(ByVal vNewValue作为字符串)

g_fileName = vNewValue

属性已更改“BmpName”

PopAndResize

结束属性

5.为了初始化ocx控件,在UserControl_InitProperties事件期间。

添加以下代码:

私有子用户控件_InitProperties()

BmpName = " "

childs = 0

末端接头

在UserControl_Resize事件期间添加以下代码:

私有子用户Control_Resize()

如果g _ height & lt20和g _ width & lt20然后在设计状态下确定控件大小。

用户控制。高度= 300

用户控制。宽度= 300

其他

用户控制。' Height = g_height '决定运行状态下控件的大小。

用户控制。宽度= g _宽度

如果…就会结束

末端接头

注意:ocx控件设计涉及到很多重要的概念,大家一定要亲身实践才能真正做到融会贯通。

下面简单介绍一下ocx的事件流程设计。

与普通的可编程对象不同,ocx控件同时具有设计时和运行时行为。也就是说,当开发人员在设计时将控件放入窗体中时,控件中的一些代码将被执行。

比如,当我们把自己设计的菜单控件放到测试项目的表单中时,就会执行放置在UserControl_Resize事件中的代码;当测试项目进入运行状态时,UserControl_Resize事件过程中的代码也将被执行。因此,我使用If...UserControl_Resize过程中的Else语句分别确定菜单控件在设计状态和运行状态下的大小。

6.嗯,我们的ocx控制很快就要完成了。坚持住!(ocx确实有点难,但是代表了最新的技术设计理念!)

将以下子过程添加到ocx designer的代码部分:

Sub popbmpMenu(xposition为整数,yposition为整数,itemNumbers为_ Integer,fileName为字符串)

ReDim bmpRects(项目编号)

bmpmenu。可见=假

g_fileName =文件名

bmpmenu。picture = load picture(g _ fileName+"。bmp”)

菜单项。可见=假

currentItemNumbers =项目编号

itemHeight = Int(bmpmenu。高度/项目编号)

对于i = 0到itemNumbers - 1

bmpRects(一)。左= x位置

bmpRects(一)。right = bmpmenu。宽度

如果i = 0,那么

bmpRects(一)。top = yposition

其他

bmpRects(一)。top = bmpRects(i - 1)。底部

如果…就会结束

bmpRects(一)。bottom = itemHeight * (i + 1)

接下来我

bmpmenu。佐德0

bmpmenu.left = 0

bmpmenu.top = 0

bmpmenu。可见=真

G_height = bmpmenu。“高度”菜单位图文件决定了ocx控件的大小。

g_width = bmpmenu。宽度

末端接头

Sub PopAndResize()

菜单项。可见=假

如果childs & gt0和BmpName & lt& gt”“那么

调用popbmpMenu(0,0,childs,BmpName)

如果…就会结束

用户控制。' Height = g_height '调整ocx控件的大小。

用户控制。宽度= g _宽度

末端接头

Private Sub GetSelectedItem()'确定选择哪个菜单项。

g _ selectedItem = right(g _ fileName,2)+"-"+LTrim(Str(current item number))

末端接头

最后,两个picturebox上有一些代码:

private Sub BMP menu _ MouseMove(Button为整数,Shift为整数,X为Single,_

y表示单身)

菜单项。可见=假

对于i = 0到currentItemNumbers - 1

如果X & gtbmpRects(一)。向左和Y & gtbmpRects(一)。top和X & ltbmpRects(一)。右_

而Y & ltbmpRects(一)。那就垫底

currentItemNumber = 0

菜单项。picture = load picture(g _ fileName+"-"+LTrim(Str(I+1))+"。bmp”)

currentItemNumber = i + 1

菜单项。移动bmpRects(i)。左,bmpRects(i)。顶端

菜单项。可见=真

出口接头

如果…就会结束

接下来我

末端接头

private Sub menuitem _ MouseDown(Button为整数,Shift为整数,X为Single,_

y表示单身)

GetSelectedItem

菜单项。可见=假

启动MENUITEMDOWN事件,这个事件的执行代码不是用ocx写的。

相反,它被写在调用这个ocx的应用程序中。

RaiseEvent菜单项关闭

末端接头

& amp测试ocx控件&;

好了,我们的ocx终于完成了!现在我们可以测试它了!

制作一个菜单bmp文件,它的名字叫C2。BMP,而* * *有五个菜单项。

制作五个菜单项的激活状态位图,命名为C2-1。骨形态发生蛋白,C2-2。骨形态发生蛋白,C2-3。骨形态发生蛋白,C2-4。骨形态发生蛋白,C2-5。BMP。

将这些位图文件存储在工程团队所在楼层的一个文件夹中。

关闭ocx designer窗口,并打开ocxTest窗口。我们发现在工具箱工具栏中有一个新的控件,就是我们设计的menuControl。将menuControl控件放在ocxTest窗口上,然后在代码窗口中填写以下程序:

私有子窗体_Click()

menuControl1。BmpName = App。路径+ "\c2 "

menuControl1.childs = 5

menuControl1。可见=真

末端接头

私有子窗体_Load()

menuControl1。可见=假

末端接头

private Sub menu control 1 _ menuitem down()

menuControl1。可见=假

Dim选择菜单为整数

select menu = Val(Trim(Mid(menu control 1 . g _ selectedItem,4,2)))

选择病例选择菜单

案例1

选择第一个菜单项。

案例2

选择第二个菜单项。

案例3

选择第三个菜单项。

案例4

选择第四个菜单项。

案例5

选择第五个菜单项。

结束选择

末端接头

最近怎么样?打电话够简单!这就是微软提出的组件设计的优势。是的,ocx设计确实有点难,但是一旦设计好了,调用起来就很方便了。ocx的可重用性和可维护性值得在设计上花更多的时间。更重要的是,在软件设计越来越复杂的今天,采用正确的组件设计思想显得尤为关键!

& amp编译ocx &;

如果一切顺利,我们可以编译ocx。

1.单击“项目浏览器”窗口中的“菜单”来选择项目。

2.在“文件”菜单上,单击“生成menuControl.ocx”。

注意:如果你需要你的ocx控件有一个许可,你可以做以下事情。

在“项目”菜单上,单击“菜单属性”打开“项目属性”对话框。选择“通用”卡,选择“许可证要求的关键字”,然后单击“确定”。

这样,就算有人抄袭你的ocx,他也用不了!你不用担心自己的辛苦被侵犯!

& amp使用ocx控件&;

由于我们的ocx已经编译成功,我们现在可以调用我们的menuControl.ocx,就像在系统中使用标准控件一样。

退出设计团队,创建一个新的标准VB项目,单击“项目”菜单上的“组件”,选中“控件”选项卡上的“菜单”,然后单击“确定”。现在menuControl控件被当作标签、文本框等控件,只不过menuControl是我们自己设计的!

菜单图形文件的命名有一定的规则。你只需要看看程序就明白了。当然,读者也可以用自己的方式处理文件名。

& amp后记&;

ocx控件的设计也涉及到很多方面,限于篇幅我就不在这里赘述了(其实大家都有足够的耐心坚持到这里!(-_-) )。MenuControl还有待完善,以后会逐步完善。