⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listbox.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 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 + -