摘 要: 在各种多媒体作品中人机交互方式有时需要采用多级菜单方式。虽然Authorware7提供了下拉菜单的交互方式,但要实现二级以上的下拉菜单还需借助外部函数来实现。利用外部文件WINAPI.U32中的有关菜单操作函数,探讨并研究了Authorware7实现多级下拉菜单的制作方法,并给出了一个三级下拉菜单的实例制作过程。
关键词: Authorware;外部函数;菜单
0 引言
在多媒体作品中有时希望用菜单方式与用户进行交互,由于需要进行功能分类,多级菜单的使用在多媒体作品中也常被用到。Authorware7中提供了菜单交互方式,但若想设计二级以上菜单则必须引用一些外部函数。实现有关菜单操作的外部函数包含在名为WINAPI.U32的外部文件中。本文研究了在Authorware中利用外部函数设计出多级菜单的实现方法,并给出一个实例设计过程,对设计过程中可能出现的异常情况提供了相关处理方法。
1 有关菜单操作的外部函数
首先将外部文件WINAPI.U32复制到当前程序所在目录下。所涉及的外部函数有:
⑴GetMenu(HWND hWnd),该函数取得分配给指定窗口的菜单的句柄。这是最高级的菜单句柄。
⑵GetSubMenu(HMENU hMenu, int nPos),该函数取得被指定菜单激活的下拉式菜单或子菜单的句柄。其中 nPos的值为菜单或子菜单的索引值,从0开始。
⑶RemoveMenu(HMENU hMenu,UINT uPosition,UINT uFlags),该函数从指定菜单删除一个菜单项或分离一个子菜单。如果菜单项打开一个下拉式菜单或子菜单,RemoveMenu不销毁该菜单或其句柄,允许菜单被重用。其中当uFlags的值为0(MF_BYCOMMAND)时,表示uPosition给出菜单项的标识符。当uFlags的值为1 024(MF_BYPOSITION)时,表示uPosition给出菜单项基于零的相对位置。
⑷DrawMenuBar(HWND hWnd),该函数重画指定菜单的菜单条。如果系统创建窗口以后菜单条被修改,则必须调用此函数来重画修改了的菜单条。
⑸InsertMenu(HMENU hMenu, UINT uPosition,UINT uFlags,UINT uIDNewItem,LPCSTR lpNewItem),该函数插入一个新菜单项到菜单里,并使菜单里其他菜单项下移。
⑹DeleteMenu( HMENU hMenu,UINT uPosition,UINT uFlags),该函数从指定菜单里删除一个菜单项。如果此菜单项打开了一个菜单或子菜单,则此函数销毁该菜单或子菜单的句柄,并释放该菜单或子菜单使用的存储器。
2 菜单设计步骤
2.1 设计菜单层次结构图
首先将多媒体作品中的所有菜单内容进行分类,相同级别相同类型的子菜单和菜单项放在一个下拉菜单中,从而设计出一个菜单结构总图。如设计一个三级菜单结构如图1所示。
2.2 Authorware7中流程线上的菜单设计
⑴删除系统文件菜单。主流程线上添加一个名为“删除系统文件菜单”的群组图标。该群组图标设计如图2所示。其中名为“文件”的交互图标下放置一个未命名的空的群组图标,交互类型为下拉菜单。擦除图标的擦除对象就是上述文件这个交互图标。其运行效果是擦除原系统显示的文件菜单,只留下本程序设计要求的菜单内容。
⑵设计菜单结构图中所有菜单。在主流程上按照菜单结构图从外到内依次添加交互图标,一个菜单添加一个交互图标。设计各个菜单时,当一个菜单的所有菜单项均为子菜单时,该菜单下设计时至少放置一个下拉菜单项,如菜单结构图中的菜单A,两个菜单项均为子菜单,故设计时先添加一个菜单项A1,其目的是形成一个菜单,否则空的交互图标运行时不会出现菜单。如果菜单中除了子菜单还有其他菜单项,则仅放置那些菜单项即可,如菜单结构图中菜单B和菜单C。完成初始菜单设计后,如图3所示。
其中,每个交互类型图标的属性设置均相同,如图4所示。
2.3 子菜单的设计
在流程线上再添加一个计算图标,命名为“三级菜单的调整”,利用外部文件WINAPI.U32中的有关菜单操作函数,实现三级菜单的设计,计算图标中的代码如下[1-2]:
--获得窗口菜单的句柄
menuhandle:=GetMenu(WindowHandle)
--获得第一个菜单A的句柄
subhandle1:=GetSubMenu(menuhandle,0)
--获得第二个菜单B的句柄
subhandle2:=GetSubMenu(menuhandle,1)
--获得第3个菜单C的句柄
subhandle3:=GetSubMenu(menuhandle,2)
--获得第4个菜单D的句柄
subhandle4:=GetSubMenu(menuhandle,3)
--获得第5个菜单E的句柄
subhandle5:=GetSubMenu(menuhandle,4)
--删除第5个菜单E
RemoveMenu(menuhandle,4,1024)
--删除第4个菜单D
RemoveMenu(menuhandle,3,1024)
--重画菜单栏
DrawMenuBar(WindowHandle)
--将菜单E插入菜单C的第1个菜单项并命名为"菜单E"成为三级菜单
InsertMenu(subhandle3,0,1040,subhandle5,"菜单E")[2]
--将菜单D插入菜单B的第2个菜单项并命名为"菜单D"成为三级菜单
InsertMenu(subhandle2,1,1040,subhandle4," 菜单D")
--删除菜单C,准备将其加为菜单A的第1菜单项
RemoveMenu(menuhandle,2,1024)
--删除菜单B,准备将其加为菜单A的第2个菜单项
RemoveMenu(menuhandle,1,1024)
--重画菜单栏
DrawMenuBar(WindowHandle)
--将菜单B插入菜单A的第1个菜单项并命名为"菜单B"成为二级菜单
InsertMenu(subhandle1,0,1040,subhandle2,"菜单B")
--将菜单C插入菜单A作为第2个菜单项并命名为"菜单C"成为二级菜单
InsertMenu(subhandle1,1,1040,subhandle3,"菜单C")
--删除菜单A原来的菜单项A(插入之后被下移到第3项)
DeleteMenu(subhandle1,2,1024)
2.4 保存并打包运行程序
程序运行结果如图5所示。
3 可能出现的问题及解决方法
在设计过程及编译、打包、运行过程中可能会出现一些错误信息,如提示缺少、找不到JS32.dll的出错信息,这时可从网上下载一个JS32.dll文件拷贝到C:\Windows\System32下。再如出现提示“Unable to display icon "****" because the following error has occurred:Xtra not found.Other objects may also fail to appear.Records of this session will not be saved ”信息,这是因为文件在打包时,需要把文件中所用到的相关Xtra文件拷贝到打包生成的EXE文件所在的同级目录中,通常把Authorware安装目录下的Xtra文件夹整个复制到生成的EXE文件所在的同级目录中。
4 结论
本文利用外部文件WINAPI.U32中的有关菜单操作函数,研究了在Authorware7中实现多级菜单的制作方法,并以三级菜单制作为例,提供了较为详细的设计过程。
参考文献
[1] 吴伟信,傅子阳. Authorware中类Windows弹出式菜单模板的设计与实现[J]. 福建电脑, 2007(10):167,169.
[2] 温杰. Authorware 菜单制作[J]. 电脑学习, 2009(4):45-47.