摘 要: 在各種多媒體作品中人機交互方式有時需要采用多級菜單方式。雖然Authorware7提供了下拉菜單的交互方式,但要實現(xiàn)二級以上的下拉菜單還需借助外部函數(shù)來實現(xiàn)。利用外部文件WINAPI.U32中的有關(guān)菜單操作函數(shù),探討并研究了Authorware7實現(xiàn)多級下拉菜單的制作方法,并給出了一個三級下拉菜單的實例制作過程。
關(guān)鍵詞: Authorware;外部函數(shù);菜單
0 引言
在多媒體作品中有時希望用菜單方式與用戶進行交互,由于需要進行功能分類,多級菜單的使用在多媒體作品中也常被用到。Authorware7中提供了菜單交互方式,但若想設(shè)計二級以上菜單則必須引用一些外部函數(shù)。實現(xiàn)有關(guān)菜單操作的外部函數(shù)包含在名為WINAPI.U32的外部文件中。本文研究了在Authorware中利用外部函數(shù)設(shè)計出多級菜單的實現(xiàn)方法,并給出一個實例設(shè)計過程,對設(shè)計過程中可能出現(xiàn)的異常情況提供了相關(guān)處理方法。
1 有關(guān)菜單操作的外部函數(shù)
首先將外部文件WINAPI.U32復(fù)制到當(dāng)前程序所在目錄下。所涉及的外部函數(shù)有:
⑴GetMenu(HWND hWnd),該函數(shù)取得分配給指定窗口的菜單的句柄。這是最高級的菜單句柄。
?、艷etSubMenu(HMENU hMenu, int nPos),該函數(shù)取得被指定菜單激活的下拉式菜單或子菜單的句柄。其中 nPos的值為菜單或子菜單的索引值,從0開始。
⑶RemoveMenu(HMENU hMenu,UINT uPosition,UINT uFlags),該函數(shù)從指定菜單刪除一個菜單項或分離一個子菜單。如果菜單項打開一個下拉式菜單或子菜單,RemoveMenu不銷毀該菜單或其句柄,允許菜單被重用。其中當(dāng)uFlags的值為0(MF_BYCOMMAND)時,表示uPosition給出菜單項的標(biāo)識符。當(dāng)uFlags的值為1 024(MF_BYPOSITION)時,表示uPosition給出菜單項基于零的相對位置。
?、菵rawMenuBar(HWND hWnd),該函數(shù)重畫指定菜單的菜單條。如果系統(tǒng)創(chuàng)建窗口以后菜單條被修改,則必須調(diào)用此函數(shù)來重畫修改了的菜單條。
?、蒊nsertMenu(HMENU hMenu, UINT uPosition,UINT uFlags,UINT uIDNewItem,LPCSTR lpNewItem),該函數(shù)插入一個新菜單項到菜單里,并使菜單里其他菜單項下移。
?、蔇eleteMenu( HMENU hMenu,UINT uPosition,UINT uFlags),該函數(shù)從指定菜單里刪除一個菜單項。如果此菜單項打開了一個菜單或子菜單,則此函數(shù)銷毀該菜單或子菜單的句柄,并釋放該菜單或子菜單使用的存儲器。
2 菜單設(shè)計步驟
2.1 設(shè)計菜單層次結(jié)構(gòu)圖
首先將多媒體作品中的所有菜單內(nèi)容進行分類,相同級別相同類型的子菜單和菜單項放在一個下拉菜單中,從而設(shè)計出一個菜單結(jié)構(gòu)總圖。如設(shè)計一個三級菜單結(jié)構(gòu)如圖1所示。
2.2 Authorware7中流程線上的菜單設(shè)計
?、艅h除系統(tǒng)文件菜單。主流程線上添加一個名為“刪除系統(tǒng)文件菜單”的群組圖標(biāo)。該群組圖標(biāo)設(shè)計如圖2所示。其中名為“文件”的交互圖標(biāo)下放置一個未命名的空的群組圖標(biāo),交互類型為下拉菜單。擦除圖標(biāo)的擦除對象就是上述文件這個交互圖標(biāo)。其運行效果是擦除原系統(tǒng)顯示的文件菜單,只留下本程序設(shè)計要求的菜單內(nèi)容。
?、圃O(shè)計菜單結(jié)構(gòu)圖中所有菜單。在主流程上按照菜單結(jié)構(gòu)圖從外到內(nèi)依次添加交互圖標(biāo),一個菜單添加一個交互圖標(biāo)。設(shè)計各個菜單時,當(dāng)一個菜單的所有菜單項均為子菜單時,該菜單下設(shè)計時至少放置一個下拉菜單項,如菜單結(jié)構(gòu)圖中的菜單A,兩個菜單項均為子菜單,故設(shè)計時先添加一個菜單項A1,其目的是形成一個菜單,否則空的交互圖標(biāo)運行時不會出現(xiàn)菜單。如果菜單中除了子菜單還有其他菜單項,則僅放置那些菜單項即可,如菜單結(jié)構(gòu)圖中菜單B和菜單C。完成初始菜單設(shè)計后,如圖3所示。
其中,每個交互類型圖標(biāo)的屬性設(shè)置均相同,如圖4所示。
2.3 子菜單的設(shè)計
在流程線上再添加一個計算圖標(biāo),命名為“三級菜單的調(diào)整”,利用外部文件WINAPI.U32中的有關(guān)菜單操作函數(shù),實現(xiàn)三級菜單的設(shè)計,計算圖標(biāo)中的代碼如下[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,準(zhǔn)備將其加為菜單A的第1菜單項
RemoveMenu(menuhandle,2,1024)
--刪除菜單B,準(zhǔn)備將其加為菜單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 保存并打包運行程序
程序運行結(jié)果如圖5所示。
3 可能出現(xiàn)的問題及解決方法
在設(shè)計過程及編譯、打包、運行過程中可能會出現(xiàn)一些錯誤信息,如提示缺少、找不到JS32.dll的出錯信息,這時可從網(wǎng)上下載一個JS32.dll文件拷貝到C:\Windows\System32下。再如出現(xiàn)提示“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 ”信息,這是因為文件在打包時,需要把文件中所用到的相關(guān)Xtra文件拷貝到打包生成的EXE文件所在的同級目錄中,通常把Authorware安裝目錄下的Xtra文件夾整個復(fù)制到生成的EXE文件所在的同級目錄中。
4 結(jié)論
本文利用外部文件WINAPI.U32中的有關(guān)菜單操作函數(shù),研究了在Authorware7中實現(xiàn)多級菜單的制作方法,并以三級菜單制作為例,提供了較為詳細的設(shè)計過程。
參考文獻
[1] 吳偉信,傅子陽. Authorware中類Windows彈出式菜單模板的設(shè)計與實現(xiàn)[J]. 福建電腦, 2007(10):167,169.
[2] 溫杰. Authorware 菜單制作[J]. 電腦學(xué)習(xí), 2009(4):45-47.