專(zhuān)利名稱(chēng):一種多級(jí)菜單實(shí)現(xiàn)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)應(yīng)用領(lǐng)域,特別是應(yīng)用于電子設(shè)備的一種多級(jí)菜單的實(shí)現(xiàn)方法。
背景技術(shù):
在一些常見(jiàn)的采用嵌入式系統(tǒng)的嵌入式產(chǎn)品設(shè)備中,如手機(jī)、PDA、信息家電等,設(shè)備所具有的功能一般都會(huì)以菜單方式展示給用戶(hù),而且菜單通常都會(huì)分為幾級(jí)菜單,設(shè)計(jì)人員在進(jìn)行菜單設(shè)計(jì)時(shí)常會(huì)遇到幾級(jí)菜單都具有相同的風(fēng)格,這種相同風(fēng)格的菜單設(shè)計(jì)方式會(huì)各有特點(diǎn)。但是怎樣做,通常比較復(fù)雜,設(shè)計(jì)人員的工作量比較大。
發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問(wèn)題是提供一種多級(jí)菜單實(shí)現(xiàn)方法,降低設(shè)計(jì)人員的工作量。
為解決上述技術(shù)問(wèn)題,本發(fā)明的目的是通過(guò)以下技術(shù)方案實(shí)現(xiàn)的。
一種多級(jí)菜單實(shí)現(xiàn)方法,包括以下步驟 a定義一組菜單資源數(shù)組,其中每個(gè)菜單資源數(shù)組保存有一級(jí)菜單創(chuàng)建時(shí)所需的資源信息,包含該級(jí)菜單資源指針、下級(jí)菜單資源指針; b根據(jù)第一級(jí)菜單資源數(shù)組創(chuàng)建第一級(jí)菜單,并根據(jù)該數(shù)組中的下一級(jí)菜單資源指針找到第二級(jí)菜單資源數(shù)組,據(jù)此數(shù)組創(chuàng)建第二級(jí)菜單; c依步驟b中所述方法根據(jù)菜單資源數(shù)組逐級(jí)創(chuàng)建其它各級(jí)菜單。
其中,所述菜單資源數(shù)組還包括父菜單資源指針、裁剪標(biāo)識(shí)、功能函數(shù)指針及子功能函數(shù)的識(shí)別標(biāo)識(shí)。
其中,所述方法還包括申請(qǐng)一塊動(dòng)態(tài)內(nèi)存,用來(lái)保存當(dāng)前菜單的菜單資源指針及裁剪標(biāo)識(shí);其中,當(dāng)前菜單是指顯示在最前端的菜單。
其中,所述方法還包括顯示第n級(jí)菜單時(shí),將其菜單資源指針保存到所述動(dòng)態(tài)內(nèi)存中,替換掉之前保存的第n-1級(jí)菜單資源指針。
其中,所述步驟c之后還包括從子菜單到父菜單逐級(jí)銷(xiāo)毀各級(jí)菜單,銷(xiāo)毀方法進(jìn)一步包括 ①銷(xiāo)毀第n級(jí)菜單,所述第n級(jí)菜單為當(dāng)前菜單; ②從動(dòng)態(tài)內(nèi)存中獲取第n級(jí)菜單的菜單資源指針,再根據(jù)該指針找到第n級(jí)菜單對(duì)應(yīng)的菜單資源數(shù)組,從中獲取父菜單資源指針,將其保存于動(dòng)態(tài)內(nèi)存中,替換掉之前保存的第n級(jí)菜單資源指針。
其中,所述方法還包括從外部輸入裁剪標(biāo)識(shí),判斷該裁剪標(biāo)識(shí)是否與動(dòng)態(tài)內(nèi)存中保存的裁剪標(biāo)識(shí)相同,若相同,則隱藏當(dāng)前菜單。
以上技術(shù)方案可以看出,本發(fā)明具有以下有益效果 本發(fā)明通過(guò)定義一組帶有父子關(guān)系的菜單資源指針的菜單資源數(shù)組及一公用的動(dòng)態(tài)內(nèi)存來(lái)實(shí)現(xiàn)菜單的層級(jí)關(guān)系控制及菜單功能處理,對(duì)這些菜單采取逐級(jí)進(jìn)入和逐級(jí)銷(xiāo)毀策略,可以定義任意深度的菜單,降低設(shè)計(jì)人員的工作量,同時(shí)也保證了菜單的靈活性。
圖1是菜單逐級(jí)創(chuàng)建示意圖; 圖2是菜單資源的定義格式示意圖; 圖3是菜單未被隱藏的效果示意圖; 圖4是菜單被隱藏的效果示意圖; 圖5是菜單公用內(nèi)存結(jié)構(gòu)示意圖; 圖6是三級(jí)菜單父子關(guān)系結(jié)構(gòu)示意圖; 圖7是動(dòng)態(tài)內(nèi)存數(shù)據(jù)變化過(guò)程示意圖。
具體實(shí)施例方式 為便于對(duì)本發(fā)明進(jìn)一步理解,現(xiàn)結(jié)合附圖對(duì)本發(fā)明進(jìn)行詳細(xì)描述。
本發(fā)明的核心思想為通過(guò)定義一組帶有父子關(guān)系的菜單資源指針的菜單資源數(shù)組及一公用的動(dòng)態(tài)內(nèi)存來(lái)實(shí)現(xiàn)菜單的層級(jí)關(guān)系控制及菜單功能處理。
上述方法中,多級(jí)菜單的窗口是逐級(jí)創(chuàng)建的,進(jìn)入新的子菜單,則創(chuàng)建一個(gè)新窗口覆蓋舊窗口;菜單的返回也是逐層銷(xiāo)毀返回的,上層的窗口銷(xiāo)毀后,下層的窗口顯示出來(lái)成為當(dāng)前的窗口;各層窗口從第1層到第n層是從屬關(guān)系,多級(jí)菜單具有第1級(jí)菜單、第2級(jí)菜單、第3級(jí)菜單......第n級(jí)菜單(n≥2自然數(shù)),第n-1菜單是第n級(jí)菜單的父菜單,即第n級(jí)菜單是第n-1級(jí)菜單的子菜單。各級(jí)菜單都具有一個(gè)菜單資源數(shù)組,所有的菜單共用一個(gè)動(dòng)態(tài)內(nèi)存,各級(jí)的菜單資源數(shù)組包括如下信息菜單資源指針、父菜單資源指針及裁剪標(biāo)識(shí),通過(guò)該菜單資源指針可以獲取其對(duì)應(yīng)的菜單,通過(guò)該父菜單指針可以獲得該級(jí)菜單的父菜單,該裁剪標(biāo)識(shí)是用于判斷該菜單是否隱藏。動(dòng)態(tài)內(nèi)存中存儲(chǔ)有當(dāng)前的菜單資源指針及當(dāng)前的裁剪標(biāo)識(shí),該當(dāng)前的菜單是指處于顯示頂端的菜單。
該多級(jí)菜單的實(shí)現(xiàn)方法包括以下幾個(gè)進(jìn)程 當(dāng)顯示第n級(jí)菜單的時(shí)候,該第n級(jí)菜單對(duì)應(yīng)的菜單資源指針作為當(dāng)前菜單的菜單資源指針; 當(dāng)銷(xiāo)毀第n級(jí)菜單的時(shí)候,將所顯示的第n-1級(jí)菜單對(duì)應(yīng)的菜單資源指針作為當(dāng)前菜單的菜單資源指針; 當(dāng)外部輸入的裁剪標(biāo)識(shí)與第n級(jí)菜單的裁剪標(biāo)識(shí)相吻合時(shí),將第n級(jí)菜單隱藏。
以下為本發(fā)明的具體實(shí)施方式
,下面將用程序設(shè)計(jì)語(yǔ)言C來(lái)表述其設(shè)計(jì)思想。
一、格式定義 (1) typedef union{ structT_MENUITEM*ptNextMenu;//父、子菜單指針 void(*pFunc)(HWND hOwnerWnd,BYTE*pcChoice);//菜單功能函數(shù)指針 }U_NEXTMENU; 這里定義了一個(gè)聯(lián)合體格式,其成員可以是菜單指針或菜單項(xiàng)功能函數(shù)指針,即其內(nèi)容要么指向其下級(jí)或上級(jí)菜單,要么指向該菜單項(xiàng)的功能函數(shù)執(zhí)行體。這個(gè)定義將在下面的菜單資源定義格式中引用。
(2) #define SETMENUS_NORMAL 0x0000 //普通風(fēng)格 #define SETMENUS_ONOFF 0x0001 //帶開(kāi)關(guān)圖標(biāo)風(fēng)格 這里定義了菜單項(xiàng)風(fēng)格標(biāo)識(shí),其字低8位有效 typedef struct{ DWORD dwItemNameID;//菜單項(xiàng)名稱(chēng)資源ID WORDwItemStyle; //菜單及菜單項(xiàng)的風(fēng)格標(biāo)識(shí) BYTEucIfSubmenu; //子菜單標(biāo)識(shí)(TRUE==uNext指針?biāo)甘亲硬藛?或子菜單功能ID(總體信息中) U_NEXTMENU uNext;//父或子菜單指針或菜單功能函數(shù)指針 }T_MENUITEM,*PMENUITEM; 這里定義一種菜單結(jié)構(gòu)類(lèi)型,從上到下其成員含義是第一項(xiàng)dwItemNameID代表著該級(jí)菜單或該菜單項(xiàng)的名稱(chēng)編號(hào)(ID),使用這個(gè)編號(hào)的好處是能夠通過(guò)該編號(hào)去取得對(duì)應(yīng)語(yǔ)言環(huán)境中的相應(yīng)字符串資源,可以使菜單應(yīng)用于不同的語(yǔ)言環(huán)境中,而其定義可能保持不變。第二項(xiàng)wItemStyle代表著該級(jí)菜單或該菜單項(xiàng)的風(fēng)格標(biāo)識(shí)及裁剪標(biāo)志,此項(xiàng)是一個(gè)WORD類(lèi)型,分成兩個(gè)字節(jié),其中高16位是裁剪標(biāo)志,低16位是風(fēng)格標(biāo)識(shí)。第三項(xiàng)ucIfSubmenu決定著第四項(xiàng)成員的含義,當(dāng)?shù)谌?xiàng)內(nèi)容不等于零時(shí),則第四項(xiàng)成員是一個(gè)子菜單指針;當(dāng)?shù)谌?xiàng)內(nèi)容等于零時(shí),則第四項(xiàng)成員是該菜單項(xiàng)的功能函數(shù)指針,如圖2所示。
(3) typedef struct{ constT_MENUITEM*ptTheMenu; //當(dāng)前菜單資源指針 WORD wOptionFlg; //菜單項(xiàng)的裁剪標(biāo)志 }T_SETMENUINFOR; 這里定義了一種結(jié)構(gòu)類(lèi)型,由上到下其成員含義是第一項(xiàng)ptTheMenu代表屏幕上當(dāng)前所顯示的某級(jí)菜單的資源指針,第二項(xiàng)wOptionFlg代表菜單項(xiàng)的裁剪標(biāo)志。此標(biāo)志為WORD類(lèi)型,占兩個(gè)字節(jié)內(nèi)存,僅高16位內(nèi)容表示裁剪狀態(tài)標(biāo)志。低16位含義當(dāng)前保留,方便設(shè)計(jì)人員擴(kuò)展。
二、菜單資源實(shí)體定義舉例 下面以一個(gè)手機(jī)中的“系統(tǒng)設(shè)置”菜單資源定義實(shí)例來(lái)更詳細(xì)說(shuō)明上述格式定義的含義與用法,菜單資源定義好后具體的裝載和顯示不做限制,用任何方法實(shí)現(xiàn)都可以。菜單是逐級(jí)進(jìn)入和逐級(jí)銷(xiāo)毀的,如圖1所示。
#define TRUE 1 #define FALSE 0 菜單項(xiàng)裁剪標(biāo)志,無(wú)SIM卡 #define ITEMS_NOSIM0x0100//無(wú)可用的SIM卡狀態(tài) IP號(hào)碼設(shè)置函數(shù)原形聲明 extern void SS_IPSet(HWND hOwnerWnd,BYTE*pcChoice); 系統(tǒng)設(shè)置菜單資源定義 constT_MENUITEMtSettingMenu[]= { 第一項(xiàng)是本級(jí)菜單的總體信息定義,包括本級(jí)菜單名稱(chēng)ID“IDS_SET_MENU_NAME_SET”,子功能ID“0”,一個(gè)保留項(xiàng)“0”,父菜單指針“NULL”因?yàn)檫@是一個(gè)最頂層菜單,所以其父菜單指針為空。有關(guān)子功能ID的使用在下個(gè)例子中有詳細(xì)描述。
{IDS_SET_MENU_NAME_SET,0,0,NULL}, 第二項(xiàng)起以下是本級(jí)菜單具體信息定義,即各菜單項(xiàng)信息定義,包括本菜單項(xiàng)名稱(chēng)ID“IDS_SET_MENU_THEPHONE”,菜單項(xiàng)風(fēng)格標(biāo)識(shí)“SETMENUS_NORMAL”,子菜單標(biāo)志“TRUE”,下級(jí)子菜單指針“tMachineSetMenu” {IDS_SET_MENU_THEPHONE,SETMENUS_NORMAL,TRUE,(void*)tMachineSetMenu}, 與上面相似的此菜單項(xiàng)信息是,菜單項(xiàng)名稱(chēng)ID“IDS_SET_MENU_SETIP”,菜單項(xiàng)風(fēng)格標(biāo)識(shí)“SETMENUS_ONOFF”,子菜單標(biāo)志“FALSE”,菜單項(xiàng)功能函數(shù)指針“SS_IPSet”,余以此類(lèi)推。對(duì)于菜單項(xiàng)風(fēng)格標(biāo)識(shí)“SETMENUS_ONOFF”,意思是這個(gè)菜單項(xiàng)帶有一個(gè)復(fù)選框。{IDS_SET_MENU_SETIP,SETMENUS_ONOFF,F(xiàn)ALSE,(void*)SS_IPSet},{IDS_SET_MENU_SECURITY,SETMENUS_NORMAL,TRUE,(void*)tSafetySetMenu},{IDS_SET_MENU_NETWORK,SETMENUS_NORMAL,TRUE,(void*)tNetSetMenu}, 此菜單項(xiàng)帶有裁剪標(biāo)志“ITEMS_NOSIM”當(dāng)創(chuàng)建菜單時(shí),若檢查發(fā)現(xiàn)某菜單項(xiàng)裁剪標(biāo)志與外部傳入的裁剪標(biāo)志吻合時(shí),這個(gè)菜單項(xiàng)就應(yīng)該忽略掉,此例定義中該裁剪標(biāo)志的含義是若手機(jī)中沒(méi)有SIM卡時(shí),該菜單項(xiàng)要隱藏起來(lái),不顯示給用戶(hù)。
{IDS_SET_MENU_TIMEANDCOST,ITEMS_NOSIM SETMENUS_NORMAL,TRUE,(void*)tStatisticSetMenu}, 最后一項(xiàng)是本級(jí)菜單定義結(jié)束的信息,以菜單項(xiàng)名稱(chēng)ID等于零為標(biāo)志,后面的“0,0,NULL”無(wú)意義{0,0,0,NULL} }; 該菜單顯示效果見(jiàn)圖3,圖中“IP設(shè)置”菜單項(xiàng)因?yàn)槭菐?fù)選框風(fēng)格的,所以其后面多出一個(gè)復(fù)選框,當(dāng)“IP設(shè)置”被啟用時(shí),復(fù)選框被“勾上”,未啟用時(shí),則復(fù)選框未“勾上”。圖4演示了當(dāng)手機(jī)中未插入SIM卡時(shí),菜單項(xiàng)被隱藏的情況,需要指出的是可以隱藏的并不限于最后一個(gè)菜單項(xiàng),中間的任何一項(xiàng)都可以被隱藏,只要其定義時(shí)的裁剪標(biāo)志與創(chuàng)建菜單時(shí)傳入的裁剪標(biāo)志相符,就滿足隱藏條件,顯示菜單時(shí)其位置由后面的可見(jiàn)菜單項(xiàng)補(bǔ)上。且一級(jí)菜單中各菜單項(xiàng)的裁剪標(biāo)志可以不一樣,這樣就可以有不同的隱藏條件,使菜單變得更加靈活,可以動(dòng)態(tài)的變化。
對(duì)于SETMENUS_ONOFF風(fēng)格的菜單項(xiàng),要求其第四項(xiàng)內(nèi)容必須是功能函數(shù)指針,否則出錯(cuò)。對(duì)于這種風(fēng)格的菜單項(xiàng),在創(chuàng)建顯示菜單時(shí)默認(rèn)聯(lián)合成員中所注冊(cè)的是函數(shù)指針而非菜單資源指針,會(huì)調(diào)用所注冊(cè)的函數(shù),并傳入零值(*pcChoice=0),這個(gè)菜單項(xiàng)功能函數(shù)應(yīng)該對(duì)傳入的pcChoice值進(jìn)行判斷,如果為零值,則查詢(xún)當(dāng)前項(xiàng)的開(kāi)啟、關(guān)閉狀態(tài),若為開(kāi)啟,則將*pcChoice值改為非零值后返回,若為關(guān)閉,則直接返回。
初始化后的正常菜單項(xiàng)功能函數(shù)調(diào)用,傳入正值(*pcChoice>0),若開(kāi)關(guān)狀態(tài)切換失敗則應(yīng)在返回前將pcChoice值清零(*pcChoice=0),則菜單公用處理程序不去改變的復(fù)選框的狀態(tài)。
下面的實(shí)例細(xì)述了有關(guān)菜單格式定義中“子功能ID”的使用方法 在實(shí)際使用中,會(huì)出現(xiàn)菜單功能間有關(guān)聯(lián),在其功能實(shí)際執(zhí)行時(shí)可以用同一個(gè)函數(shù)來(lái)執(zhí)行,只要能夠?yàn)楹瘮?shù)傳入不同的參數(shù)來(lái)區(qū)別要執(zhí)行的功能即可。為了幫助設(shè)計(jì)人員簡(jiǎn)化代碼,菜單資源定義格式中考慮了這種情況,在菜單總體信息中引入了“子功能ID”的信息。
菜單子功能ID其值可在0x01~0xFF之間任意定義 #define FUNC_ID10 x01 #define FUNC_ID20 x02 #define FUNC_ID30 x03 #define FUNC_ID40 x04 呼叫限制相關(guān)菜單功能函數(shù)聲明 extern void SS_CallBarringStatus(HWND hOwnerWnd,BYTE*pcChoice); extern void SS_CallBarringOn(HWND hOwnerWnd,BYTE*pcChoice); extern void SS_CallBarringOff(HWND hOwnerWnd,BYTE*pcChoice); 呼叫限制主菜單 constT_MENUITEMtCallBarringMenu[]= { {IDS_SET_MENU_CALLBARRING,0,0,(void*)tNetSetMenu}, 有兩個(gè)菜單項(xiàng),且都是下級(jí)子菜單 {IDS_SET_MENU_ALLCALLBARRING,SETMENUS_NORMAL,TRUE,(void*)tAllCallBarringMenu}, {IDS_SET_MENU_INTERCALL,SETMENUS_NORMAL,TRUE,(void*)tInterCallBarringMenu}, } 全部呼叫限制子菜單 constT_MENUITEMtAllCallBarringMenu[]= { 第一項(xiàng)本級(jí)菜單總體信息,本級(jí)菜單子功能ID是“FUNC_ID1”,父菜單指針是tCallBarringMenu{IDS_SET_MENU_ALLCALLBARRING,0,F(xiàn)UNC_ID1,(void*)tCallBarringMenu}, 第二項(xiàng)各菜單項(xiàng)信息{IDS_SET_MENU_CALLBARRINGSTAT,SETMENUS_NORMAL,F(xiàn)ALSE,(void*)SS_CallBarringStatus},{IDS_SET_MENU_CALLBARRINGON,SETMENUS_NORMAL,F(xiàn)ALSE,(void*)SS_CallBarringOn},{IDS_SET_MENU_CALLBARRINGOFF,SETMENUS_NORMAL,F(xiàn)ALSE,(void*)SS_CallBarringOff}, 本級(jí)菜單結(jié)束{0,0,0,NULL} }; 國(guó)際呼叫限制子菜單 constT_MENUITEM tInterCallBarringMenu[]= { 第一項(xiàng)本級(jí)菜單總體信息,本級(jí)菜單子功能ID是“FUNC_ID2”,父菜單指針是tCallBarringMenu{IDS_SET_MENU_INTERCALL,0,F(xiàn)UNC_ID2,(void*)tCallBarringMenu}, 第二項(xiàng)各菜單項(xiàng)信息{IDS_SET_MENU_CALLBARRINGSTAT,SETMENUS_NORMAL,F(xiàn)ALSE,(void*)SS_CallBarringStatus},{IDS_SET_MENU_CALLBARRINGON,SETMENUS_NORMAL,F(xiàn)ALSE,(void*)SS_CallBarringOn},{IDS_SET_MENU_CALLBARRINGOFF,SETMENUS_NORMAL,F(xiàn)ALSE,(void*)SS_CallBarringOff}, 本級(jí)菜單結(jié)束{0,0,0,NULL} }; 在上面的兩級(jí)菜單定義中,三個(gè)菜單功能執(zhí)行函數(shù)分別重復(fù)使用,當(dāng)執(zhí)行菜單項(xiàng)功能函數(shù)時(shí),菜單公用處理程序應(yīng)將子功能ID值傳入,這樣當(dāng)用戶(hù)在不同的菜單中點(diǎn)擊執(zhí)行某菜單項(xiàng)功能時(shí),其處理函數(shù)可以區(qū)分出是來(lái)自哪個(gè)菜單,從而做出相應(yīng)的處理。比如用戶(hù)在“國(guó)際呼叫限制”菜單中選擇執(zhí)行第一個(gè)菜單項(xiàng)功能查詢(xún)“呼叫限制狀態(tài)”,則執(zhí)行下面的代碼 cChoice=FUNC_ID2; SS_CallBarringStatus(hOwnerWnd,&cChoice); 這樣這個(gè)函數(shù)就通過(guò)第二個(gè)傳入?yún)?shù)知道,當(dāng)前要查詢(xún)的是“國(guó)際呼叫限制”的狀態(tài),同理當(dāng)cChoice=FUNC_ID1;時(shí),函數(shù)知道要查詢(xún)的是“全部呼叫限制”的狀態(tài)。進(jìn)而執(zhí)行不同的功能,避免了為兩個(gè)菜單項(xiàng)寫(xiě)不同處理函數(shù)的現(xiàn)象,從而節(jié)省了代碼量。其中,菜單功能函數(shù)的第一個(gè)參數(shù)是上級(jí)菜單的窗口句柄。
另一個(gè)使用例子 通話計(jì)費(fèi)菜單項(xiàng)功能函數(shù)聲明 extern void SS_CallCost(HWND hOwnerWnd,BYTE*pcChoice); 通話計(jì)費(fèi)菜單資源定義 const T_MENUITEMtStatisticSetMenu[]= { 第一項(xiàng)本級(jí)菜單總體信息,子功能ID為零值{IDS_SET_MENU_TIMEANDCOST,0,0,(void*)tSettingMenu}, 第二項(xiàng)各菜單項(xiàng)信息{IDS_SET_MENU_CALLCOSTCHECK,SETMENUS_NORMAL,F(xiàn)ALSE,(void*)SS_CallCost},{IDS_SET_MENU_CALLQUOTA,SETMENUS_NORMAL,F(xiàn)ALSE,(void*)SS_CallCost},{IDS_SET_MENU_COSTUNIT,SETMENUS_NORMAL,F(xiàn)ALSE,(void*)SS_CallCost}, 本級(jí)菜單定義結(jié)束{0,0,0,NULL} }; 在上面的這個(gè)菜單定義中,各菜單項(xiàng)功能函數(shù)均是同一個(gè)處理函數(shù),其菜單子功能ID為零。這種情況下,當(dāng)用戶(hù)選擇執(zhí)行其中某菜單項(xiàng)功能時(shí),菜單公用處理程序在調(diào)用菜單項(xiàng)功能函數(shù)時(shí),先檢查本級(jí)菜單的子功能ID是否是零值,若是零值,則傳入所執(zhí)行的菜單項(xiàng)排列序號(hào)(序號(hào)大于等于1),若不是零值,則將子功能ID傳入。
假定用戶(hù)選擇執(zhí)行第一個(gè)菜單項(xiàng),則執(zhí)行下面的代碼 cChoice=1; SS_CallCost(hOwnerWnd,&cChoice); 菜單項(xiàng)功能函數(shù)可以通過(guò)這個(gè)cChoice的值,知道用戶(hù)要執(zhí)行哪種操作,從而做出相應(yīng)的處理。也起到了節(jié)省代碼的目的。
三、菜單公用動(dòng)態(tài)內(nèi)存塊定義與使用方法 定義一個(gè)菜單公共內(nèi)存指針 T_SETMENUINFOR *g_pSetMenuInfo; 下面將以圖6為例,說(shuō)明這塊公用動(dòng)態(tài)內(nèi)存的使用。如圖中所示定義有三級(jí)菜單A、B、C,菜單A是第一級(jí)主菜單,菜單B是菜單A的子菜單,菜單C是菜單B的子菜單。
當(dāng)創(chuàng)建并顯示第一級(jí)菜單A時(shí),菜單公用處理程序申請(qǐng)一塊結(jié)構(gòu)類(lèi)型為T(mén)_SETMENUINFOR的動(dòng)態(tài)內(nèi)存,其指針由g_pSetMenuInfo保存。g_pSetMenuInfo=malloc(sizeof(T_SETMENUINFOR)); 將菜單裁剪標(biāo)志保存到動(dòng)態(tài)內(nèi)存第二項(xiàng)成員中,將菜單資源指針A保存到動(dòng)態(tài)內(nèi)存的第一項(xiàng)成員中,如圖5所示。
當(dāng)顯示第二級(jí)子菜單B時(shí),由于當(dāng)前屏幕菜單顯示的是菜單B,故將菜單資源指針B保存到動(dòng)態(tài)內(nèi)存的第一項(xiàng)成員中替換掉原來(lái)保存的指針A。同理,當(dāng)顯示子菜單C時(shí),動(dòng)態(tài)內(nèi)存第一項(xiàng)成員保存的是菜單資源指針C。即動(dòng)態(tài)內(nèi)存第一項(xiàng)成員中保存的始終是當(dāng)前所顯示菜單的資源指針。
當(dāng)銷(xiāo)毀菜單C時(shí),先從該動(dòng)態(tài)內(nèi)存的第一項(xiàng)成員中取出當(dāng)前菜單的資源指針,并由該資源指針?biāo)覆藛钨Y源的第一項(xiàng)總體信息的最后一項(xiàng)中,取得該級(jí)菜單的父菜單資源指針B,將這個(gè)指針B保存到動(dòng)態(tài)內(nèi)存的第一項(xiàng)成員中替換掉原來(lái)保存的指針C。菜單C銷(xiāo)毀后,被其覆蓋的菜單B就重新顯示出來(lái)。同理,當(dāng)銷(xiāo)毀子菜單B時(shí),其父菜單指針A被保存到動(dòng)態(tài)內(nèi)存的第一項(xiàng)成員中。當(dāng)銷(xiāo)毀菜單A時(shí),此時(shí)菜單A的總體信息中父菜單指針內(nèi)容為NULL,則表明菜單A已經(jīng)是最頂層的菜單,就在銷(xiāo)毀菜單A的同時(shí),通過(guò)free(g_pSetMenuInfo)函數(shù)釋放掉這塊菜單公用的動(dòng)態(tài)內(nèi)存。上述顯示和銷(xiāo)毀過(guò)程中,動(dòng)態(tài)內(nèi)存中數(shù)據(jù)變化過(guò)程如圖7所示。
在各級(jí)菜單的創(chuàng)建過(guò)程中,動(dòng)態(tài)內(nèi)存中第二項(xiàng)成員所保存的裁剪標(biāo)志也可以根據(jù)設(shè)備工作情況進(jìn)行修改的,這樣菜單的顯示就能根據(jù)實(shí)際情況進(jìn)行動(dòng)態(tài)調(diào)整更新,保證了菜單的靈活性 以上對(duì)本發(fā)明所提供的一種多級(jí)菜單實(shí)現(xiàn)方法進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體個(gè)例對(duì)本發(fā)明的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說(shuō)明只是用于幫助理解本發(fā)明的方法及其核心思想;同時(shí),對(duì)于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實(shí)施方式
及應(yīng)用范圍上均會(huì)有改變之處,綜上所述,本說(shuō)明書(shū)內(nèi)容不應(yīng)理解為對(duì)本發(fā)明的限制。
權(quán)利要求
1.一種多級(jí)菜單實(shí)現(xiàn)方法,其特征在于,包括以下步驟
a定義一組菜單資源數(shù)組,其中每個(gè)菜單資源數(shù)組保存有一級(jí)菜單創(chuàng)建時(shí)所需的資源信息,包含該級(jí)菜單資源指針、下級(jí)菜單資源指針;
b根據(jù)第一級(jí)菜單資源數(shù)組創(chuàng)建第一級(jí)菜單,并根據(jù)該數(shù)組中的下一級(jí)菜單資源指針找到第二級(jí)菜單資源數(shù)組,據(jù)此數(shù)組創(chuàng)建第二級(jí)菜單;
c依步驟b中所述方法根據(jù)菜單資源數(shù)組逐級(jí)創(chuàng)建其它各級(jí)菜單。
2.如權(quán)利要求1所述多級(jí)菜單實(shí)現(xiàn)方法,其特征在于,所述菜單資源數(shù)組還包括父菜單資源指針、裁剪標(biāo)識(shí)、功能函數(shù)指針及子功能函數(shù)的識(shí)別標(biāo)識(shí)。
3.如權(quán)利要求2所述多級(jí)菜單實(shí)現(xiàn)方法,其特征在于,所述方法還包括申請(qǐng)一塊動(dòng)態(tài)內(nèi)存,用來(lái)保存當(dāng)前菜單的菜單資源指針及裁剪標(biāo)識(shí);其中,當(dāng)前菜單是指顯示在最前端的菜單。
4.如權(quán)利要求3所述多級(jí)菜單實(shí)現(xiàn)方法,其特征在于,所述方法還包括顯示第n級(jí)菜單時(shí),將其菜單資源指針保存到所述動(dòng)態(tài)內(nèi)存中,替換掉之前保存的第n-1級(jí)菜單資源指針。
5.如權(quán)利要求3所述多級(jí)菜單實(shí)現(xiàn)方法,其特征在于,所述步驟c之后還包括從子菜單到父菜單逐級(jí)銷(xiāo)毀各級(jí)菜單,銷(xiāo)毀方法進(jìn)一步包括
①銷(xiāo)毀第n級(jí)菜單,所述第n級(jí)菜單為當(dāng)前菜單;
②從動(dòng)態(tài)內(nèi)存中獲取第n級(jí)菜單的菜單資源指針,再根據(jù)該指針找到第n級(jí)菜單對(duì)應(yīng)的菜單資源數(shù)組,從中獲取父菜單資源指針,將其保存于動(dòng)態(tài)內(nèi)存中,替換掉之前保存的第n級(jí)菜單資源指針。
6.如權(quán)利要求4所述多級(jí)菜單實(shí)現(xiàn)方法,其特征在于,所述方法還包括從外部輸入裁剪標(biāo)識(shí),判斷該裁剪標(biāo)識(shí)是否與動(dòng)態(tài)內(nèi)存中保存的裁剪標(biāo)識(shí)相同,若相同,則隱藏當(dāng)前菜單。
全文摘要
本發(fā)明公開(kāi)了一種多級(jí)菜單實(shí)現(xiàn)方法,包括以下步驟a.定義一組菜單資源數(shù)組,其中每個(gè)菜單資源數(shù)組保存有一級(jí)菜單創(chuàng)建時(shí)所需的資源信息,包含該級(jí)菜單資源指針、下級(jí)菜單資源指針;b.根據(jù)第一級(jí)菜單資源數(shù)組創(chuàng)建第一級(jí)菜單,并根據(jù)該數(shù)組中的下一級(jí)菜單資源指針找到第二級(jí)菜單資源數(shù)組,據(jù)此數(shù)組創(chuàng)建第二級(jí)菜單;c.依步驟b中所述方法根據(jù)菜單資源數(shù)組逐級(jí)創(chuàng)建其它各級(jí)菜單。本發(fā)明通過(guò)定義一組帶有父子關(guān)系的菜單資源指針的菜單資源數(shù)組及一公用的動(dòng)態(tài)內(nèi)存來(lái)實(shí)現(xiàn)菜單的層級(jí)關(guān)系控制及菜單功能處理,對(duì)這些菜單采取逐級(jí)進(jìn)入和逐級(jí)銷(xiāo)毀策略,可以定義任意深度的菜單,降低設(shè)計(jì)人員的工作量,同時(shí)也保證了菜單的靈活性。
文檔編號(hào)G06F9/44GK101126978SQ200710077370
公開(kāi)日2008年2月20日 申請(qǐng)日期2007年9月25日 優(yōu)先權(quán)日2007年9月25日
發(fā)明者曾志剛 申請(qǐng)人:康佳集團(tuán)股份有限公司