📄 formpage.c
字号:
/*
******************************************************************
* XIAMEN YAXON NETWORK CO.LTD.
* XINXI BUILDING,HULI,XIAMEN
* (c) Copyright 2002,XIAMEN YAXON NETWORK CO.LTD. ,XIAMEN
* All Rights Reserved
*
* FileName : FORMPAGE.C
* Programmer(s): WuJingYu
* Description :
******************************************************************
*/
/*
*****************************************************************
* REVISION HISTORY
*
* Date: 2002-10-31
*****************************************************************
*/
#define FORMPAGE_GLOBALS
#include "includes.h"
#include "LCD.H"
#include "zprint.h"
static INT8U CurFocus,FindFocus; //当前的焦点的控件索引号
//检测CurFoucus的有效性;
static BOOLEAN CheckKeyFocus(void)
{
/* if (CurFocus >= formpage->controlcnt && CurFocus != 0FFH) {
ErrExit(ERR_FORMWIN_FOCUS);
} */
return TRUE;
}
//处理焦点控件
static void SetKeyFocus(FORMPAGE *formpage)
{
formpage->focus = CurFocus;
if (CurFocus == 0xFF) return;
Control_SetFocus(&formpage->entity[CurFocus]);
}
//将焦点从CurFocus设为FindFocus
static void ChangeKeyFocus(FORMPAGE *formpage)
{
if (CurFocus != 0xFF) {
Control_ReleaseFocus(&formpage->entity[CurFocus]);
if (FindFocus != 0xFF) {
Control_SetFocus(&formpage->entity[FindFocus]);
}
}
CurFocus = FindFocus;
formpage->focus = CurFocus;
}
static INT8U SearchFocus(FORMPAGE *formpage)
{
INT8U i;
FindFocus = 0xFF;
for (i=0;i<formpage->controlcnt;i++) {
if (Control_HaveFocus(&formpage->entity[i]) == TRUE) {
FindFocus = i;
break;
}
}
return FindFocus;
}
void GotoNextFocus(FORMPAGE *formpage)
{
//y CheckKeyFocus();
if (CurFocus == 0xFF) {//如果当前无焦点
CurFocus = SearchFocus(formpage);//此时FindFocus = CurFocus
SetKeyFocus(formpage);
} else { //当前有焦点
FindFocus = CurFocus + 1;
while (1) {//从Cur一直找到Cur-1为止
if (FindFocus >= formpage->controlcnt) FindFocus = 0;
if (FindFocus == CurFocus ) return;
if (Control_HaveFocus(&formpage->entity[FindFocus]) == TRUE) {
ChangeKeyFocus(formpage);
return;
} else {
FindFocus++;
}
}
}
}
static void InitAllControl(FORMPAGE *formpage)
{
INT8U i;
for (i=0;i<formpage->controlcnt;i++)
{
InitControl(&formpage->entity[i]);
}
}
static void ShowAllControl(FORMPAGE *formpage)
{
INT8U i;
//?? 考虑一下弹出式页面
if (formpage->formattrib == POPFORMPAGE)
{
ClearPopMenuArea((LISTBOX*)formpage->entity[0].ctlptr,0);
}
else
{
ClearArea_Full();
}//先清屏
for (i=0;i<formpage->controlcnt;i++) //再刷新
{
CreateControl(&formpage->entity[i]);
}
LcdUpdate_Full();
}
#if 0
static void DestroyAllControl(FORMPAGE *formpage)
{
INT8U i;
for (i=0;i<formpage->controlcnt;i++) {
DestroyControl(&formpage->entity[i]);
}
}
#endif
//添加一个控件至页面;
INT8U AddControlToFormPage(FORMPAGE* formpage,INT8U ctlattrib,void *ctlptr)
{
INT8U index;
if (formpage->controlcnt >= FORMPAGEMAXCONTROL) {
return FORMPAGEMAXCONTROL;
} else {
index = formpage->controlcnt;
formpage->entity[index].ctlattrib = ctlattrib;
formpage->entity[index].ctlptr = ctlptr;
formpage->controlcnt++;
return formpage->controlcnt;
}
}
void FormPageInitProc(FORMPAGE *formpage)
{
void (*ExecFunc)(void);
ExecFunc = formpage->initfunc;
if (ExecFunc != NULL) (*ExecFunc)();
InitAllControl(formpage);
ShowAllControl(formpage);
CurFocus = SearchFocus(formpage);
SetKeyFocus(formpage);
ExecFunc = formpage->createfunc;
if (ExecFunc != NULL) (*ExecFunc)();
}
void FormPageDestroyProc(FORMPAGE *formpage)
{
INT8U i;
void (*ExecFunc)(void);
for (i=0;i<formpage->controlcnt;i++)
{
DestroyControl(&formpage->entity[i]);
}
ExecFunc = formpage->destroyfunc;
if (ExecFunc != NULL) (*ExecFunc)();
}
void FormPageSuspendProc(FORMPAGE *formpage)
{
void (*ExecFunc)(void);
//CurFocus = formpage->focus;
ExecFunc = formpage->suspendfunc;
if (ExecFunc != NULL) (*ExecFunc)();
}
void FormPageResumeProc(FORMPAGE *formpage)
{
void (*ExecFunc)(void);
CurFocus = formpage->focus;
ExecFunc = formpage->resuinitfunc;
if (ExecFunc != NULL) (*ExecFunc)();
ShowAllControl(formpage);
if (CurFocus == 0xFF)
{
CurFocus = SearchFocus(formpage);
}
SetKeyFocus(formpage);
ExecFunc = formpage->resumefunc;
if (ExecFunc != NULL) (*ExecFunc)();
}
void FormPageHdlKeyProc(FORMPAGE *formpage)
{
void (*HdlKeyFunc)(void);
INT8U FocusTemp,RecvKey;
RecvKey = GetCurLcdKey();
CurFocus = formpage->focus;
CheckKeyFocus();
if (CurFocus != 0xFF)
{
if (Control_HdlKey(&formpage->entity[CurFocus]))
{
return;
}
else
{
FocusTemp = CurFocus;
GotoNextFocus(formpage);
while (FocusTemp != CurFocus)
{
if (Control_HdlKey(&formpage->entity[CurFocus])) return;
GotoNextFocus(formpage);
}
HdlKeyFunc = formpage->hdlkeyfunc;
if (HdlKeyFunc != NULL) {
(*HdlKeyFunc)();
return ;
}
}
}
else //formpage无焦点
{
HdlKeyFunc = formpage->hdlkeyfunc;
if (HdlKeyFunc != NULL)
{
(*HdlKeyFunc)();
return ;
}
}
if (RecvKey == KEY_NCK)
{
PopFormStack();
}
}
void SetFormPageLifeTime(FORMPAGE *formpage,INT8U lifetime)
{
formpage->lifetime = lifetime;
}
//创建页面
void CreateFormPage(void)
{
// OS_ENTER_CRITICAL();
PushFormStack();
// OS_EXIT_CRITICAL();
}
//3.重新刷新当前页面
void RefreshFormPage(void)
{
RefreshFormStack();
}
//4.关闭当前页面
void CloseFormPage(void)
{
PopFormStack();
}
//关闭当前的若干个页面
void CloseMultipleFormPage(INT8U closenum)
{
INT8U curdepth;
curdepth = GetFormPageDepth();
if (curdepth <= closenum) {
ReturnSpecifiedPage(0);
} else {
curdepth -= closenum;
ReturnSpecifiedPage(curdepth);
}
}
//清空页面参数
void ResetFormPage(FORMPAGE *formpage)
{
memset((INT8U*)formpage,0,sizeof(FORMPAGE));
formpage->lifetime = PAGELIFE_NORMAL;
formpage->formattrib = NORMALFORMPAGE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -