vb中怎样设置菜单项中的checked属性?

vb中怎样设置菜单项中的checked属性?,第1张

可以在VB的菜单编辑器中直接设置复选,或者在属性管理器是选择相应的菜单,修改checked属性,还可以能过代码,动态修改。

动态修改代码:

Private Sub tm_Click()
  tmChecked = Not tmChecked '自动设置Checked
End Sub

如下图所示:

执行效果

点击后

ocx控件对于开发过Windows应用的朋友来说一定不会陌生,它以外部component的形式对程序提供强大的支持,如VB工具栏中的picturebox、label、image等都是ocx控件。然而要开发自己的ocx却有一定难度,以前程序员大都用cdk (control develop kit)来设计,但是这需要掌握相当的c语言技巧,其实VB从50开始就支持ocx控件开发,我们可从VB的samples中找到一些例子,然而这些例子比较抽象,不好理解,下面请跟我一起来做个十分实用的ocx控件,你只要懂一些VB编程基础就可以了!
大家对Windows的菜单非常熟悉,这种统一格式的灰色菜单有时并不能满足一些应用程序的要求,特别是那些对界面要求比较高的多媒体设计。问题是,VC、VB中提供的菜单编辑器并不支持图形菜单功能!不要着急,我们马上自己来开发一个!
创建 menus工程
首先打开VB60,在新建工程中选择Activex 控件, 这时设计窗口出现一个类似form表单的界面 这就是你的ocx设计器,缺省名为UserControl1。
1 在"工程"菜单上单击"Project1 属性",打开"工程属性"对话框。选择"通用"选项卡,将工程名称改为menus
2 在UserControl1 的"属性"窗口中点击"名称" 属性并且把用户控件名改为menuControl
你可能注意到, menuControl的"属性"窗口和标准的VB的form"属性"窗口既类似又有不同。记住,现在我们设计的是ocx控件,而不是VB中的form!
添加 Test 工程
由于 ocx 工程不能独立运行,所以我们将添加一个Test工程。在同一工程组中装入设计工程(menus工程)和测试工程(Test工程)将十分有利于调试运行中的部件。
1在"文件"菜单上单击"添加工程"以打开"添加工程"对话框。
注意: 不要单击"打开工程" 或"新建工程",因为这样会关闭控件工程。
2双击"Standard EXE"图标以添加普通的 exe 工程(即我们的Test工程)。
该新工程立即成为这个工程组的"启动"工程。"工程资源管理器"窗口以黑体名字的显示来标识"启动"工程。
注意: ActiveX 控件工程是不能作为启动工程的。
3 在"文件"菜单上单击"保存工程组"用以保存测试工程和工程组。
& ocx代码设计 &
1 在menus工程的module模块中增加如下代码:
Type menuRect '创建用户自定义类型
left As Integer
top As Integer
right As Integer
bottom As Integer
End Type
2 在控件设计窗口中加入一个picturebox控件,取名为bmpmenu。
在bmpmenu中加入另一个picturebox控件,取名为menuitem。
注意: menuitem是bmpmenu的子控件。并且,这两个picturebox的
AutoSize属性皆设为True,BorderStyle属性皆设为None。
3 在控件设计窗口中的General->Declarations中增加如下代码:
Public g_selectedItem As String
Dim g_fileName As String '菜单文件名
Dim g_height As Integer 'ocx控件的高度
Dim g_width As Integer 'ocx控件的宽度
Dim bmpRects() As menuRect 'bmpRects()用来记录所有菜单项的位置
Dim currentItemNumbers As Integer
Dim currentItemNumber As Integer
Public Event MENUITEMDOWN()
注意: MENUITEMDOWN是我们添加到控件中的一个事件,它的详细作用我们稍后会具体介绍。
4 为我们的菜单控件添加两个属性: childs 和 BmpName
childs属性表示菜单控件的菜单项数目, BmpName属性表示菜单控件的菜单文件名
首先,打开menuControl的代码窗口。在"工具"菜单上点击"添加过程"打开"添加过程"对话框。在"名称"框输入名字childs。单击"属性"和"公共的"后再单击"确定"。
你将看到如下的代码:
Public Property Get childs() As Variant
End Property
Public Property Let del1(ByVal vNewValue As Variant)
End Property
然后,在代码窗口更改我们新创建的属性过程(修改的部份以黑体表示):
Public Property Get childs() As Integer
childs = currentItemNumbers
End Property
Public Property Let childs(ByVal vNewValue As Integer)
currentItemNumbers = vNewValue
PropertyChanged "childs"
PopAndResize ' 这是一个子过程
End Property
当你对childs属性赋新值时均执行 Property Let 过程, 而当你对childs属性检索该属性值时均执行 Property Get 过程。
对BmpName属性也同样处理,它的代码部份如下:
Public Property Get BmpName() As String
BmpName = g_fileName
End Property
Public Property Let BmpName(ByVal vNewValue As String)
g_fileName = vNewValue
PropertyChanged "BmpName"
PopAndResize
End Property
5 为了初始化ocx控件,在 UserControl_InitProperties 事件过程中
添加如下代码:
Private Sub UserControl_InitProperties()
BmpName = ""
childs = 0
End Sub
在UserControl_Resize 事件过程中添加如下代码:
Private Sub UserControl_Resize()
If g_height < 20 And g_width < 20 Then '决定设计状态时的控件大小
UserControlHeight = 300
UserControlWidth = 300
Else
UserControlHeight = g_height '决定运行状态时的控件大小
UserControlWidth = g_width
End If
End Sub
注意: ocx控件设计涉及到许多重要概念,大家必须亲自实践才能真正融会贯通,
下面简单地介绍一下ocx的事件过程设计。
与一般的可编程对象不同,ocx控件同时具有设计时和运行时的两种行为。 即开发者在设计时把一个控件放入窗体时,控件中的一些代码将会执行。
例如,把我们设计的menu控件放入test工程的窗体时, 放置在 UserControl_Resize 事件过程中的代码将会执行;当test工程进入运行状态时, UserControl_Resize事件过程中的代码也会执行。所以,我在UserControl_Resize过程中使用IfElse语句来决定menu控件分别在设计状态和运行状态时的尺寸大小。
6 好了,我们的ocx控件马上就要完工了,再坚持一下!(ocx确实有点难度,不过它可是代表最新的技术设计概念哦!)
把下面的sub过程加入ocx设计器的代码部分:
Sub popbmpMenu(xposition As Integer, yposition As Integer, itemNumbers As_ Integer, fileName As String)
ReDim bmpRects(itemNumbers)
bmpmenuVisible = False
g_fileName = fileName
bmpmenuPicture = LoadPicture(g_fileName + "bmp")
menuitemVisible = False
currentItemNumbers = itemNumbers
itemHeight = Int(bmpmenuHeight / itemNumbers)
For i = 0 To itemNumbers - 1
bmpRects(i)left = xposition
bmpRects(i)right = bmpmenuWidth
If i = 0 Then
bmpRects(i)top = yposition
Else
bmpRects(i)top = bmpRects(i - 1)bottom
End If
bmpRects(i)bottom = itemHeight (i + 1)
Next i
bmpmenuZOrder 0
bmpmenuleft = 0
bmpmenutop = 0
bmpmenuVisible = True
g_height = bmpmenuHeight ' 菜单位图文件决定了ocx控件的大小
g_width = bmpmenuWidth
End Sub
Sub PopAndResize()
menuitemVisible = False
If childs > 0 And BmpName <> "" Then
Call popbmpMenu(0, 0, childs, BmpName)
End If
UserControlHeight = g_height ' 调整ocx控件的大小
UserControlWidth = g_width
End Sub
Private Sub GetSelectedItem() '判断哪个菜单项被选中
g_selectedItem = right(g_fileName, 2) + "-" + LTrim(Str(currentItemNumber))
End Sub
最后是两个picturebox上的一些代码:
Private Sub bmpmenu_MouseMove(Button As Integer, Shift As Integer, X As Single, _
Y As Single)
menuitemVisible = False
For i = 0 To currentItemNumbers - 1
If X > bmpRects(i)left And Y > bmpRects(i)top And X < bmpRects(i)right _
And Y < bmpRects(i)bottom Then
currentItemNumber = 0
menuitemPicture = LoadPicture(g_fileName + "-" + LTrim(Str(i + 1)) + "bmp")
currentItemNumber = i + 1
menuitemMove bmpRects(i)left , bmpRects(i)top
menuitemVisible = True
Exit Sub
End If
Next i
End Sub
Private Sub menuitem_MouseDown(Button As Integer, Shift As Integer, X As Single, _
Y As Single)
GetSelectedItem
menuitemVisible = False
'启动MENUITEMDOWN事件,此事件的执行代码不写在ocx
'中,而是写在调用此ocx的应用中。
RaiseEvent MENUITEMDOWN
End Sub
& 测试ocx控件 &
OK, 我们的ocx终于完成了!下面我们可以来测试一下了!
制作一张菜单bmp文件,它的名字为c2bmp,共有5个菜单项。
制作5个菜单项的激活状态位图,取名为c2-1bmp,c2-2bmp,c2-3bmp,c2-4bmp,c2-5bmp
将这些位图文件存放在和工程组同层的文件夹中。
关闭ocx设计器窗口,打开ocxTest窗口,我们发现在ToolBox工具栏中多了一个新的控件,这就是我们所设计的menuControl。在ocxTest窗口上放置一个menuControl控件,然后在代码窗口中填入以下程序:
Private Sub Form_Click()
menuControl1BmpName = AppPath + "\c2"
menuControl1childs = 5
menuControl1Visible = True
End Sub
Private Sub Form_Load()
menuControl1Visible = False
End Sub
Private Sub menuControl1_MENUITEMDOWN()
menuControl1Visible = False
Dim selectMenu As Integer
selectMenu = Val(Trim(Mid(menuControl1g_selectedItem, 4, 2)))
Select Case selectMenu
Case 1
'第一个菜单项被选中
Case 2
'第二个菜单项被选中
Case 3
'第三个菜单项被选中
Case 4
'第四个菜单项被选中
Case 5
'第五个菜单项被选中
End Select
End Sub
怎么样调用够简单的吧!这正是微软提出的组件设计的优势。不错,ocx设计的确有些难度,然而一旦设计好,它的调用是十分方便的。ocx的可重用率和易维护性是值得我们在设计时多花些时间的,更重要的是,在软件设计越来越复杂的今天,采用正确的组件设计思想是尤为关键的!
& 编译ocx &
如果一切顺利的话,我们就可以编译ocx了。
1 在"工程资源管理器"窗口单击"menus"以选择该工程。
2 在"文件"菜单上单击"生成 menuControlocx" 。
注意: 如果你需要你的ocx控件具有许可证,可按如下 *** 作
在"工程"菜单上,点击"menus 属性"打开"工程属性"对话框。选择"通用"选卡,选定"要求许可证关键字",然后单击"确定"。
这样,即使有人将你的ocx拷贝了去,他也无法使用!你就不必担心你的心血被人侵犯喽!
& 使用ocx控件 &
由于我们的ocx已经编译成功,所以现在就可以像使用系统中的标准控件一样来调用我们的menuControlocx了。
退出设计时的工程组,新建一个VB的标准工程,在"工程"菜单上单击"部件",在 Controls 的选项卡上,复选"menus"后再单击"确定"。现在menuControl控件和Label,TextBox等控件就一样被对待处理了,只不过menuControl是我们自己设计的!
菜单的图形文件起名有一定规则,大家只要看一下程序就明白了。当然,读者朋友们也可以按自己喜欢的方式来处理文件名。
& 后记 &
ocx控件设计还涉及到许多方方面面,由于篇幅有限,这里就不详述了(其实,大家能坚持到这里就够有耐心了! (-_-) )。menuControl还有不少地方需要改进,这就待以后再慢慢完善了。

工具条中的按扭样式选择成:3-tbrSeparator 就显示分隔线了。
当然你把连续的两个按扭都选择成分割线就出现两个连续的竖线。
不过该竖线不是你说的工具条前面的标志性竖线哦。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12618765.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存