对于我们上层用户而言,经常接触到的 History 管理是这样的.PDFVIP

对于我们上层用户而言,经常接触到的 History 管理是这样的.PDF

  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 管理 对于我们上层用户而言,经常接触到的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 环境中,每当我们进入一个窗口,系统将先提取前一个窗口需保留的数据。这些数据包括: 1. 窗口ID ; 2. 进入窗口时调用的函数和退出调用的函数 -- Exit_Func 和 Entry_Func ; 3. 组成窗体的控件的属性(如,列表控件当前高亮显示的条目、当前屏的首末条目等)。 举例说明这些数据在实际中是如何被使用的。 假设存在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]; //(3)没遇到过其使用,都是NULL。 U8 guiBuffer[MAX_GUI_BUFFER]; - 1 - //(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);

文档评论(0)

haowendangqw + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档