📄 listbox.c
字号:
/*
******************************************************************
* XIAMEN YAXON NETWORK CO.LTD.
* XINXI BUILDING,HULI,XIAMEN
* (c) Copyright 2002,XIAMEN YAXON NETWORK CO.LTD. ,XIAMEN
* All Rights Reserved
*
* FileName : TEXTBOX.C
* Programmer(s): WuJingYu
* Description :
******************************************************************
*/
/*
*****************************************************************
* REVISION HISTORY
*
* Date: 2002-10-20
*****************************************************************
*/
#define LISTBOX_GLOBALS
#include "includes.h"
#include "ErrTask.h"
#include "UART_Drv.h"
#include "Lcd.h"
static INT8U NumLine, LineSize; //Numline表示行数,Linesize表示列数
static INT8U NORECORD[7] = {"无记录"};
//将Listbox的参数装入全局变量
static void ReadListBoxPara(LISTBOX *listbox)
{
NumLine = listbox->box->numrow;
LineSize = listbox->box->numcol;
}
//将选中的菜单项反显
void ReverseSelItem(LISTBOX *listbox,BOOLEAN updatelcd)
{
ReverseOutBox(listbox->indicator);
if (updatelcd) {
UpdateOutBox_LCD();
}
}
//更新滚动条箭头
static void UpdateListBoxArrow(LISTBOX *listbox)
{
INT8U start,maxitem;
start = listbox->start;
maxitem = listbox->numitem;
if (maxitem < NumLine) return;
if (start == 0) {
ShowUpArrow(OFF);
} else {
ShowUpArrow(ON);
}
if (start + NumLine < maxitem) {
ShowDownArrow(ON);
} else {
ShowDownArrow(OFF);
}
}
//显示listbox内容
static void ShowListBoxText(LISTBOX *listbox,BOOLEAN updatelcd)
{
INT8U i,j,maxitem,textlen,readitem,k,asciicnt;
// BOOLEAN flowflag;
LockOutBox(listbox->box); //赋参数给相应的全局变量
ClearOutBox(); //区域内清屏
ReadListBoxPara(listbox);
maxitem = listbox->numitem;
if (maxitem == 0) //若内容空,则显示“无记录”
{
// Print_Text(HZ_Blank,strlen((INT8S*)HZ_Blank));
Print_LCD(1,0,NORECORD,sizeof(NORECORD)-1);
// UpdateOutBox_MEM();
// if (updatelcd) {
// UpdateOutBox_LCD();
// }
UnLockOutBox(listbox->box);
return;
} else if (maxitem > MAXLISTITEM) {
// ErrExit(ERR_LISTBOX_MAXITEM);
}
j = (maxitem < NumLine) ? (maxitem) : (NumLine);//若max<Num, j=maxitem, 否则j=NumLine
readitem = listbox->start; //一开始指向start
if (readitem > maxitem );//err handle
for (i=0;i<j;i++)
{
textlen = listbox->itempara[readitem].textlen;
if (textlen > LineSize) //超过行显示范围,则文字就显示一行
{
textlen = LineSize;
}
MovCursor((i)*LineSize);//当前操作光标停在行首
asciicnt = 0;
for(k=0;k<LineSize;k++)
{
if(*((listbox->itempara[readitem].itemtext)+k)<0xA1) asciicnt++;
}
if(((asciicnt%2)!=0)&&(textlen == LineSize)) textlen--;
Print_LCD(readitem,0,listbox->itempara[readitem].itemtext,textlen);//显示该行内容
readitem++; //加1
readitem %= maxitem; //确保不超过maxitem
}
// UpdateListBoxArrow(listbox);
// UpdateOutBox_MEM();
// if (updatelcd) {
// UpdateOutBox_LCD();
// }
UnLockOutBox(listbox->box);
}
static void ListBoxScrollDown(LISTBOX *listbox)
{
INT8U maxitem,indicator,startitem,readitem;
INT16U textlen;
indicator = listbox->indicator;
maxitem = listbox->numitem;
if (maxitem == 0) return;
LockOutBox(listbox->box);
ReadListBoxPara(listbox);
startitem = listbox->start + 1;
if (indicator + startitem >= maxitem) {//移到最后一行,则跳转到第一行
InitListBox(listbox);
ShowListBoxText(listbox,0);
UpdateListBoxArrow(listbox);
ReverseSelItem(listbox,0);
UpdateOutBox_LCD();
UnLockOutBox(listbox->box);
return;
}
ReverseSelItem(listbox,0);
if (maxitem <= NumLine) {
indicator++;
if (indicator >= maxitem) {
indicator = 0;
}
listbox->indicator = indicator;
} else if (indicator <NumLine-1) {
listbox->indicator += 1;
} else {
listbox->start = startitem;
readitem = startitem + (NumLine-1);
//readitem %= maxitem;
textlen = listbox->itempara[readitem].textlen;
if (textlen > LineSize) {
textlen = LineSize;
}
ScrollUpOutBox(listbox->itempara[readitem].itemtext,textlen);
}
UpdateListBoxArrow(listbox);
ReverseSelItem(listbox,0);
UpdateOutBox_LCD();
UnLockOutBox(listbox->box);
}
//for ScrollUp
static void ListBoxScrollEnd(LISTBOX *listbox)
{
INT8U startitem;
if (listbox->numitem == 0) return;
startitem = listbox->start + listbox->numitem - 3;
if (listbox->numitem <= NumLine) {
listbox->indicator = (listbox->numitem) - 1;
} else {
listbox->start = startitem;
ShowListBoxText(listbox, 0);
listbox->indicator = 2;
}
}
static void ListBoxScrollUp(LISTBOX *listbox)
{
INT8U maxitem,indicator,readitem;
INT16U textlen;
indicator = listbox->indicator;
maxitem = listbox->numitem;
if (maxitem == 0) return;
LockOutBox(listbox->box);
ReadListBoxPara(listbox);
if (indicator == 0 && listbox->start == 0 ) //移到首行,则跳转到末尾
{
ReverseSelItem(listbox,0);
/*for(i=1;i<listbox->numitem;i++)*/ ListBoxScrollEnd(listbox);
UpdateListBoxArrow(listbox);
ReverseSelItem(listbox,0);
UpdateOutBox_LCD();
UnLockOutBox(listbox->box);
return;
}
ReverseSelItem(listbox,0);
if (maxitem <= NumLine) {
listbox->indicator = (indicator == 0) ? (maxitem-1) : (indicator-1);
} else if (indicator != 0) {
listbox->indicator -= 1;
} else {
readitem = listbox->start - 1;
listbox->start = readitem;
textlen = listbox->itempara[readitem].textlen;
if (textlen > LineSize) {
textlen = LineSize;
}
ScrollDownOutBox(listbox->itempara[readitem].itemtext,textlen);
}
UpdateListBoxArrow(listbox);
ReverseSelItem(listbox,0);
UpdateOutBox_LCD();
UnLockOutBox(listbox->box);
}
/* if no select item, then return 0FFH */
INT8U GetListBoxSelItem(LISTBOX *listbox)
{
INT8U selitem;
if (listbox->numitem == 0) return 0xFF;
selitem = listbox->start + listbox->indicator;
return selitem % listbox->numitem;
}
INT8U GetListBoxNumItem(LISTBOX *listbox)
{
return listbox->numitem;
}
void InitListBox(LISTBOX *listbox)
{
listbox->start = 0;
listbox->indicator = 0;
}
//将ListBox的选项全部清除
void ClearUpListBox(LISTBOX *listbox,BOOLEAN complete)
{
listbox->numitem = 0;
if (complete ) {
listbox->start = 0;
listbox->indicator = 0;
}
}
void ShowListByIndex(LISTBOX *listbox,INT8U index)
{
if (listbox->numitem <= 3) {
listbox->start = 0;
listbox->indicator = index;
} else if ((listbox->numitem - index) == 2) {
listbox->start = (listbox->numitem - 3);
listbox->indicator = 1;
} else if ((listbox->numitem - index) == 1) {
listbox->start = (listbox->numitem - 3);
listbox->indicator = 2;
} else {
listbox->start = index;
listbox->indicator = 0;
}
ShowListBoxText(listbox,1);
IndicateListBox(listbox);
}
//将ListBox的全部内容清零且刷新到DplyImagMem和LCD上
void ClearListBox(LISTBOX *listbox)
{
LockOutBox(listbox->box);
ClearOutBox();
listbox->start = 0;
listbox->indicator = 0;
listbox->numitem = 0;
UpdateOutBox_MEM();
UpdateOutBox_LCD();
UnLockOutBox(listbox->box);
}
void CreateListBox(LISTBOX *listbox)
{
ShowListBoxText(listbox,0);
CreateBorder(listbox->box);
}
//刷新ListBox并重新显示ListBox内容在DplyImagMem和LCD上
void RefreshListBox(LISTBOX *listbox)
{
InitListBox(listbox);
ShowListBoxText(listbox,1);
}
//将indicator反显,如果之前indicator已经是反显的,经过这次操作,会变回原来的状态
void UnIndicateListBox(LISTBOX *listbox)
{
LockOutBox(listbox->box);
ReverseSelItem(listbox,1);
UnLockOutBox(listbox->box);
}
//选中indicator并执行此item的selfunc()。selfunc()指的是光标移到该选项时触发的事件
void IndicateListBox(LISTBOX *listbox)
{
void (*selfunc)(void);
UnIndicateListBox(listbox);
selfunc = listbox->selfunc;
if (selfunc != NULL) (*selfunc)();
}
//释放ListBox
void DestroyListBox(LISTBOX *listbox)
{
listbox->numitem = 0;
}
//ListBox的键值处理
BOOLEAN ListBox_HdlKey(LISTBOX *listbox)
{
INT8U key,offset;
void (*execfunc)(void),(*selfunc)(void);
key = GetCurLcdKey();
selfunc = listbox->selfunc;
switch (key) {
case KEY_UP:
ListBoxScrollUp(listbox);
if (selfunc != NULL) (*selfunc)();
return TRUE;
case KEY_DOWN:
ListBoxScrollDown(listbox);
if (selfunc != NULL) (*selfunc)();
return TRUE;
case KEY_ACK:
if (listbox->numitem == 0) return FALSE;
offset = listbox->start + listbox->indicator;
offset %= listbox->numitem;
execfunc = listbox->itempara[offset].execfunc;
if (execfunc != NULL) (*execfunc)();//进入该选项的入口函数
return TRUE;
default :
return FALSE;
}
}
//添加ListBox表单项
INT8U AddListItem(LISTBOX *listbox,INT8U *text,INT16U textlen,void (*func)(void))
{
INT8U maxitem;
maxitem = listbox->numitem;
if (maxitem > MAXLISTITEM) {
return maxitem;
}
listbox->itempara[maxitem].textlen = textlen;
listbox->itempara[maxitem].itemtext = text;
listbox->itempara[maxitem].execfunc = func;
listbox->numitem = ++maxitem;
return maxitem;
}
//清除弹出式菜单的边框
void ClearPopMenuArea(LISTBOX *listbox,BOOLEAN updatelcd)
{
LockOutBox(listbox->box);
ClearBorder(listbox->box,updatelcd);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -