mmi培训资料-自定义模板_第1页
mmi培训资料-自定义模板_第2页
mmi培训资料-自定义模板_第3页
mmi培训资料-自定义模板_第4页
mmi培训资料-自定义模板_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、mtk平台mmi培训资料(中文)2008-06-06 21:48本文详细说说明了如如何建设设一个自自定义列列表窗体体模板。原原理部分分请参见见MTTK平台台(1)如如何添加加一个窗窗体模板板。最最终实现现的是一一个字典典输入界界面。布布局为:该模板板不包含含业务逻逻辑,仅仅提供页页面显示示和InnputtBoxx框输入入事件后后的LiistBBox的的Reddraww事件的的注册,以以及基本本的输入入法设置置、清空空后的返返回函数数。一、添添加用户户自定义义列表模模板的过过程(一一)在gg_caateggoriies_conntrools_mapp中中加入:,MMMI_CATTEGOORY_C

2、USSTOMM_LIIST,(U88*)ccusttom_deffinee_liist,(s116*)cooordiinatte_ccusttom_lisst,NNULLLconstt U88 cuustoom_ddefiine_lisst= 5, DDM_BBASEE_LAAYERR_STTARTT, DDM_SSCR_BG, DMM_BAASE_CONNTROOL_SSET11, DDM_SSINGGLELLINEE_INNPUTTBOXX1, DM_LISST1;constt S116 ccoorrdinnatee_cuustoom_llistt= DMM_FUULL_SCRREENN_

3、COOORDDINAATE_FLAAG, DM_CUSSTOMM_DEEFINNE_IINPUUTBOOX, /需要定定义 DDM_CCUSTTOM_DEFFINEE_LIIST /需要要定义;(二)在ddm_gget_cooordiinattes()函函数中加加入:/设定定列表位位置和大大小(不不要忘记记全局变变量 MMMI_cusstomm_Liistbbox_x 等等的定义义)ellse if( *UUICttrlAAcceessPPtr_p = DDM_CCUSTTOM_DEFFINEE_LIIST ) dm_cooordiinatte_iinfoo-ss16XX = MMII_cuu

4、stoom_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;UIICtrrlAcccesssPttr_pp

5、+ ;/设设定输入入框位置置和大小小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_ccoo

6、rrdinnatee_innfo-s116Heeighht = MMMI_ccusttom_inpputbbox_heiightt; ddm_ccoorrdinnatee_innfo-Fllagss = DM_SINNGLEE_LIINE_INPPUTBBOX_SPEECIFFIC_HEIIGHTT; UIICtrrlAcccesssPttr_pp + ;(三)在在Wguui_ccateegorry.cc中定义义模板显显示函数数voiid SShowwCattegooryCCusttomLListtScrreenn( U8 *tiitlee, U166 tiitlee_iccon, UU16

7、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_strruct

8、t dmm_daata; S332 ii; UU8 hh_fllag; /*-*/ /* Coode Boddy */ /*-*/ gddi_llayeer_llockk_frramee_buuffeer(); SSetuupCaateggoryyKeyyHanndleers(); MMII_tiitlee_sttrinng = (UUI_sstriing_typpe) tittle; MMMI_ttitlle_iiconn = (PUU8) gett_immagee(tiitlee_iccon); chhangge_lleftt_sooftkkey(lefft_ssofttkeyy, lle

9、ftt_sooftkkey_icoon); chhangge_rrighht_ssofttkeyy(riightt_sooftkkey, riightt_sooftkkey_icoon);/Creeatee Liist crreatte_ffixeed_iiconntexxt_mmenuuiteems(); asssociiatee_fiixedd_icconttextt_liist(); ShoowLiistCCateegorrySccreeen( (UUI_sstriing_typpe) tittle, gget_imaage(tittle_icoon), gget_strringg(le

10、eft_sofftkeey), gget_imaage(lefft_ssofttkeyy_iccon), gett_sttrinng(rrighht_ssofttkeyy), geet_iimagge(rrighht_ssofttkeyy_iccon), nummberr_off_ittemss); ffor (i = 00; ii = (MMMI_sinngleelinne_iinpuutboox.aavaiilabble_lenngthh - ENCCODIING_LENNGTHH) retturnn; guui_ssinggle_linne_iinpuut_bbox_inssertt_m

11、uultiitapp_chharaacteer(&MMII_siinglleliine_inpputbbox, c); rredrraw_sinngleelinne_iinpuutboox(); ssingglellinee_innputtboxx_innputt_caallbbackk(); siinglleliine_inpputbbox_cusstomm_innputt_caallbbackk();(五)Wggui_Cattegoory.c中添添加用户户事件定定义接口口/右右键事件件注册vvoidd SeetCaateggoryyCusstommLisstRiighttSofftkeey

12、Fuuncttionn(vooid (*ff) (voiid) wggui_sinngleelinne_iinpuutboox_RRSK_funnctiion = ff;/keyy_0到到keyy_9按按下时的的事件注注册exxterrn vvoidd (*sinngleelinne_iinpuutboox_ccusttom_inpput_calllbaack) (vvoidd);vvoidd SeetCaateggoryyCusstommLisstNuumKeeyFuuncttionn(vooid (*ff) (voiid)sinngleelinne_iinpuutboox_ccusttom

13、_inpput_calllbaack = ff ;/设置IInpuutBoox大小小voiid SSetCCusttomLListt_Innputtboxx_Siize(S322 p_x , S332 pp_y , SS32 p_wwidtth , S332 pp_heeighht )MMII_cuustoom_iinpuutboox_xx = p_xx ;MMMI_cusstomm_innputtboxx_y = pp_y ;MMMI_ccusttom_inpputbbox_widdth = pp_wiidthh ;MMMI_cusstomm_innputtboxx_heeighht = p

14、_heiightt ;/设设置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、 调用用SettCusstommLisst_IInpuutboox_SSizee 和 SettCusstommLisst_LListtboxx_Siize 设置列列表框和和输入框框的大小小。2、 调用显显示窗体体的接口口 ShhowCCateegorryCuustoomLiistSScreeen。3、 调用右键事件注册函数,注册文本框被清空后的事件(如返回等)SetCategoryCustomListRightSoftkeyFunction。4、 调用key_0至key_9的事件注册函数,SetCategoryCustomListNumKeyFunction()。三、参数详详细

16、说明明 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 : 大大小。 vooid SettCattegooryCCusttomLListtRigghtSSof

17、ttkeyyFunnctiion(voiid (*f) (vvoidd) vvoidd SeetCaateggoryyCusstommLisstNuumKeeyFuuncttionn(vooid (*ff) (voiid) f(vvoidd) :函数地地址。 vooid ShoowCaateggoryyCusstommLisstSccreeen( U88 *ttitlle, / 标题文文本指针针 UU16 tittle_icoon, / 标标题图标标ID U116 lleftt_sooftkkey, / 左左键文本本ID U116 lleftt_sooftkkey_icoon, / 左键图图标

18、IDD UU16 rigght_sofftkeey, / 右键键文本IID U166 riightt_sooftkkey_icoon, / 右键图图标IDD UU8* cusstomm_siinglle_iinpuut_bbufffer, / Innputt输入BBufffer S332 nnumbber_of_iteems, / 列表表条目数数 UU8 *liist_of_iteems, / 列列表项文文本指针针数组 U116 *lisst_oof_iiconns, / 列表表项Iccon S332 hhighhligghteed_iitemm, / 当当前高亮亮显示的的列表条条目 U8 *

19、hiistoory_buffferr) / 历史记记录Buuffeer附:所需更更改的文文件wggui.cwggui_cattegooriees.ccwguui_ddraww_maanagger.cwggui_inpputss.cwwguii.hwwguii_caateggoriies_deffs.hhwguui_ddraww_maanagger.hCuustCCoorrdinnatee.c一、什么是是Hisstorry管理理 对对于我们们上层用用户而言言,经常常接触到到的Hiistoory管管理是这这样的: vooid EnttryFFuncc()U8 *guuiBuuffeer; Ennt

20、ryyNewwScrreenn( SScreeen_ID , EExitt_Fuunc , EEntrry_FFuncc , NULLL ); gguiBBufffer = GGetCCurrrGuiiBuffferr( SSCR_ID_WORRDMAAIN_LISST ); ShhowCCateegrooyXXXScrreenn( TTitlle_IID , , gguiBBufffer); 但是,无无论是EEntrryNeewSccreeen的调调用,还还是guuiBuuffeer的传传入,我我们都很很少考虑虑过对这这些指针针和函数数在GUUI的管管理起到到了什么么样的作作用。下下面我们们

21、就要了了解,以以上的代代码与HHisttoryy管理之之间存在在的关系系。 在MTTK环境境中,每每当我们们进入一一个窗口口,系统统将先提提取前一一个窗口口需保留留的数据据。这些些数据包包括:11. 窗窗口IDD ;22. 进进入窗口口时调用用的函数数和退出出调用的的函数 - Exiit_FFuncc 和 Enttry_Funnc ;3. 组成窗窗体的控控件的属属性(如如,列表表控件当当前高亮亮显示的的条目、当当前屏的的首末条条目等)。举例说明这这些数据据在实际际中是如如何被使使用的。假设存在AB两个窗口,A窗口需要保留的数据为data_A。我们先从A窗口进入到B窗口。data_A将在B窗口调

22、用EntryNewScreen()的时候,被压入一个结构类似于栈的数据存储区域;当从B调用GoBackHistory()返回A时,data_A从栈顶被弹出,然后A利用data_A将自身还原到其进入B之前的状态。这就是History管理的作用。简言之,就是要保持窗口的外观状态。二、Hisstorry管理理的机制制 现现在,我我们来了了解一下下前面所所说的ddataa_A的的数据结结构是什什么样的的。tyypeddef strructt _hhisttoryy U116 sscrnnID; /(1)SScreeen ID (窗口口号) FunncPttr eentrryFuuncPPtr; /(2

23、)EEntrryNeewSccreeen时要要进入的的 Enntryy_Fuunc U8 inpputBBuffferMAXX_INNPUTT_BUUFFEER; /(3)没没遇到过过其使用用,都是是NULLL。 U8 guiiBuffferrMAAX_GGUI_BUFFFERR; /(44)窗体体中控件件的一些些需保存存的信息息的Buuffeer,通通常/在使用用时被转转化成各各控件自自定义的的结构体体如: lisst_mmenuu_caateggoryy_hiistoory。 history;而存放data_A的类似于堆栈的数据区则以全局变量的形式定义在系统中:historyNode hi

24、storyDataMAX_HISTORY; (MAX_HISTORY = 50):设当前窗口口A所对对应的数数据是hhisttoryyDatta EnttrySScreeenNNum 11 ,那么么它是何何时、是是如何被被赋值的的?又是是何时、如如何被使使用的?经过跟跟踪调试试,我们们已经知知道,在在由窗口口A进入入到窗口口B(调调用EnntryyNewwScrreenn)的时时候,我我们将ddataa_A记记录到了了hisstorryNoode 的结构构体变量量中。但但是,在在EnttryNNewSScreeen的的时候传传入的,却却是daata_B,ddataa_A是是如何被被记录和和使用

25、的的呢?我们摘选EEntrryNeewSccreeen的子子函数中中所包含含的较核核心的代代码来说说明这个个问题。这这三段代代码是按按照现在在的排放放顺序来来执行的的。第一一段(hhisttoryy h 可理解解为daata_A): h.scrrnIDD = scrrnIDD; / scrrnIDD = currrExxitSScrnnID h.eentrryFuuncPPtr = eentrryFuuncPPtr; / enntryyFunncPttr = cuurrEEntrryFuuncPPtr pfnnUniicoddeSttrcppy(S8*) hh.innputtBuffferr,

26、 (S8*) & nHHisttoryy); / nnHisstorry = NUULL ; GettCattegooryHHisttoryy(h.guiiBuffferr);/GGetCCateegorryHiistoory是是指向获获取/guiiBuffferr的函数数的指针针 AdddHiistoory(h); /数数据入栈栈第二段段:iff(cuurrEExittFunncPttr) / (*ccurrrExiitFuuncPPtr) (); /执行EExitt_Fuunc 第三三段(记记录Sccreeen_IID,EExitt_Fuunc和和EnttryFFuncc):ccurrrE

27、xiitSccrnIID = sccrnIID; currrExxitFFunccPtrr = exiitFuuncPPtr; cuurrEEntrryFuuncPPtr = eentrryFuuncPPtr;这样,我我们就可可以看出出,EnntryyNewwScrreenn函数先先将上次次执行EEntrryNeewSccreeen时所所记录的的currrExxitSScrnnID, cuurrEEntrryFuuncPPtr以以hisstorry结构构为载体体记录入入栈;然然后执行行了记录录中的ccurrrExiitFuuncPPtr;最后将将本窗口口的sccrnIID、eexittFunn

28、cPttr、eentrryFuuncPPtr分分别记录录入全局局变量ccurrrExiitSccrnIID、ccurrrExiitFuuncPPtr和和currrEnntryyFunncPttr,留留待下次次调用EEntrryNeewSccreeen时使使用。下面有数据据出入栈栈流程,有有兴趣的的话可以以跟踪一一下。以以先后顺顺序代表表包含关关系,如如下:11.入栈栈(EnntryyNewwScrreenn):(1)UU8 EEntrryNeewSccreeen(UU16 newwscrrnIDD, FFunccPtrr neewExxitHHanddlerr, FFunccPtrr neew

29、EnntryyHanndleer, voiid *peeerBuuf)(2)sstattic voiid EExeccuteeCurrrExxitHHanddlerr(vooid);(33)vooid ExeecutteCuurrEExittHanndleer_EExt(voiid);(4)voiid GGeneericcExiitSccreeen( U166 sccrnIID , FuuncPPtr enttryFFunccPtrr );(5)voiid AAddHHisttoryyReffereencee(hiistoory *adddHiistoory); /处理理hisstorryDa

30、ata(6)SS16 inccremmentt(); /更更改栈指指针2.出栈(GoBBackkHisstorry):(1)voiid GGoBaackHHisttoryy(vooid);(22)sttatiic vvoidd ExxecuutePPopHHisttoryy(vooid); /处处理hiistooryDDataa(3)staaticc U88 deecreemennt(vvoidd); /更改栈栈指针现在我们已已经知道道了hiistoory 的三个个结构体体成员是是如何记记录的了了,最后后来重点点看一下下hisstorry.gguiBBufffer是是如何被被记录和和使用的的。

31、三、GUII Buuffeer对控控件属性性的记录录 由上上2节我我们知道道,guuiBuuffeer是窗窗体中某某些控件件的需保保存的属属性的BBufffer,通常在在使用时时被转化化成各控控件自定定义的结结构体。如如: llistt_meenu_cattegoory_hisstorry。现现在有几几个问题题需要我我们解答答:1. guuiBuuffeer 指指向的BBufffer是是如何被被分配的的?该块块数据是是动态的的还是静静态的?2. 这块 Buffferr 是何何时被写写入数据据的?33. 如如何释放放(动态态分配时时)或清清空(固固定地址址时)该该块 BBufffer ?让我们逐

32、一一解答上上面的三三个问题题,以清清晰我们们对guuiBuuffeer的认认识。11. 答答:在vvoidd AdddHiistooryRRefeerennce(hisstorry *adddHisstorry)中中,调用用OsllMalllocc(MAAX_GGUI_BUFFFERR)动态态申请了了一块内内存,用用来保存存在 GGeneericcExiitSccreeen 中中获取的的hisstorry.gguiBBufffer。参见出出入栈流流程2. 如何何释放(动态分分配时)或清空空(固定定地址时时)该块块 Buuffeer ?答 :在sttatiic vvoidd deecreemen

33、nt (voiid)函函数中,该该buffferr被释放放: OOslMMfreee(hhisttoryyDattaccurrrHisstorryInndexx.gguiBBufffer);。参见出出入栈流流程3. 答 : 只只要一个个窗体模模板有需需要保存存状态的的控件,它它们都调调用了这这个函数数ddm_ssetuup_ccateegorry_ffuncctioons()。函函数定义义如下:voiid ddm_ssetuup_ccateegorry_ffuncctioons( FFunccPtrr reedraaw_ffuncctioon, U88 *(*geet_hhisttoryy_f

34、uuncttionn) (U8 *buuffeer), SS32(*geet_hhisttoryy_siize_funnctiion) (vvoidd)/指指向窗体体重画函函数的函函数指针针 ReedraawCaateggoryyFunnctiion = rredrraw_funnctiion;/指指向获取取窗体gguiBBufffer的的函数指指针 GGetCCateegorryHiistoory = gget_hisstorry_ffuncctioon;/指向向获取窗窗体guuiBuuffeer大小小的函数数指针 GettCattegooryHHisttoryySizze = geet_h

35、histtoryy_siize_funnctiion;在只有有一个控控件的状状态需要要保存的的窗体中中,会这这样传参参给这个个函数:dm_settup_cattegoory_funnctiionss(dmm_reedraaw_ccateegorry_sscreeen, dmm_geet_ccateegorry_hhisttoryy, ddm_gget_cattegoory_hisstorry_ssizee);GGeneericcExiitSccreeen()函数中中,将使使用 GGetCCateegorryHiistoory()获取取某个控控件的GGuiBBufffer参见出出入栈流流程。如如

36、果按照照上面的的设置,GGetCCateegorryHiistoory指指向了ddm_gget_cattegoory_hisstorry这个个函数。看看看这个个函数做做了什么么:coontrrol_sett_pttr = dmm_seearcch_cconttroll_seet(U166) pp_dmm_daata-s332CaatIdd, &cooordiinatte_sset_p); /获取窗窗体模板板内的控控件类型型数组cconttroll_seet_pptruu8NooOfUUICttrlss = conntrool_sset_ptrr0; /获取取数组内内变量个个数,即即控件的的个数

37、/*根据据控件类类型,获获取控件件的guuiBuuffeer.值值得注意意的是,11.这里里的hiistrroy_Buffferr的名称称起的不不好,应应该起名名为guuiBuuffeer,不不应混淆淆视听;2.最最终hiistoory_buffferr 将指指向模板板中定义义的最后后一个控控件的gguiBBufffer*/foor (u8CCtrllCt = 11; uu8CttrlCCt s322CattId, hiistoory_buffferr); breeak; casse DDM_LLISTT1: gett_liist_mennu_ccateegorry_hhisttoryy(UU

38、16) p_dm_datta-s322CattId, hiistoory_buffferr); brreakk; caase DM_DYNNAMIIC_LLISTT1: geet_llistt_meenu_cattegoory_hisstorry(U166) pp_dmm_daata-s332CaatIdd, hhisttoryy_buuffeer); breeak; ccasee DMM_ASSYNCCDYNNAMIIC_LLISTT1: gget_lisst_mmenuu_caateggoryy_hiistoory(U116) p_ddm_ddataa-ss32CCatIId, hisst

39、orry_bbufffer); brreakk; /./.而在模模版显示示函数(ShoowCaateggroyyXXSScreeen)中,则则根据 guiibuffferr 的情情况设置置控件的的属性。如如果 gguibbufffer 不为空空,则说说明该模模板的显显示函数数是在GGoBaackHHisttoryy()的的时候被被调用的的,而不不是进入入新窗口口时被调调用的。那那么控件件必然有有一些保保留的属属性需要要被还原原。以66号窗口口的Liist为为例。在在ShoowCaateggoryy6Sccreeen()中,调调用下面面的函数数来恢复复Lisst设置置:h_flaag = see

40、t_llistt_meenu_cattegoory_hisstorry(MMMI_CATTEGOORY66_IDD, hhisttoryy_buuffeer);这样gguiBBufffer的的Gett和Seet就统统一起来来了。现在,我们们已经知知道了gguiBBufffer 所起到到的作用用。但是是,如果果一个窗窗体模板板内有两两个或两两个以上上需要记记录状态态的控件件,又该该怎么办办呢?pps:该该死的字字数限制制,只能能把剩下下的放到到MTTK平台台(3)HHisttoryy管理下了了。四、灵活使使用guuiBuuffeer在我们自己己设计窗窗体模板板时,经经常会出出现一个个窗体中中有多

41、个个控件的的情况。但但是,如如果一个个窗体中中有两个个控件、却却依然调调用dmm_geet_ccateegorry_hhisttoryy()获获取控件件的GuuiBuuffeer的话话,就会会出现问问题。比比如,我我们在制制作CuustoomLiist窗窗体时,初初期使用用了这样样的代码码:(11)模板板中的组组件设置置:coonstt U88 cuustoom_ddefiine_lisst= 55, DM_BASSE_LLAYEER_SSTARRT, DMM_SCCR_BBG, DMM_BAASE_CONNTROOL_SSET11, DM_SINNGLEELINNE_IINPUUTBOOX1

42、, /单单行输入入控件 DMM_LIIST11 /列表表控件;(2)窗窗体显示示函数 ShoowCaateggoryyCusstommLisstSccreeen 部部分源码码:vooid ShoowCaateggoryyCusstommLisstSccreeen(.,U8 * gguiBBufffer)/. /根据 MMII_CAATEGGORYY_CUUSTOOM_LLISTT 的 guiiBuffferr,为全全局结构构体变量量 /MMII_fiixedd_liist_mennu赋值值.h_flaag = seet_llistt_meenu_cattegoory_hisstorry(MMM

43、I_CATTEGOORY_CUSSTOMM_LIIST, guuiBuuffeer);/而而后利用用MMII_fiixedd_liist_mennu,设设置liist的的属性iif (h_fflagg)fixxed_lisst_ggotoo_ittem_no_reddraww(MMMI_ffixeed_llistt_meenu.higghliightted_iteem);elsse fixxed_lisst_ggotoo_ittem_no_reddraww(hiighllighhtedd_ittem);/./再再设置单单行输入入框的属属性wggui_settup_sinngleelinne_i

44、inpuutboox( 00, 0, 2400, 3220, ccusttom_sinnglee_innputt_buuffeer, 550, MMMI_CATTEGOORY_CUSSTOMM_LIIST, gett_sttrinng(rrighht_ssofttkeyy), gget_imaage(rigght_sofftkeey_iiconn), IINPUUT_TTYPEE_ALLPHAANUMMERIIC_LLOWEERCAASE| INNPUTT_TYYPE_USEE_ONNLY_ENGGLISSH_MMODEES, gguiBBufffer, 0);/其中 wguui_ssetuu

45、p_ssingglellinee_innputtboxx 函数数中调用用了 /seet_ssingglellinee_innputtboxx_caateggoryy_hiistoory()来解解析guuiBuuffeer/.dm_settup_cattegoory_funnctiionss(dmm_reedraaw_ccateegorry_sscreeen, dmm_geet_ccateegorry_hhisttoryy, ddm_gget_cattegoory_hisstorry_ssizee);/. 继续使使用前33节的假假设。窗窗口A使使用了 CusstommLisst 窗窗体模板板。

46、从从A 进进入到BB 时,EEntrryNeewSccreeen函数数调用了了我们设设置的获获取guuiBuuffeer函数数dm_gett_caateggoryy_hiistoory ,它先先保存了了A中IInpuutBoox的属属性,再再保存AA中Liist的的属性 此时它它将把输输入框的的属性覆覆盖掉。当当从B窗窗口返回回到A窗窗口时,ShoowCaateggoryyCusstommLisstSccreeen()函数先先把hiistoory_buffferr传给了了 seet_llistt_meenu_cattegoory_hisstorry , 由于于guiiBuffferr中存储储的

47、是LListt的数据据,因此此在交付付fixxed_lisst_ggotoo_ittem_no_reddraww 进行行设置属属性的时时候,不不会出现现问题。但但 wggui_settup_sinngleelinne_iinpuutboox()就会因因为guuiBuuffeer中存存储的不不是输入入框存储储的数据据而出现现错误。因此,权宜之计是,将更改传给wgui_setup_singleline_inputbox的入参: wgui_setup_singleline_inputbox( 0, 0, 240, 320, custom_single_input_buffer, 50, MMI_CA

48、TEGORY_CUSTOM_LIST, get_string(right_softkey), get_image(right_softkey_icon), INPUT_TYPE_ALPHANUMERIC_LOWERCASE | INPUT_TYPE_USE_ONLY_ENGLISH_MODES, NULL, 0); 这样,虽然死机 bug 避免了,但是特定情况下 InputBox 需要保存的属性,将全部丢失掉.因此,更加合适的做法是,提取 dm_setup_category_functions()中使用的函数接口:get_singleline_inputbox_category_history

49、get_list_menu_category_history 这样可以分别获取 inputbox 和 list 的属性,然后将得到的两个属性的数据连续存放在一块动态分配的Buffer中.如200号窗口的GetCategroyHistory函数所示:U8 *GetCategory200History(U8 *history_buffer)S32 s;get_list_menu_category_history(MMI_CATEGORY200_ID, history_buffer);s = sizeof(list_menu_category_history);s = (s + 3) / 4;s *

50、= 4;get_singleline_inputbox_category_history(MMI_CATEGORY200_ID, (U8*) (history_buffer + s), MMI_current_input_type);return (history_buffer);要注意的问题是,系统为guiBuffer分配空间时,依据的是 MAX_GUI_BUFFER,而不是 dm_setup_category_functions()所指定的获取guiBuffer大小的函数GetCategoryHistorySize.而且系统中从未使用过该函数指针所指向的函数。奇怪的是 所有窗体模板的制作者

51、都兢兢业业地制作了这个获取guiBuffer大小的函数。在200号窗口里,获取guiBuffer大小的函数如下:S32 GetCategory200HistorySize(void)return (sizeof(list_menu_category_history) + 3) / 4) * 4 + sizeof(singleline_inputbox_category_history);如果怕出错且不怕麻烦的话,也可以未雨绸缪的写一个这样的函数,但恐怕多半是用不上的。最后的任务就是在显示窗体时分别获取各控件的guiBuffer,然后将这些GUI_Buffer分别传给各个控件的Set函数. 仍然

52、参看200号窗体的代码实现:h_flag = set_list_menu_category_history(MMI_CATEGORY200_ID, history_buffer); /第一个控件的Gui_Bufferif (h_flag)S32 s = sizeof(list_menu_category_history);s = (s + 3) / 4;s *= 4;dynamic_list_goto_item_no_redraw(MMI_fixed_list_menu.highlighted_item);wgui_setup_singleline_inputbox( input_box_x, (input_box_y), input_box_width, search_box_height, buffer, buffer_max_length, MM

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论