VB activex ocx控件菜单编辑器
大家对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还有待完善,以后会逐步完善。