mtk历史管理资料.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一、什么是History管理 对于我们上层用户而言,经常接触到的History管理是这样的: void EntryFunc() { U8 *guiBuffer; EntryNewScreen( Screen_ID , Exit_Func , Entry_Func , NULL ); guiBuffer = GetCurrGuiBuffer( SCR_ID_WORDMAIN_LIST ); ShowCategroyXXScreen( Title_ID , … , guiBuffer); } 但是,无论是EntryNewScreen的调用,还是guiBuffer的传入,我们都很少考虑过对这些指针和函数在GUI的管理起到了什 么样的作用。下面我们就要了解,以上的代码与History管理之间存在的关系。 在MTK环境中,每当我们进入一个窗口,系统将先提取前一个窗口需保留的数据。这些数据包括: 窗口ID ; 进入窗口时调用的函数和退出调用的函数 -- Exit_Func 和 Entry_Func; 组成窗体的控件的属性(如,列表控件当前高亮显示的条目、当前屏的首末条目等)。举例说明这些数据在实际中是如何被使用的。 假设存在AB两个窗口,A窗口需要保留的数据为data_A。我们先从A窗口进入到B窗口。data_A将在B窗口调用EntryNewScreen() 的时候,被压入一个结构类似于栈的数据存储区域;当从B调用GoBackHistory()返回A时,data_A从栈顶被弹出,然后A利用data_A 将自身还原到其进入B之前的状态。 这就是History管理的作用。简言之,就是要保持窗口的外观状态。 二、History管理的机制 现在,我们来了解一下前面所说的data_A的数据结构是什么样的。 typedef struct _history { U16 scrnID; //(1)Screen ID (窗口号) FuncPtr entryFuncPtr; //(2)EntryNewScreen时要进入的 Entry_Func U8 inputBuffer[MAX_INPUT_BUFFER]; U8 guiBuffer[MAX_GUI_BUFFER]; //(3)没遇到过其使用,都是NULL。 //(4)窗体中控件的一些需保存的信息的Buffer,通常//在使用时被转 化成各控件自定义的结构体如: list_menu_category_history。 } history; 而存放data_A的类似于堆栈的数据区则以全局变量的形式定义在系统中: historyNode historyData[MAX_HISTORY]; (MAX_HISTORY = 50): 设当前窗口A所对应的数据是historyData[ EntryScreenNum – 1 ] ,那么它是何时、是如何被赋值的?又是何时、如何被使用的? 经过跟踪调试,我们已经知道,在由窗口A进入到窗口B(调用EntryNewScreen)的时候,我们将data_A记录到了historyNode 的结构体变量中。但是,在EntryNewScreen的时候传入的,却是data_B,data_A是如何被记录和使用的呢? 我们摘选EntryNewScreen的子函数中所包含的较核心的代码来说明这个问题。这三段代码是按照现在的排放顺序来执行的。 第一段(history h 可理解为data_A): h.scrnID = scrnID; // scrnID = currExitScrnID h.entryFuncPtr = entryFuncPtr; // entryFuncPtr = currEntryFuncPtr pfnUnicodeStrcpy((S8*) h.inputBuffer, (S8*) nHistory); // nHistory = NULL ; GetCategoryHistory(h.guiBuffer); //GetCategoryHistory是指向获取//guiBuffer的函数的指针 AddHistory(h); //数据入栈 第二段: if(currExitFuncPtr) { //… (*currExitFuncPtr) (); //执行Exit_Func } 第三段(记录Screen_ID,Exit_Func和EntryFunc): currExitScrnID = scrnID; currExitFuncPtr = exitFuncPtr; currEntryFuncPtr = entryFuncPtr; 这样,我们就可以看出,EntryNewScreen函数先将上次执行EntryNewScreen时所记录的currExitScrnID, currEn

文档评论(0)

tianya189 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体阳新县融易互联网技术工作室
IP属地境外
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档