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

📄 editbox.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
******************************************************************
*                  XIAMEN YAXON NETWORK CO.LTD.  
*                   XINXI BUILDING,HULI,XIAMEN
*      (c) Copyright 2002,XIAMEN YAXON NETWORK CO.LTD. ,XIAMEN
*                     All Rights Reserved
*
* FileName     :  EDITBOX.C
* Programmer(s):  WuJingYu
* Description  : 
******************************************************************
*/

/*
*****************************************************************
*                  REVISION HISTORY
*                 
* Date:    2002-10-26
*****************************************************************
*/ 
#define EDITBOX_GLOBALS 
#include "includes.h"
#include "TimeTask.h"
#include "ErrTask.H"
#include "LCD.H"
#include "Tools.H"


static INT8U LineSize,NumLine,MaxSize;
static INT8U BoxActualLen,FillLine,LinePos[6];
//FillLine表示已经完整有内容的行数;LinePos[]记录每行末尾内容在editbuf中的下标,即每行显示的内容的长度,与框体长度可能会有不一致
static EDITBOX *CurEditBox;

//获取EditBox自己的一些框体参数,主要是为了修改MaxSize
static void  ReadEditBoxPara(EDITBOX *editbox)
{
    NumLine  = editbox->box->numrow;
    LineSize = editbox->box->numcol;
    MaxSize  = NumLine * LineSize;	//修改MaxSize
}    

//把从movindex开始、长度为movlen的内容删除,剩下的内容的地址直接接上movindex。返回删除后的字符串长度
static INT16U MovCharFromMem(INT8U *mem,INT16U sstrlen,INT16U movindex,INT16U movlen)
{
     INT16U len;
     INT8U *sptr,*dptr;
     
     if (movindex > sstrlen) return sstrlen;
     if (sstrlen < movindex + movlen) {	    //若所要删除的长度大于字符串长度,直接将字符串长度改为movindex即可
         movlen = sstrlen - movindex;
         return movindex;
     }
     dptr = mem + movindex;
     sptr = mem + movindex + movlen;
     len = sstrlen - movindex - movlen;
     memmove(dptr,sptr,len);	//将长度为len的内容从sptr拷贝到dptr,即把从movindex开始长度为movlen的内容删除,后面的接上movindex
     //若len的长度小于movlen的长度呢?
     return sstrlen - movlen;
}
//在总长度为memlen的字符串中间的insertdot位置处插入长度为insertlen的字符串*insertmem,返回改变后的字符串长度memlen + insertlen
static INT16U InsertInMem(INT8U *mem,INT16U memlen,INT16U insertdot,INT8U *insertmem,INT16U insertlen)
{
     INT8U *sptr,*dptr;
    // if (insertdot > memlen ) return memlen;
     sptr = mem + memlen;
     dptr = sptr + insertlen;
     while (sptr >= mem + insertdot){//将insertdot位置处的原有数据向后移动insertlen长度
        *dptr--  = *sptr--;
     }
     sptr = insertmem;
     dptr = mem + insertdot;
     while (sptr < insertmem + insertlen) {	//向insertdot位置写入长度为insertlen的内容
        *dptr++ = *sptr++;
     }   
     return memlen + insertlen;
}    

//将editbox缓冲的当前下标cursor转化成editbox框的真实光标位置,返回真实光标位置
static INT8U ImageOutBoxCursor(EDITBOX *editbox)
{
     INT8U i,differ;
     
     differ = editbox->cursor - editbox->start;	//cursor指向当前的editbuf[]的下标
     i = 0;
     while ((editbox->cursor >= LinePos[i]) && (i < FillLine)) {
        if (i == 0) {
           if (LinePos[i] < editbox->start + LineSize - 1)  {//第一行显示的内容长度比编辑框的长度小,即行末尾被我们添加了一个空格
              differ++;
           } 
        } else if (LinePos[i] - LinePos[i-1] < LineSize) {	//第i行显示的内容长度比编辑框的长度小,即行末尾被我们添加了一个空格
            differ++;
        }    
        i++;
     }
     return differ;	//返回在editbox中的距离start的实际光标位置
}    

//确定FillLine的值,给LinePos[]赋值。用于日后的判断光标转化
static void PlotEditBoxLine(EDITBOX *editbox)
{
     INT8U start,len,i;
     INT8U *ptr;
     
     ReadEditBoxPara(editbox);	//修改参数MaxSize
     FillLine = 0;
     start = editbox->start;
     ptr = editbox->editbuf + start ;	//ptr指向editbox的首部

     if (start + MaxSize > editbox->editlen) {
        len = editbox->editlen - start;
     } else {
        len = MaxSize;
     }
     i =  LineSize - 1;   
     while (len >= LineSize) {
        if (NeedRoundLine(ptr,LineSize) == TRUE) {	//若末尾最后空间不够显示一个完整汉字
           i--;
           len++;
        } 
        LinePos[FillLine] = start + i;	//给LinePos[]赋值
        i++ ; //指向下一行
        ptr += i;	//ptr也指向下一行
        i += LineSize - 1;	//i改动
        len -= LineSize;
        FillLine++;	//移到下有内容的整行
     }  
     BoxActualLen = i - LineSize + len;	    //已写入内容的长度,暂时用不上此变量
}

//把start向左移动一个或者两个字节
static void MovForwardEditStart(EDITBOX *editbox)
{
     if (editbox->start == 0) {
       return;
     } else {
        editbox->start--;
        if (editbox->editbuf[editbox->start] & 0x80) {	//如果是汉字,要多移动一个字节
            editbox->start--;
	    }
     }       
}

//将start向前移动一个或者两个字节
static void MovBackwardEditStart(EDITBOX *editbox) 
{
     if (editbox->start >= editbox->editlen) {
        editbox->start = editbox->editlen;
        return;
     }  else {
        if (editbox->editbuf[editbox->start] & 0x80) {
            editbox->start++;
        }
        editbox->start++;
     }       
}    

//在EditBox显示start起始、长度为textlen的字符串
static void ShowEditBoxText(EDITBOX *editbox,BOOLEAN updatelcd)
{
     INT8U start,textlen;
    
     start = editbox->start;
     textlen = editbox->editlen - start;
     if (textlen > MaxSize) {
        textlen = MaxSize;	//若显示的长度大于或者等于MaxSize,则无需清屏,显示的东西足以覆盖全屏
     } else {
        ClearOutBox(); //清屏
     }
     Print_Text(&editbox->editbuf[start],textlen);  //向OutCharMem写入字符串
     PlotEditBoxLine(editbox);	//给LinePos[]赋值,便于日后光标的显示
     UpdateOutBox_MEM();	//刷新DplyImagMem
     if (updatelcd) UpdateOutBox_LCD();	//如果需要,刷新LCD
}

//获取光标位置,使得当前光标闪烁
static void EditCursorFlashProc(void)  
{
     INT8U actualcursor;
     LockOutBox(CurEditBox->box);	//将当前EditBox的一些值推入全局变量
     actualcursor = ImageOutBoxCursor(CurEditBox);	//获取当前光标位置
     FlashOutBoxCursor(actualcursor);	//光标闪烁
}

//设置editbox当前输入法状态为editmode
void SetEditBoxEditMode(EDITBOX *editbox,INT8U editmode)
{
     if (editmode > CHARMODE) {
        editmode = CHINESEMODE;	//若出错,默认情况改为汉字输入状态
     }   
     editbox->editmode = editmode;	//确定输入法状态
     SYSTEM_EDITMODE   = editmode;	//将系统的输入法状态也改为editmode
}

//获取editbox的输入法状态
INT8U GetEditBoxEditMode(EDITBOX *editbox)
{
     return editbox->editmode;
}

//光标向前移动,即光标向左移动
void MovForwardEditCursor(EDITBOX *editbox)
{
     INT8U actualcursor;
     
     LockOutBox(editbox->box);
     if (editbox->cursor == 0) {
       return;
     } else {
        actualcursor = ImageOutBoxCursor(editbox);	//得到真实光标的位置的值
        LightOffOutBox_Cursor(actualcursor);
        //LightOffOutBoxCursor(actualcursor);		//清除当前光标
        if (editbox->cursor == editbox->start) {	//若当前光标位置是在框体开头处
            MovForwardEditStart(editbox);		//修改start位置
            ShowEditBoxText(editbox,0);			//相应改动editbox显示的内容
            //PlotEditBoxLine(editbox);
        }
        editbox->cursor--;     //光标位置减1
        if (editbox->editbuf[editbox->cursor] & 0x80) {	//若为汉字,还要减1(即判断光标位置下的ASCII码是否为汉字)
            editbox->cursor--;
        }
        actualcursor = ImageOutBoxCursor(editbox);	 //得到修改后真实光标位置的值
        LightOnOutBox_Cursor(actualcursor);
        //LightOnOutBoxCursor(actualcursor);    		 //显示光标
        UpdateOutBox_LCD();	   //刷新LCD
	//LcdUpdate_Full();
     }    
}

//光标向后移动,即光标向右移动,处理方法类似上面向前移动
void MovBackwardEditCursor(EDITBOX *editbox)
{
     INT8U actualcursor;
     
     LockOutBox(editbox->box);
     if (editbox->cursor >= editbox->editlen) {
        editbox->cursor = editbox->editlen;
        return;
     }  else {
        PlotEditBoxLine(editbox);
        actualcursor = ImageOutBoxCursor(editbox);
        LightOffOutBox_Cursor(actualcursor);
        if (editbox->editbuf[editbox->cursor] & 0x80) {
            editbox->cursor++;
        }
        editbox->cursor++;
        actualcursor = ImageOutBoxCursor(editbox);
        if (actualcursor  >= MaxSize) {
           MovBackwardEditStart(editbox);
           ShowEditBoxText(editbox,0); 
           //PlotEditBoxLine(editbox);
           actualcursor = ImageOutBoxCursor(editbox);
        }
        LightOnOutBox_Cursor(actualcursor);  
        UpdateOutBox_LCD();  
     } 
    
}

//在Editbox中从当前光标处插入字符charcode
void EditBoxInsertChar(EDITBOX *editbox,INT8U *charcode)
{
     INT8U actualcursor;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -