Budmenu.u32扩展函数是基于Windows API函数开发的Authorware扩展函数,因此利用它来制作弹出式菜单的时候,首先必须对一些固定变量进行声明赋值,它们的名称和值列表如下:
MF_POPUP := 16
MF_BYCOMMAND := 0
MF_BYPOSITION := 1024
MF_SEPARATOR := 2048
MF_ENABLED := 0
MF_GRAYED := 1
MF_DISABLED := 2
MF_UNCHECKED := 0
MF_CHECKED := 8
MF_USECHECKBITMAPS := 512
MF_STRING := 0
MF_BITMAP := 4
MF_OWNERDRAW := 256
MF_MENUBARBREAK := 32
MF_MENUBREAK := 64
MF_UNHILITE := 0
MF_HILITE := 128
对Budmenu.u32函数有一些了解后,我们马上开工,制作一个有“特色”的Windows标准下拉菜单及鼠标右键弹出式菜单。范例的程序流程图如下图5.8所示:
图5.8 Budmenu.u32范例程序流程图
(1)变量定义
如图5.8的程序流程中,“变量定义”计算图标的代码如上述的固定变量列表,主要是对一些必须的固定变量进行赋值
(2)为创建下拉弹出式菜单编写代码
在“创建菜单”计算图标写入如下代码:
--以下代码定义菜单标识ID
MN_LOGIN:=100
MN_RELOGIN:=101
MN_LOGOUT:=102
MN_WIN:=200
MN_UNIX:=201
MN_MEDIA:=202
MN_DB:=203
MN_ADOBE:=300
MN_MM:=301
MN_AW:=400
MN_DR:=401
MN_FL:=402
MN_PR:=403
MN_PS:=404
MN_BMP:=500
MN_HELP:=501
---以下代码创建系统登陆菜单
SYSMenu:=mCreatePopupMenu()
mAppendMenu(SYSMenu,0,MN_LOGIN,"登陆(&L)")
mAppendMenu(SYSMenu,0,MN_RELOGIN,"注销(&R)")
mAppendMenu(SYSMenu,0,MN_LOGOUT,"退出(&E)")
---以下代码创建三级子菜单
TubMenu1:=mCreatePopupMenu()
TubMenu2:=mCreatePopupMenu()
mAppendMenu(TubMenu1,0,MN_AW,"Authorware"^Tab^"Ctrl+A")
mAppendMenu(TubMenu1,0,MN_DR,"Director "^Tab^"Ctrl+D")
mAppendMenu(TubMenu1,0,MN_FL,"Flash "^Tab^"Ctrl+F")
mAppendMenu(TubMenu2,0,MN_PS,"&PhotoShop"^Tab^"Ctrl+P")
mAppendMenu(TubMenu2,0,MN_PR,"&Premiere "^Tab^"Ctrl+E")
mCheckMenuItem(TubMenu1,MN_AW,MF_CHECKED) ---设置菜单项为Checked
mEnableMenuItem(TubMenu2,MN_PR,MF_GRAYED) ---设置菜单项为灰色不可用
---以下代码创建二级子菜单
SubMenu:=mCreatePopupMenu()
mAppendMenu(SubMenu,MF_POPUP,TubMenu1,"&Macromedia")
mAppendMenu(SubMenu,MF_POPUP,TubMenu2,"&Adobe")
---创建版面选择菜单
BBSMenu:=mCreatePopupMenu()
mAppendMenu(BBSMenu,0,MN_WIN,"Windows NT")
mAppendMenu(BBSMenu,0,MN_UNIX,"Unix Linux")
mAppendMenu(BBSMenu,MF_SEPARATOR,0,"")
mAppendMenu(BBSMenu,MF_POPUP,SubMenu,"Multimedia")
mAppendMenu(BBSMenu,MF_SEPARATOR,0,"")
mAppendMenu(BBSMenu,0,MN_DB,"DataBase")
mCheckMenuItem(BBSMenu,MN_DB,MF_CHECKED)
---创建系统帮助菜单
AboutMenu := mCreatePopupMenu()
bmPic:=mLoadBitmapFile(FileLocation^"4U2V.bmp" ) ---导入BMP图片作为菜单
mAppendMenu(AboutMenu,0,MN_HELP," 关于...")
mAppendBitmapMenu(AboutMenu,0,MN_BMP,bmPic)
值得注意的是Budmenu.u32和tMsControls.u32不同,Budmenu.u32是靠标志符ID来标识每个菜单项的,因此必须给每个菜单项一个唯一的标识符ID。
(3)显示菜单
为显示图标“工具栏”导入一个工具栏的背景图,接着添加交互“显示菜单”如图5.8所示。在交互“显示菜单”的右边添加“系统登陆”按钮响应交互分支,它们的二级程序流程图如下图5.9所示。
图5.9 “系统登陆”按钮响应交互分支流程图
为了达到更加逼真和一致的效果,按钮最好自己设计成为和工具栏背景一样的风格,然后导入为自定义按钮。
计算图标“show popup”的代码如下:
mTrackPopupMenu(SYSMenu,0,ResponseLeft@"系统登陆"+WindowLeft,ResponseTop@"系统登陆"+ResponseHeight@"系统登陆"+WindowTop,0,WindowHandle,0)
计算图标“get menu ID”的代码如下:
LastMenuID:=mGetLastMenuID()
计算图标“unhighlight menu”的代码如下:
Checked@"系统登陆":=FALSE
同理建立“版面选择”和“系统帮助”两个按钮相应分支,最简单的方法是拷贝“系统登陆”分支然后进行相应的修改。
(4)菜单的交互设计
Budmenu.u32是基于WINDOWS API开发的扩展函数,要与Authorware程序通信需要设置消息钩子,图5.8中的计算图标“设置hook on”就起到这个作用,其计算代码为:mMenuHookOn(WindowHandle)。需要注意的是,在程序结束的时候必须用函数mMenuHookOff()停止消息钩子,否则会导致一些意想不到的麻烦。
图5.8流程图中的“菜单交互”设计了一系列交互,其中“RightMouseDown”条件响应分支为产生鼠标右键弹出式菜单的交互分支(设置为永久交互),其代码如下:
mTrackPopupMenu(BBSMenu,0,CursorX+WindowLeft,CursorY+WindowTop,0,WindowHandle,0)
LastMenuID:=mGetLastMenuID()
“LastMenuID <> 0”条件响应分支是检测用户选择的具体菜单项,其二级流程图如下图5.10所示。其中“Set menu”交互就是相应的菜单项条件响应分支,例如“系统登陆”菜单中的“登陆”菜单项的交互条件就设置为:LastMenuID=MN_LOGIN,其它的分支都类似的设置。
图5.10 LastMenuID <> 0条件响应分支二级流程图
这里要注意一点的是每次交互完毕后都必须初始化LastMenuID值,即设置其值为“0”,否则程序不会自动更新纪录用户下次的菜单选择交互,因此在计算图标“reset LastMenuClicked”中编写代码:LastMenuID:=0,这一点和使用tMsControls.u32是截然不同的概念,使用过程中切记!
“修改”按钮响应分支是修改菜单项的分支,核心代码如下,具体就不阐述了。
mModifyMenu(AboutMenu,MN_HELP,MF_BYCOMMAND,MN_HELP,EntryText)
最后是“退出”按钮响应分支设计,其代码如下:
mMenuHookOff() ---取消消息钩子
mDestroyMenu(SYSMenu)
mDestroyMenu(BBSMenu)
mDestroyMenu(AboutMenu)
mFreeBitmapFile(bmPic)
Quit()
OK,存盘后执行一下我们的范例效果吧,下面是它的一些执行效果截图:
图5.11 下拉式菜单效果截图1(ALT快捷键)
图5.12下拉式菜单效果截图2(3级子菜单)
图5.13下拉式菜单效果截图3(BMP菜单)
图5.14 鼠标右键弹出式菜单截图
图5.15 修改菜单项的显示文字
图 5.16 修改后的菜单项
评论 {{userinfo.comments}}
{{child.content}}
{{question.question}}
提交