




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、mtk平平臺mmmi培訓(xùn)訓(xùn)資料(中文)20088-066-066 211:488本文詳細(xì)細(xì)說明了了如何建建設(shè)一個個自定義義列表窗窗體模板板。原理理部分請請參見MMTK平平臺(11)如何添添加一個個窗體模模板。最終實(shí)實(shí)現(xiàn)的是是一個字字典輸入入界面。布局為為:該模模板不包包含業(yè)務(wù)務(wù)邏輯,僅僅提供頁頁面顯示示和InnputtBoxx框輸入入事件后后的LiistBBox的的Reddraww事件的的注冊,以以及基本本的輸入入法設(shè)置置、清空空后的返返回函數(shù)數(shù)。一、添加用用戶自定定義列表表模板的的過程(一一)在gg_caateggoriies_conntrools_mapp中中加入:,MMMI_CATTEG
2、OORY_CUSSTOMM_LIIST,(U88*)ccusttom_deffinee_liist,(s116*)cooordiinatte_ccusttom_lisst,NNULLLconsst UU8 ccusttom_deffinee_liist= 5, DDM_BBASEE_LAAYERR_STTARTT, DDM_SSCR_BG, DMM_BAASE_CONNTROOL_SSET11, DDM_SSINGGLELLINEE_INNPUTTBOXX1, DM_LISST1;consst SS16 cooordiinatte_ccusttom_lisst= DMM_FUULL_SCRRE
3、ENN_COOORDDINAATE_FLAAG, DM_CUSSTOMM_DEEFINNE_IINPUUTBOOX, /需要定定義 DDM_CCUSTTOM_DEFFINEE_LIIST /需要要定義;(二)在在dm_gett_cooorddinaatess()函函數(shù)中加加入:/設(shè)定定列表位位置和大大小(不不要忘記記全局變變量 MMMI_cusstomm_Liistbbox_x 等等的定義義)ellse if( *UUICttrlAAcceessPPtr_p = DDM_CCUSTTOM_DEFFINEE_LIIST ) dm_cooordiinatte_iinfoo-ss16XX = MMI
4、I_cuustoom_LListtboxx_x; dm_cooordiinatte_iinfoo-ss16YY = MMII_cuustoom_LListtboxx_y; dm_cooordiinatte_iinfoo-ss16WWidtth = MMMI_ccusttom_Lisstboox_wwidtth; ddm_ccoorrdinnatee_innfo-s116Heeighht = MMMI_ccusttom_Lisstboox_hheigght; dm_cooordiinatte_iinfoo-FFlaggs = DMM_NOO_FLLAGSS;UIICtrrlAcccesssPtt
5、r_pp + ;/設(shè)設(shè)定輸入入框位置置和大小小elsse iif( *UIICtrrlAcccesssPttr_pp = DMM_CUUSTOOM_DDEFIINE_INPPUTBBOX ) dm_cooordiinatte_iinfoo-ss16XX = MMII_cuustoom_iinpuutboox_xx ; dm_cooordiinatte_iinfoo-ss16YY = MMII_cuustoom_iinpuutboox_yy; ddm_ccoorrdinnatee_innfo-s116Wiidthh = MMII_cuustoom_iinpuutboox_wwidtth ;ddm
6、_ccoorrdinnatee_innfo-s116Heeighht = MMMI_ccusttom_inpputbbox_heiightt; ddm_ccoorrdinnatee_innfo-Fllagss = DM_SINNGLEE_LIINE_INPPUTBBOX_SPEECIFFIC_HEIIGHTT; UIICtrrlAcccesssPttr_pp + ;(三)在在Wguui_ccateegorry.cc中定義義模板顯顯示函數(shù)數(shù)voiid SShowwCattegooryCCusttomLListtScrreenn( U8 *tiitlee, U166 tiitlee_iccon,
7、UU16 lefft_ssofttkeyy, U166 leeft_sofftkeey_iiconn, U166 riightt_sooftkkey, UU16 rigght_sofftkeey_iiconn, S322 nuumbeer_oof_iitemms, U88 *lisst_oof_iitemms, U116 *lisst_oof_iiconns, S332 fflaggs, S332 hhighhligghteed_iitemm, U8 *hiistoory_buffferr) /*-*/ /* Loocall Vaariaablees */ /*-*/ dmm_daata_st
8、rructt dmm_daata; S332 ii; UU8 hh_fllag; /*-*/ /* Coode Boddy */ /*-*/ gddi_llayeer_llockk_frramee_buuffeer(); SettupCCateegorryKeeyHaandllerss(); MMMI_ttitlle_sstriing = (UI_strringg_tyype) tiitlee; MMMI_tittle_icoon = (PPU8) geet_iimagge(ttitlle_iiconn); cchannge_lefft_ssofttkeyy(leeft_sofftkeey,
9、lefft_ssofttkeyy_iccon); cchannge_rigght_sofftkeey(rrighht_ssofttkeyy, rrighht_ssofttkeyy_iccon);/Crreatte LListt ccreaate_fixxed_icoonteext_mennuittemss(); asssocciatte_ffixeed_iiconntexxt_llistt(); ShhowLListtCattegoorySScreeen( (UI_strringg_tyype) tiitlee, gett_immagee(tiitlee_iccon), gett_sttrin
10、ng(lleftt_sooftkkey), gett_immagee(leeft_sofftkeey_iiconn), geet_sstriing(rigght_sofftkeey), gget_imaage(rigght_sofftkeey_iiconn), nuumbeer_oof_iitemms); forr (ii = 0; i = (MMII_siinglleliine_inpputbbox.avaailaablee_leengtth - ENNCODDINGG_LEENGTTH) reeturrn; ggui_sinnglee_liine_inpput_boxx_innserrt_
11、mmulttitaap_ccharractter(&MMMI_ssingglellinee_innputtboxx, cc); reddraww_siinglleliine_inpputbbox(); sinngleelinne_iinpuutboox_iinpuut_ccalllbacck(); ssingglellinee_innputtboxx_cuustoom_iinpuut_ccalllbacck();(五)WWguii_Caateggoryy.c中中添加用用戶事件件定義接接口/右鍵事事件注冊冊voiid SSetCCateegorryCuustoomLiistRRighhtSoof
12、tkkeyFFuncctioon(vvoidd (*f) (vooid) wggui_sinngleelinne_iinpuutboox_RRSK_funnctiion = ff;/keey_00到keey_99按下時時的事件件注冊eexteern voiid (*siinglleliine_inpputbbox_cusstomm_innputt_caallbbackk) (voiid);voiid SSetCCateegorryCuustoomLiistNNumKKeyFFuncctioon(vvoidd (*f) (vooid)sinngleelinne_iinpuutboox_ccust
13、tom_inpput_calllbaack = ff ;/設(shè)置置InpputBBox大大小vooid SettCusstommLisst_IInpuutboox_SSizee(S332 pp_x , SS32 p_yy , S322 p_widdth , SS32 p_hheigght )MMII_cuustoom_iinpuutboox_xx = p_xx ;MMMI_cusstomm_innputtboxx_y = pp_y ;MMMI_ccusttom_inpputbbox_widdth = pp_wiidthh ;MMMI_cusstomm_innputtboxx_heeighht =
14、 p_heiightt ;/設(shè)設(shè)置LiistBBox大大小vooid SettCusstommLisst_LListtboxx_Siize(S322 p_x , S332 pp_y , SS32 p_wwidtth , S332 pp_heeighht )MMII_cuustoom_LListtboxx_x = pp_x ;MMMI_ccusttom_Lisstboox_yy = p_yy ;MMMI_cusstomm_Liistbbox_widdth = pp_wiidthh ;MMMI_cusstomm_Liistbbox_heiightt = p_hheigght ;二、自定定義列表表模
15、板的的使用方方法1、 調(diào)調(diào)用SeetCuustoomLiist_Inpputbbox_Sizze 和和 SeetCuustoomLiist_Lisstboox_SSizee 設(shè)置置列表框框和輸入入框的大大小。22、 調(diào)調(diào)用顯示示窗體的的接口 ShoowCaateggoryyCusstommLisstSccreeen。33、 調(diào)調(diào)用右鍵鍵事件注注冊函數(shù)數(shù),注冊冊文本框框被清空空后的事事件(如如返回等等)SeetCaateggoryyCusstommLisstRiighttSofftkeeyFuuncttionn。4、 調(diào)用用keyy_0至至keyy_9的的事件注注冊函數(shù)數(shù),SeetCaategg
16、oryyCusstommLisstNuumKeeyFuuncttionn()。三、參數(shù)數(shù)詳細(xì)說說明 vooid SettCusstommLisst_IInpuutboox_SSizee(S332 pp_x , SS32 p_yy , S322 p_widdth , SS32 p_hheigght ) 與與 voiid SSetCCusttomLListt_Liistbbox_Sizze(SS32 p_xx , S322 p_y , S332 pp_wiidthh , S322 p_heiightt )pp_x , pp_y :起始始位置pp_wiidthh , p_hheigght : 大大小
17、。 vooid SettCattegooryCCusttomLListtRigghtSSofttkeyyFunnctiion(voiid (*f) (vvoidd) vvoidd SeetCaateggoryyCusstommLisstNuumKeeyFuuncttionn(vooid (*ff) (voiid) f(vvoidd) :函數(shù)地地址。 vooid ShoowCaateggoryyCusstommLisstSccreeen( U88 *ttitlle, / 標(biāo)題文文本指針針 UU16 tittle_icoon, / 標(biāo)標(biāo)題圖標(biāo)標(biāo)ID U116 lleftt_sooftkkey, /
18、 左左鍵文本本ID U116 lleftt_sooftkkey_icoon, / 左鍵圖圖標(biāo)IDD UU16 rigght_sofftkeey, / 右鍵鍵文本IID U166 riightt_sooftkkey_icoon, / 右鍵圖圖標(biāo)IDD UU8* cusstomm_siinglle_iinpuut_bbufffer, / Innputt輸入BBufffer S332 nnumbber_of_iteems, / 列表表?xiàng)l目數(shù)數(shù) UU8 *liist_of_iteems, / 列列表項(xiàng)文文本指針針數(shù)組 U116 *lisst_oof_iiconns, / 列表表項(xiàng)Iccon S332
19、hhighhligghteed_iitemm, / 當(dāng)當(dāng)前高亮亮顯示的的列表?xiàng)l條目 U8 *hiistoory_buffferr) / 歷史記記錄Buuffeer附:所需需更改的的文件wwguii.cwwguii_caateggoriies.cwggui_draaw_mmanaagerr.cwwguii_innputts.ccwguui.hhwguui_ccateegorriess_deefs.hwggui_draaw_mmanaagerr.hCCusttCooordiinatte.cc一、什么么是Hiistoory管管理 對于我我們上層層用戶而而言,經(jīng)經(jīng)常接觸觸到的HHisttoryy管理是
20、是這樣的的: vvoidd EnntryyFunnc()U8 *guuiBuuffeer; EnntryyNewwScrreenn( SScreeen_ID , EExitt_Fuunc , EEntrry_FFuncc , NULLL ); gguiBBufffer = GGetCCurrrGuiiBuffferr( SSCR_ID_WORRDMAAIN_LISST ); ShhowCCateegrooyXXXScrreenn( TTitlle_IID , , gguiBBufffer); 但是,無無論是EEntrryNeewSccreeen的調(diào)調(diào)用,還還是guuiBuuffeer的傳傳入,
21、我我們都很很少考慮慮過對這這些指針針和函數(shù)數(shù)在GUUI的管管理起到到了什么么樣的作作用。下下面我們們就要了了解,以以上的代代碼與HHisttoryy管理之之間存在在的關(guān)系系。 在MTTK環(huán)境境中,每每當(dāng)我們們進(jìn)入一一個窗口口,系統(tǒng)統(tǒng)將先提提取前一一個窗口口需保留留的數(shù)據(jù)據(jù)。這些些數(shù)據(jù)包包括:11. 窗窗口IDD ;22. 進(jìn)進(jìn)入窗口口時調(diào)用用的函數(shù)數(shù)和退出出調(diào)用的的函數(shù) - Exiit_FFuncc 和 Enttry_Funnc ;3. 組成窗窗體的控控件的屬屬性(如如,列表表控件當(dāng)當(dāng)前高亮亮顯示的的條目、當(dāng)前屏屏的首末末條目等等)。舉例說明明這些數(shù)數(shù)據(jù)在實(shí)實(shí)際中是是如何被被使用的的。假設(shè)設(shè)存
22、在AAB兩個個窗口,AA窗口需需要保留留的數(shù)據(jù)據(jù)為daata_A。我我們先從從A窗口口進(jìn)入到到B窗口口。daata_A將在在B窗口口調(diào)用EEntrryNeewSccreeen()的時候候,被壓壓入一個個結(jié)構(gòu)類類似于棧棧的數(shù)據(jù)據(jù)存儲區(qū)區(qū)域;當(dāng)當(dāng)從B調(diào)調(diào)用GooBacckHiistoory()返回回A時,ddataa_A從從棧頂被被彈出,然然后A利利用daata_A將自自身還原原到其進(jìn)進(jìn)入B之之前的狀狀態(tài)。這這就是HHisttoryy管理的的作用。簡言之之,就是是要保持持窗口的的外觀狀狀態(tài)。二、Hiistoory管管理的機(jī)機(jī)制 現(xiàn)在,我我們來了了解一下下前面所所說的ddataa_A的的數(shù)據(jù)結(jié)結(jié)構(gòu)是
23、什什么樣的的。tyypeddef strructt _hhisttoryy U116 sscrnnID; /(1)SScreeen ID (窗口口號) FunncPttr eentrryFuuncPPtr; /(2)EEntrryNeewSccreeen時要要進(jìn)入的的 Enntryy_Fuunc U8 inpputBBuffferMAXX_INNPUTT_BUUFFEER; /(3)沒沒遇到過過其使用用,都是是NULLL。 U8 guiiBuffferrMAAX_GGUI_BUFFFERR; /(44)窗體體中控件件的一些些需保存存的信息息的Buuffeer,通通常/在使用用時被轉(zhuǎn)轉(zhuǎn)化成各各控
24、件自自定義的的結(jié)構(gòu)體體如: lisst_mmenuu_caateggoryy_hiistoory。 hhisttoryy;而存放放datta_AA的類似似于堆棧棧的數(shù)據(jù)據(jù)區(qū)則以以全局變變量的形形式定義義在系統(tǒng)統(tǒng)中:hhisttoryyNodde hhisttoryyDattaMMAX_HISSTORRY; (MMAX_HISSTORRY = 500):設(shè)當(dāng)前窗窗口A所所對應(yīng)的的數(shù)據(jù)是是hisstorryDaata EnntryyScrreennNumm 1 ,那那么它是是何時、是如何何被賦值值的?又又是何時時、如何何被使用用的?經(jīng)經(jīng)過跟蹤蹤調(diào)試,我我們已經(jīng)經(jīng)知道,在在由窗口口A進(jìn)入入到窗口口B
25、(調(diào)調(diào)用EnntryyNewwScrreenn)的時時候,我我們將ddataa_A記記錄到了了hisstorryNoode 的結(jié)構(gòu)構(gòu)體變量量中。但但是,在在EnttryNNewSScreeen的的時候傳傳入的,卻卻是daata_B,ddataa_A是是如何被被記錄和和使用的的呢?我們摘選選EnttryNNewSScreeen的的子函數(shù)數(shù)中所包包含的較較核心的的代碼來來說明這這個問題題。這三三段代碼碼是按照照現(xiàn)在的的排放順順序來執(zhí)執(zhí)行的。第一段段(hiistoory h 可可理解為為datta_AA): h.sscrnnID = sscrnnID; / sscrnnID = ccurrrExii
26、tSccrnIID hh.enntryyFunncPttr = enntryyFunncPttr; / enttryFFunccPtrr = currrEnntryyFunncPttr ppfnUUniccodeeStrrcpyy(SS8*) h.inpputBBufffer, (SS8*) & nHiistoory); / nHHisttoryy = NULLL ; GGetCCateegorryHiistoory(h.gguiBBufffer);/GeetCaateggoryyHisstorry是指指向獲取取/gguiBBufffer的的函數(shù)的的指針 AdddHisstorry(hh);
27、/數(shù)據(jù)據(jù)入棧第第二段:if(currrExxitFFunccPtrr) / (*cuurrEExittFunncPttr) (); /執(zhí)執(zhí)行Exxit_Funnc 第三段段(記錄錄Scrreenn_IDD,Exxit_Funnc和EEntrryFuunc):cuurrEExittScrrnIDD = scrrnIDD; ccurrrExiitFuuncPPtr = eexittFunncPttr; currrEnntryyFunncPttr = enntryyFunncPttr;這這樣,我我們就可可以看出出,EnntryyNewwScrreenn函數(shù)先先將上次次執(zhí)行EEntrryNeewScc
28、reeen時所所記錄的的currrExxitSScrnnID, cuurrEEntrryFuuncPPtr以以hisstorry結(jié)構(gòu)構(gòu)為載體體記錄入入棧;然然后執(zhí)行行了記錄錄中的ccurrrExiitFuuncPPtr;最后將將本窗口口的sccrnIID、eexittFunncPttr、eentrryFuuncPPtr分分別記錄錄入全局局變量ccurrrExiitSccrnIID、ccurrrExiitFuuncPPtr和和currrEnntryyFunncPttr,留留待下次次調(diào)用EEntrryNeewSccreeen時使使用。下面有數(shù)數(shù)據(jù)出入入棧流程程,有興興趣的話話可以跟跟蹤一下下。以先
29、先后順序序代表包包含關(guān)系系,如下下:1.入棧(EnttryNNewSScreeen):(11)U88 EnntryyNewwScrreenn(U116 nnewsscrnnID, FuuncPPtr newwExiitHaandller, FuuncPPtr newwEnttryHHanddlerr, vvoidd *ppeerrBuff)(22)sttatiic vvoidd ExxecuuteCCurrrExiitHaandller(voiid);(3)voiid EExeccuteeCurrrExxitHHanddlerr_Exxt(vvoidd);(4)vvoidd Geenerric
30、EExittScrreenn( UU16 scrrnIDD , FunncPttr eentrryFuuncPPtr );(5)vvoidd AdddHiistooryRRefeerennce(hisstorry *adddHisstorry); /處理hhisttoryyDatta(66)S116 iincrremeent(); /更改改棧指針針2.出出棧(GGoBaackHHisttoryy):(1)vvoidd GooBacckHiistoory(voiid);(2)staaticc vooid ExeecuttePoopHiistoory(voiid); /處理理hisstorryDa
31、ata(3)sstattic U8 deccremmentt(vooid); /更更改棧指指針現(xiàn)在我們們已經(jīng)知知道了hhisttoryy 的三三個結(jié)構(gòu)構(gòu)體成員員是如何何記錄的的了,最最后來重重點(diǎn)看一一下hiistoory.guiiBuffferr是如何何被記錄錄和使用用的。三、GUUI BBufffer對對控件屬屬性的記記錄 由由上2節(jié)節(jié)我們知知道,gguiBBufffer是是窗體中中某些控控件的需需保存的的屬性的的Buffferr,通常常在使用用時被轉(zhuǎn)轉(zhuǎn)化成各各控件自自定義的的結(jié)構(gòu)體體。如: liist_mennu_ccateegorry_hhisttoryy?,F(xiàn)在在有幾個個問題需需要我們們
32、解答:1. guiiBuffferr 指向向的Buuffeer是如如何被分分配的?該塊數(shù)數(shù)據(jù)是動動態(tài)的還還是靜態(tài)態(tài)的?22. 這這塊 BBufffer 是何時時被寫入入數(shù)據(jù)的的?3. 如何何釋放(動態(tài)分分配時)或清空空(固定定地址時時)該塊塊 Buuffeer ?讓我們逐逐一解答答上面的的三個問問題,以以清晰我我們對gguiBBufffer的的認(rèn)識。1. 答:在在voiid AAddHHisttoryyReffereencee(hiistoory *adddHiistoory)中,調(diào)調(diào)用OsslMaallooc(MMAX_GUII_BUUFFEER)動動態(tài)申請請了一塊塊內(nèi)存,用用來保存存在 G
33、GeneericcExiitSccreeen 中中獲取的的hisstorry.gguiBBufffer。參見見出入棧棧流程2. 如如何釋放放(動態(tài)態(tài)分配時時)或清清空(固固定地址址時)該該塊 BBufffer ?答 :在sstattic voiid ddecrremeent (vooid)函數(shù)中中,該bbufffer被被釋放: OsslMffreee(hiistooryDDataacuurrHHisttoryyInddex.guuiBuuffeer);。參參見出入入棧流程程3. 答答 : 只要一一個窗體體模板有有需要保保存狀態(tài)態(tài)的控件件,它們們都調(diào)用用了這個個函數(shù)dmm_seetupp_caa
34、teggoryy_fuuncttionns()。函數(shù)數(shù)定義如如下:vvoidd dmm_seetupp_caateggoryy_fuuncttionns( FuuncPPtr reddraww_fuuncttionn, U8 *(*gett_hiistoory_funnctiion) (UU8 *buffferr), S332(*gett_hiistoory_sizze_ffuncctioon) (vooid)/指指向窗體體重畫函函數(shù)的函函數(shù)指針針 ReedraawCaateggoryyFunnctiion = rredrraw_funnctiion;/指指向獲取取窗體gguiBBufffer
35、的的函數(shù)指指針 GGetCCateegorryHiistoory = gget_hisstorry_ffuncctioon;/指向向獲取窗窗體guuiBuuffeer大小小的函數(shù)數(shù)指針 GettCattegooryHHisttoryySizze = geet_hhisttoryy_siize_funnctiion;在只有有一個控控件的狀狀態(tài)需要要保存的的窗體中中,會這這樣傳參參給這個個函數(shù):dm_settup_cattegoory_funnctiionss(dmm_reedraaw_ccateegorry_sscreeen, dmm_geet_ccateegorry_hhisttoryy, d
36、dm_gget_cattegoory_hisstorry_ssizee);GGeneericcExiitSccreeen()函數(shù)中中,將使使用 GGetCCateegorryHiistoory()獲取取某個控控件的GGuiBBufffer參見出出入棧流流程。如果按按照上面面的設(shè)置置,GeetCaateggoryyHisstorry指向向了dmm_geet_ccateegorry_hhisttoryy這個函函數(shù)??纯纯催@個個函數(shù)做做了什么么:coontrrol_sett_pttr = dmm_seearcch_cconttroll_seet(U166) pp_dmm_daata-s332Caat
37、Idd, &cooordiinatte_sset_p); /獲取窗窗體模板板內(nèi)的控控件類型型數(shù)組cconttroll_seet_pptruu8NooOfUUICttrlss = conntrool_sset_ptrr0; /獲取取數(shù)組內(nèi)內(nèi)變量個個數(shù),即即控件的的個數(shù)/*根據(jù)據(jù)控件類類型,獲獲取控件件的guuiBuuffeer.值值得注意意的是,11.這里里的hiistrroy_Buffferr的名稱稱起的不不好,應(yīng)應(yīng)該起名名為guuiBuuffeer,不不應(yīng)混淆淆視聽;2.最最終hiistoory_buffferr 將指指向模板板中定義義的最后后一個控控件的gguiBBufffer*/foor
38、 (u8CCtrllCt = 11; uu8CttrlCCt s322CattId, hiistoory_buffferr); breeak; casse DDM_LLISTT1: gett_liist_mennu_ccateegorry_hhisttoryy(UU16) p_dm_datta-s322CattId, hiistoory_buffferr); brreakk; caase DM_DYNNAMIIC_LLISTT1: geet_llistt_meenu_cattegoory_hisstorry(U166) pp_dmm_daata-s332CaatIdd, hhisttoryy_
39、buuffeer); breeak; ccasee DMM_ASSYNCCDYNNAMIIC_LLISTT1: gget_lisst_mmenuu_caateggoryy_hiistoory(U116) p_ddm_ddataa-ss32CCatIId, hisstorry_bbufffer); brreakk; /./.而在模模版顯示示函數(shù)(ShoowCaateggroyyXXSScreeen)中,則則根據(jù) guiibuffferr 的情情況設(shè)置置控件的的屬性。如果 guiibuffferr 不為為空,則則說明該該模板的的顯示函函數(shù)是在在GoBBackkHisstorry()的時候候被調(diào)用用
40、的,而而不是進(jìn)進(jìn)入新窗窗口時被被調(diào)用的的。那么么控件必必然有一一些保留留的屬性性需要被被還原。以6號號窗口的的Lisst為例例。在SShowwCattegoory66Scrreenn()中中,調(diào)用用下面的的函數(shù)來來恢復(fù)LListt設(shè)置:h_fflagg = sett_liist_mennu_ccateegorry_hhisttoryy(MMMI_CCATEEGORRY6_ID, hiistoory_buffferr);這這樣guuiBuuffeer的GGet和和Sett就統(tǒng)一一起來了了。現(xiàn)在,我我們已經(jīng)經(jīng)知道了了guiiBuffferr 所起起到的作作用。但但是,如如果一個個窗體模模板內(nèi)有有兩
41、個或或兩個以以上需要要記錄狀狀態(tài)的控控件,又又該怎么么辦呢?ps:該死的的字?jǐn)?shù)限限制,只只能把剩剩下的放放到MMTK平平臺(33)Hisstorry管理理下了。四、靈活活使用gguiBBufffer在我們自自己設(shè)計(jì)計(jì)窗體模模板時,經(jīng)經(jīng)常會出出現(xiàn)一個個窗體中中有多個個控件的的情況。但是,如如果一個個窗體中中有兩個個控件、卻依然然調(diào)用ddm_gget_cattegoory_hisstorry()獲取控控件的GGuiBBufffer的的話,就就會出現(xiàn)現(xiàn)問題。比如,我我們在制制作CuustoomLiist窗窗體時,初初期使用用了這樣樣的代碼碼:(11)模板板中的組組件設(shè)置置:coonstt U88 c
42、uustoom_ddefiine_lisst= 55, DM_BASSE_LLAYEER_SSTARRT, DMM_SCCR_BBG, DMM_BAASE_CONNTROOL_SSET11, DM_SINNGLEELINNE_IINPUUTBOOX1, /單單行輸入入控件 DMM_LIIST11 /列表表控件;(2)窗窗體顯示示函數(shù) ShoowCaateggoryyCusstommLisstSccreeen 部部分源碼碼:vooid ShoowCaateggoryyCusstommLisstSccreeen(.,U8 * gguiBBufffer)/. /根據(jù) MMII_CAATEGGORYY
43、_CUUSTOOM_LLISTT 的 guiiBuffferr,為全全局結(jié)構(gòu)構(gòu)體變量量 /MMII_fiixedd_liist_mennu賦值值.h_flaag = seet_llistt_meenu_cattegoory_hisstorry(MMMI_CATTEGOORY_CUSSTOMM_LIIST, guuiBuuffeer);/而而后利用用MMII_fiixedd_liist_mennu,設(shè)設(shè)置liist的的屬性iif (h_fflagg)fixxed_lisst_ggotoo_ittem_no_reddraww(MMMI_ffixeed_llistt_meenu.higghliigh
44、tted_iteem);elsse fixxed_lisst_ggotoo_ittem_no_reddraww(hiighllighhtedd_ittem);/./再再設(shè)置單單行輸入入框的屬屬性wggui_settup_sinngleelinne_iinpuutboox( 00, 0, 2400, 3220, ccusttom_sinnglee_innputt_buuffeer, 550, MMMI_CATTEGOORY_CUSSTOMM_LIIST, gett_sttrinng(rrighht_ssofttkeyy), gget_imaage(rigght_sofftkeey_iiconn)
45、, IINPUUT_TTYPEE_ALLPHAANUMMERIIC_LLOWEERCAASE| INNPUTT_TYYPE_USEE_ONNLY_ENGGLISSH_MMODEES, gguiBBufffer, 0);/其中中 wggui_settup_sinngleelinne_iinpuutboox 函函數(shù)中調(diào)調(diào)用了 /sset_sinngleelinne_iinpuutboox_ccateegorry_hhisttoryy()來來解析gguiBBufffer/.dmm_seetupp_caateggoryy_fuuncttionns(ddm_rredrraw_cattegoory_scr
46、reenn, ddm_gget_cattegoory_hisstorry, dm_gett_caateggoryy_hiistoory_sizze);/. 繼續(xù)續(xù)使用前前3節(jié)的的假設(shè)。窗口AA使用了了 CuustoomLiist 窗體模模板。 從A 進(jìn)入到到B 時時,EnntryyNewwScrreenn函數(shù)調(diào)調(diào)用了我我們設(shè)置置的獲取取guiiBuffferr函數(shù)ddm_gget_cattegoory_hisstorry ,它它先保存存了A中中InpputBBox的的屬性,再再保存AA中Liist的的屬性 此時它它將把輸輸入框的的屬性覆覆蓋掉。當(dāng)從BB窗口返返回到AA窗口時時,ShhowCCa
47、teegorryCuustoomLiistSScreeen()函數(shù)數(shù)先把hhisttoryy_buuffeer傳給給了 sset_lisst_mmenuu_caateggoryy_hiistoory , 由由于guuiBuuffeer中存存儲的是是Lisst的數(shù)數(shù)據(jù),因因此在交交付fiixedd_liist_gotto_iitemm_noo_reedraaw 進(jìn)進(jìn)行設(shè)置置屬性的的時候,不會出出現(xiàn)問題題。但 wguui_ssetuup_ssingglellinee_innputtboxx()就就會因?yàn)闉間uiiBuffferr中存儲儲的不是是輸入框框存儲的的數(shù)據(jù)而而出現(xiàn)錯錯誤。因因此,權(quán)權(quán)宜之計(jì)
48、計(jì)是,將將更改傳傳給wggui_settup_sinngleelinne_iinpuutboox的入入?yún)? wguui_ssetuup_ssingglellinee_innputtboxx( 0, 0, 2240, 3200, cuustoom_ssinggle_inpput_buffferr, 500, MMMI_CCATEEGORRY_CCUSTTOM_LISST, gget_strringg(riightt_sooftkkey), geet_iimagge(rrighht_ssofttkeyy_iccon), INNPUTT_TYYPE_ALPPHANNUMEERICC_LOOWERRC
49、ASSE | INNPUTT_TYYPE_USEE_ONNLY_ENGGLISSH_MMODEES, NNULLL, 0); 這樣,雖然死死機(jī) bbug 避免了了,但是是特定情情況下 InpputBBox 需要保保存的屬屬性,將將全部丟丟失掉.因此,更加合合適的做做法是,提取 dm_settup_cattegoory_funnctiionss()中中使用的的函數(shù)接接口:gget_sinngleelinne_iinpuutboox_ccateegorry_hhisttoryygeet_llistt_meenu_cattegoory_hisstorry 這這樣可以以分別獲獲取 iinpuutboo
50、x 和和 liist 的屬性性,然后后將得到到的兩個個屬性的的數(shù)據(jù)連連續(xù)存放放在一塊塊動態(tài)分分配的BBufffer中中.如2200號號窗口的的GettCattegrroyHHisttoryy函數(shù)所所示:UU8 *GettCattegoory2200HHisttoryy(U88 *hhisttoryy_buuffeer)S322 s;gget_lisst_mmenuu_caateggoryy_hiistoory(MMII_CAATEGGORYY2000_IDD, hhisttoryy_buuffeer);s = siizeoof(llistt_meenu_cattegoory_hisstorry
51、);s = (ss + 3) / 44;s *= 4;gget_sinngleelinne_iinpuutboox_ccateegorry_hhisttoryy(MMMI_CCATEEGORRY2000_IID, (U88*) (hiistoory_buffferr + s), MMMI_ccurrrentt_innputt_tyype);reeturrn (hisstorry_bbufffer);要要注意的的問題是是,系統(tǒng)統(tǒng)為guuiBuuffeer分配配空間時時,依據(jù)據(jù)的是 MAXX_GUUI_BBUFFFER,而不是是 dmm_seetupp_caateggoryy_fuuncttion
52、ns()所指定定的獲取取guiiBuffferr大小的的函數(shù)GGetCCateegorryHiistoorySSizee.而且且系統(tǒng)中中從未使使用過該該函數(shù)指指針?biāo)钢赶虻暮瘮?shù)。奇奇怪的是是 所有窗窗體模板板的制作作者都兢兢兢業(yè)業(yè)業(yè)地制作作了這個個獲取gguiBBufffer大大小的函函數(shù)。在在2000號窗口口里,獲獲取guuiBuuffeer大小小的函數(shù)數(shù)如下:S322 GeetCaateggoryy2000HisstorrySiize(voiid)retturnn (siizeoof(llistt_meenu_cattegoory_hisstorry) + 33) / 4) * 4 +
53、siizeoof(ssingglellinee_innputtboxx_caateggoryy_hiistoory);如果怕怕出錯且且不怕麻麻煩的話話,也可可以未雨雨綢繆的的寫一個個這樣的的函數(shù),但但恐怕多多半是用用不上的的。最后后的任務(wù)務(wù)就是在在顯示窗窗體時分分別獲取取各控件件的guuiBuuffeer,然然后將這這些GUUI_BBufffer分分別傳給給各個控控件的SSet函函數(shù). 仍然參參看2000號窗窗體的代代碼實(shí)現(xiàn)現(xiàn):h_flaag = seet_llistt_meenu_cattegoory_hisstorry(MMMI_CATTEGOORY2200_ID, hiistoory_b
54、uffferr); /第一一個控件件的Guui_BBuffferiif (h_fflagg)S322 s = ssizeeof(lisst_mmenuu_caateggoryy_hiistoory);s = (s + 3) / 4;ss *= 4;dynnamiic_llistt_gooto_iteem_nno_rredrraw(MMII_fiixedd_liist_mennu.hhighhligghteed_iitemm);wwguii_seetupp_siinglleliine_inpputbbox( iinpuut_bbox_x, (iinpuut_bbox_y), iinpuut_bbox_widdth, ssearrch_boxx_heeighht, buuffeer, buuffeer_mmax_lenngthh, MMII_CAATEGGORYY2000_
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 暑期青少年健身訓(xùn)練計(jì)劃書范例
- VCSEL激光器產(chǎn)業(yè)發(fā)展趨勢分析報告
- 史記留侯世家課文深度解析及練習(xí)題
- 小學(xué)數(shù)學(xué)基礎(chǔ)教學(xué)案例分析
- 公務(wù)員考試申論作文范文集
- 餐廳廚房衛(wèi)生操作規(guī)程匯編
- 小學(xué)數(shù)學(xué)分層輔導(dǎo)教學(xué)計(jì)劃范本
- JLPT-N1歷年真題解析及聽力全文
- 初中物理專項(xiàng)訓(xùn)練模擬試題合集
- (正式版)DB32∕T 5186-2025 《海洋工程裝備產(chǎn)品分類與代碼》
- 2025年國家開放大學(xué)《醫(yī)學(xué)倫理學(xué)》期末考試備考題庫及答案解析
- 2025年安全生產(chǎn)有限空間作業(yè)事故案例分析試題庫試卷
- 2025年制造業(yè)崗位招聘面試指南及模擬題答案
- 2025年電力工程師高級職稱評審要點(diǎn)與面試題庫及答案
- 2025年湖南衡南縣發(fā)展集團(tuán)有限公司招聘12人備考考試題庫附答案解析
- 2025年汽車駕駛員(高級)理論考試試題及答案
- 2025年及未來5年中國鋰電池疊片機(jī)行業(yè)市場深度分析及發(fā)展趨勢預(yù)測報告
- 2025秋外研版英語三上教學(xué)設(shè)計(jì)- Welcome to school 教學(xué)設(shè)計(jì)
- 應(yīng)用流媒體服務(wù)拓展創(chuàng)新創(chuàng)業(yè)項(xiàng)目商業(yè)計(jì)劃書
- 四川省算云科技有限責(zé)任公司筆試歷年參考題庫附帶答案詳解
- 川教版四年級上冊《生命.生態(tài).安全》全冊教案(及計(jì)劃)
評論
0/150
提交評論