引用 MTK 平台(3) —— History 管理[上] MTK 开发资料 2009-04-27 14:16 阅读 7 评论 0 字号: 大大中中小小引用 ******@126 的 MTK 平台(3) —— 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 利用 d ata_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]; //(4) 窗体中控件的一些需保存的信息的 Buff er, 通常// 在使用时被转化成各控件自定义的结构体如: list_menu_category_history 。} history; 而存放 data_A 的类似于堆栈的数据区则以全局变量的形式定义在系统中: historyNode historyData[MAX_HISTORY]; (MAX_HISTORY = 50): 设当前窗口 A 所对应的数据是 historyData[ EntryScreenNum –1], 那么它是何时、是如何被赋值的?又是何时、如何被使用的? 经过跟踪调试, 我们已经知道, 在由窗口 A 进入到窗口 B( 调用 EntryNewScreen ) 的时候, 我们将 data_A 记录到了 historyNode 的结构体变量中。但是,在 EntryNewScree n 的时候传入的,却是 data_B , data_A 是如何被记录和使用的呢? 我们摘选 EntryNewScreen 的子函数中所包含的较核心的代码来说明这个问题。这三段代码是按照现在的排放顺序来执行的。第一段(history h 可理解为 data_A) : = scrnID; // scrnID = currExitScrnID = entryFuncPtr; // entryFuncPtr = currEntryFuncPtr pfnUnicodeStrcpy((S8*) , (S8*) & nHistory); // nHistory = NULL ; GetCategoryHistory(); //GetCategoryHistory 是指向获取//guiBuffer 的函数的指针 AddHistory(h); // 数据入栈第二段: if(currExitFuncPtr) { //…(*currExitFuncPtr) (); // 执行 Exit
MTK平台history机制.doc 来自淘豆网m.daumloan.com转载请标明出处.