📄 winstack.c
字号:
/****************************************************************
** *
** FILE : WinStack.c *
** *
** By : Cyb 2007.07.01 *
****************************************************************/
#define WINSTACK_GLOBALS
#include "includes.h"
#include "ErrTask.H"
#include "TimeTask.H"
#include "FormPage.h"
#include "WinStack.h"
#include "DisplayTask.h"
#include "UART_Drv.h"
#include "message.h"
#include "_keyboard.h"
#define NULLSTACK 0xFF
static FORMSTACK FormPageStack;
static INT8U CurStack ; //CurStack=0表示有一个窗体在堆栈中
static TMR_TSK *AutoCloseWinTmr;
static INT8U LockPage; //Destroy Form 直到释放到"LockPage-1"
void ClearLockPage(void)
{
LockPage = NULLSTACK;
}
void LockFormPage(INT8U page)
{
INT8U curdepth;
curdepth = GetFormPageDepth();
if (curdepth > page) {
LockPage = curdepth - page;
}
}
static void AutoCloseWinFunc(void)
{
FORMPAGE *formpage;
CurStack = FormPageStack.formcnt;
formpage = &FormPageStack.form[CurStack];
if (formpage->rettype == FORMRET_TOP) {
ReturnSpecifiedPage(0);//返回到顶层
} else {
PopFormStack();
}
}
void ResetFormStack(void)
{
FormPageStack.formcnt = NULLSTACK;
LockPage = NULLSTACK;
}
void InitFormStack(void)
{
ResetFormStack();
AutoCloseWinTmr = CreateTimer(AutoCloseWinFunc,0);
}
void PushFormStack(void)
{
FORMPAGE *formpage;
INT8U lifetime;
CurStack = FormPageStack.formcnt;
if (CurStack != NULLSTACK)
{
formpage = &FormPageStack.form[CurStack];
FormPageSuspendProc(formpage);//先将当前的窗体挂起
}
if (CurStack == NULLSTACK)
{
FormPageStack.formcnt = 0;
CurStack = 0;
}
else
{
CurStack++;
if (CurStack >= MAXFORMPAGE) return;
FormPageStack.formcnt++;
}
formpage = &FormPageStack.form[CurStack];
FormPageInitProc(formpage);//加载新窗体
StopTmr(AutoCloseWinTmr);
if ((CurStack != 0) && (formpage->lifetime != PAGELIFE_INFINITE)) {
lifetime = formpage->lifetime;
StartTmr(AutoCloseWinTmr,SECOND,lifetime);
}
}
void PopFormStack(void)
{
FORMPAGE *formpage;
INT8U lifetime;
CurStack = FormPageStack.formcnt;
formpage = &FormPageStack.form[CurStack];
FormPageDestroyProc(formpage);//先destroy当前页面
if ((CurStack == 0) || (CurStack == NULLSTACK))
{
return;
}
else
{
CurStack = CurStack - 1;
formpage = &FormPageStack.form[CurStack];
FormPageStack.formcnt--;
if (LockPage != NULLSTACK)
{
while (FormPageStack.formcnt >= LockPage ) {//一直destroy到LockPage-1
FormPageDestroyProc(formpage);
CurStack = CurStack - 1;
formpage = &FormPageStack.form[CurStack];
FormPageStack.formcnt--;
}
LockPage = NULLSTACK; //解锁
}
while (formpage->formattrib == POPFORMPAGE)
{//此类页面无需返回
FormPageDestroyProc(formpage);
CurStack = CurStack - 1;
formpage = &FormPageStack.form[CurStack];
FormPageStack.formcnt--;
}
FormPageResumeProc(formpage);
StopTmr(AutoCloseWinTmr);
if ((CurStack != 0) && (formpage->lifetime != PAGELIFE_INFINITE)) {
lifetime = formpage->lifetime;
StartTmr(AutoCloseWinTmr,SECOND,lifetime);
}
}
}
void RefreshFormStack(void)
{
FORMPAGE *formpage;
INT8U lifetime;
CurStack = FormPageStack.formcnt;
if ((CurStack != NULLSTACK) && (CurStack < MAXFORMPAGE)) {
formpage = &FormPageStack.form[CurStack];
StopTmr(AutoCloseWinTmr);
FormPageResumeProc(formpage);
if ((CurStack != 0) && (formpage->lifetime != PAGELIFE_INFINITE)) {
lifetime = formpage->lifetime;
StartTmr(AutoCloseWinTmr,SECOND,lifetime);
}
}
}
void ReturnSpecifiedPage(INT8U depth)
{
FORMPAGE *formpage;
INT8U lifetime;
CurStack = FormPageStack.formcnt;
if (depth >= CurStack) return;
for (;CurStack>depth;CurStack--) {
formpage = &FormPageStack.form[CurStack];
FormPageDestroyProc(formpage);
}
if (CurStack == NULLSTACK)
{
StopTmr(AutoCloseWinTmr);
}
else
{
formpage = &FormPageStack.form[depth];
FormPageStack.formcnt = depth;
FormPageResumeProc(formpage);
StopTmr(AutoCloseWinTmr);
if ((depth != 0) && (formpage->lifetime != PAGELIFE_INFINITE)) {
lifetime = formpage->lifetime;
StartTmr(AutoCloseWinTmr,SECOND,lifetime);
}
}
}
INT8U GetFormPageDepth(void)
{
return FormPageStack.formcnt;
}
FORMPAGE *GetSpecifiedPage(INT8U depth)
{
if (depth >= MAXFORMPAGE) {
return NULL;
} else {
return &FormPageStack.form[depth];
}
}
FORMPAGE *AllocateFormPage(void)
{
CurStack = FormPageStack.formcnt;
if (CurStack == NULLSTACK)
{//无页面
ResetFormPage(&FormPageStack.form[0]);
return &FormPageStack.form[0];
} else if (CurStack >= MAXFORMPAGE+1)
{
return NULL;
} else
{
ResetFormPage(&FormPageStack.form[CurStack+1]);//空闲指针是CurStack+1
return &FormPageStack.form[CurStack+1];
}
}
FORMPAGE *GetCurrentFormpage(void)
{
CurStack = FormPageStack.formcnt;
if (CurStack != NULLSTACK)
{
return &FormPageStack.form[CurStack];
}
else
{
return NULL;
}
}
void WinStackEntry(void)
{
FORMPAGE *formpage;
INT8U lifetime;
CurStack = FormPageStack.formcnt;//当前栈顶空间
if (CurStack == NULLSTACK)
{
return;
}
else if (CurStack >= MAXFORMPAGE)
{
ErrExit(0x1212);
return;
}
formpage = &FormPageStack.form[CurStack];//CurStack和数组下标是匹配的
StopTmr(AutoCloseWinTmr);
if ((CurStack != 0) && (formpage->lifetime != PAGELIFE_INFINITE))
{
lifetime = formpage->lifetime;
StartTmr(AutoCloseWinTmr,SECOND,lifetime);
}
FormPageHdlKeyProc(formpage);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -