- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
最近下载
- 草果栽培技术.ppt VIP
- 药物设计软件:Schrodinger二次开发_(16).Schrodinger插件开发与使用.docx VIP
- 浙江省9+1高中联盟2024-2025学年高二上学期11月期中考试物理试题(含答案).docx VIP
- 教育研究导论(宁虹主编)笔记.pdf VIP
- 药物设计软件:Schrodinger二次开发_(15).自定义分子力场与参数化.docx VIP
- 2019年高铁动车广告,高铁车身广告,高铁广告价格.pdf VIP
- 高考数学考点题型全归纳.pdf VIP
- 万华化学安全管理实践.pdf VIP
- 丹纳赫DBS管理系统.pptx VIP
- 金属焊接软件:SYSWELD二次开发_(6).焊接热源模型开发.docx VIP
文档评论(0)