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

📄 editbox.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
📖 第 1 页 / 共 2 页
字号:
     LockOutBox(editbox->box);
     if (editbox->editlen >= EDITMAXLENGTH) return;	//长度溢出,返回
     if (IsASCII(charcode) == TRUE) {		//若是ASCII码,不用作处理,直接插入即可
        InsertInMem(editbox->editbuf,editbox->editlen++,editbox->cursor++,charcode,1); 
     } else {
        if (editbox->editlen >= EDITMAXLENGTH - 1) return;
        InsertInMem(editbox->editbuf,editbox->editlen++,editbox->cursor++,charcode,2);    //插入的是一个汉字  
        editbox->editlen++;
        editbox->cursor++;
     }
     PlotEditBoxLine(editbox);	//确定改动后的LinePos[]值
     actualcursor = ImageOutBoxCursor(editbox);  	//获取真实光标的位置
     if (actualcursor  >= MaxSize) {
        MovBackwardEditStart(editbox);	//光标向右移动一个或两个字符的长度
     }   
     ShowEditBoxText(editbox,0);	//从start开始显示editbox内容,暂不刷新LCD
     actualcursor = ImageOutBoxCursor(editbox);       	//获取真实光标位置
     LightOnOutBoxCursor(actualcursor);    //显示光标
     UpdateOutBox_LCD();    //刷新LCD
}
    
BOOLEAN EditBoxDeleteChar(EDITBOX *editbox)   
{
     INT8U len,index;
     INT8U actualcursor;

     LockOutBox(editbox->box);
     if (editbox->editlen == 0) {	//长度为0,不能再删
        return TRUE;//Y
     } /* else if (editbox->cursor == 0) {
        return TRUE;
     }*/
     
     PlotEditBoxLine(editbox);		//求出LinePos[]值
     actualcursor = ImageOutBoxCursor(editbox);	//获取真实光标位置
     LightOffOutBoxCursor(actualcursor);	//不显示光标
     
     if (editbox->cursor == editbox->start) {
        MovForwardEditStart(editbox);
        if (editbox->start == 0) return TRUE;
     }
     len = 1;	//对len、editlen、cursor等减一
     index = editbox->cursor - 1;
     editbox->editlen--;
     editbox->cursor--;
     if (editbox->editbuf[index] & 0x80) {	//若汉字,还要多减一
        len++;
        index--;
        editbox->editlen--;
        editbox->cursor--;
     }
     MovCharFromMem(editbox->editbuf,editbox->editlen+len,index,len);	//将从index开始,长度为len的内容删除
 /*    if (editbox->cursor == editbox->start) {
        MovForwardEditStart(editbox);	//改动start的位置
     }   */
     ShowEditBoxText(editbox,0);	//显示editbox内容,暂不刷新LCD
     //PlotEditBoxLine(editbox); 
     actualcursor = ImageOutBoxCursor(editbox);	//获取真实光标位置
     LightOnOutBoxCursor(actualcursor);        //显示光标
     UpdateOutBox_LCD();  //刷新LCD
     return TRUE;
}

//用于Editbox初始化时,将光标移到现有内容的末尾
void MovEditCursorToTail(EDITBOX *editbox,BOOLEAN updatelcd)
{
      INT8U len,start,actualcursor;
      
      LockOutBox(editbox->box);	//将editbox一些参数推入全局变量
      PlotEditBoxLine(editbox);	//求出LinePos[]
      if (updatelcd) { 
         actualcursor = ImageOutBoxCursor(editbox);	//得出当前光标位置
         LightOffOutBoxCursor(actualcursor);		//消除光标
      }   
      start = editbox->start;
      len = editbox->editlen - start;
      while (len > MaxSize - 3) {
         editbox->start = LinePos[0] + 1;
         len = editbox->editlen - editbox->start;
         PlotEditBoxLine(editbox);
      }
      editbox->cursor = editbox->editlen;
      if (start != editbox->start) {
         ShowEditBoxText(editbox,updatelcd);
      } else {
         if (updatelcd) { 
            actualcursor = ImageOutBoxCursor(editbox);
            LightOnOutBoxCursor(actualcursor);
         }
     }
}

//初始化EditBox,默认输入法为汉字输入法
void InitEditBox(EDITBOX *editbox)
{
     editbox->editmode = CHINESEMODE;
     SYSTEM_EDITMODE = CHINESEMODE;
     editbox->flashtmr = CreateTimer(EditCursorFlashProc,0);	//光标闪烁
}

//创建EditBox
void CreateEditBox(EDITBOX *editbox)
{
     INT8U actualcursor;

     LockOutBox(editbox->box);
     ReadEditBoxPara(editbox);
     ShowEditBoxText(editbox,0);	//显示editbox到DplyImagMem
     actualcursor = ImageOutBoxCursor(editbox);	//获取当前真实光标位置
     LightOnOutBoxCursor(actualcursor);	//显示光标
     CurEditBox = editbox;	//获得焦点
     StartTmr(editbox->flashtmr,MILTICK,10);	//光标闪烁
     
     CreateBorder(editbox->box);	//画边框
}

//清除editbox
void ClearEditBox(EDITBOX *editbox)
{
     LockOutBox(editbox->box);
     ClearOutBox();	//清空editbox内容,光标移动到0位置
     editbox->editmode = CHINESEMODE;
     SYSTEM_EDITMODE = CHINESEMODE;
     editbox->cursor  = 0;
     editbox->start   = 0;
     editbox->editlen = 0;
     UpdateOutBox_MEM();
     UpdateOutBox_LCD();	//更新
     UnLockOutBox(editbox->box);
}

//显示editbox内容并刷新到LCD上
void RefreshEditBox(EDITBOX *editbox)
{
     LockOutBox(editbox->box);
     ShowEditBoxText(editbox,1);
}
  
//指明当前editbox,当前editbox获得焦点
void IndicateEditBox(EDITBOX *editbox)
{
     CurEditBox = editbox;
     StartTmr(editbox->flashtmr,MILTICK,10);	//光标闪烁
}

//不指出当前editbox,editbox退出焦点。但editbox仍为当前框体,光标仍然在editbox上,只是不显示出来
void UnIndicateEditBox(EDITBOX *editbox)
{
    INT8U actualcursor;
    
    StopTmr(editbox->flashtmr);
    LockOutBox(editbox->box);
    actualcursor = ImageOutBoxCursor(editbox);
    LightOffOutBoxCursor(actualcursor);
}

//当editbox要被去除时,将一些资源释放
void DestroyEditBox(EDITBOX *editbox)
{
     editbox->cursor  = 0;
     editbox->start   = 0;
     editbox->editlen = 0;
     StopTmr(editbox->flashtmr);
     RemoveTmr(editbox->flashtmr); 
} 

//获取当前系统的输入法状态
INT8U GetSystem_EditMode(void)
{
     return SYSTEM_EDITMODE;
}    
#if 0
//处理数字键,写入成功返回TRUE否则返回FALSE
BOOLEAN EditBox_HdlNumKey(EDITBOX *editbox,INT8U key)
{
     INT8U asciikey,xing_key;
     void  (*ExecFunc)(void);
    
     asciikey = key + '0';	//转化成ASCII码
     if (editbox->editattrib == CHINESEEDITBOX) {	//是汉字输入法
        if (key == KEY_JING) {	//是#字键
           editbox->editmode++; //输入法切换
           editbox->editmode %= CHARMODE + 1;	//与3取余
           SYSTEM_EDITMODE = editbox->editmode;	//系统输入法也随着变化
           ExecFunc = editbox->modechangefunc;	//进入modechangefucn处理输入法切换
           if (ExecFunc != NULL) (*ExecFunc)();	//进入汉字或字符输入状态
           return TRUE;
        } else if (editbox->editmode == NUMBERMODE) {	//是汉字输入法中的数字输入
           if (key==KEY_XING) {
	       xing_key = key+0x20;
               EditBoxInsertChar(editbox,&xing_key);
               return TRUE;
	   }
           if (IsInRange(key,KEY_0,KEY_9) == TRUE) {	//是数字键
              EditBoxInsertChar(editbox,&asciikey); 	//在光标位置处插入该ASCII码
              return TRUE;
           } else {
             return FALSE;	
           }  
        } else {
          return FALSE;
        }  
     } else if (editbox->editattrib == DIGITALEDITBOX) {	//是数字输入法
        editbox->editmode == NUMBERMODE;
        SYSTEM_EDITMODE = NUMBERMODE;
        if (IsInRange(key,KEY_0,KEY_9) == TRUE) {
           EditBoxInsertChar(editbox,&asciikey); 
           return TRUE;
        } else if (key == KEY_XING) {
           //asciikey = '*';
           asciikey = '.';
           EditBoxInsertChar(editbox,&asciikey); 
           return TRUE;
        } else if (key == KEY_JING) {
            asciikey = '#';
            EditBoxInsertChar(editbox,&asciikey); 
            return TRUE;
        } else {
          return   FALSE;
        }
     } else {
        ErrExit(ERR_EDITBOX_EDITATTRIB); 	//输入法出错 
	    return FALSE;
     }   
     
}
#endif
//编辑框的按键处理	
BOOLEAN EditBox_HdlKey(EDITBOX *editbox)
{
     INT8U  key;
     void  (*ExecFunc)(void);
     key = GetCurLcdKey();	//获得从LCDQ得到的键值
     switch (key) 
     {
        case KEY_UP:
           MovForwardEditCursor(editbox);	//光标左移
           return TRUE;
        case KEY_DOWN:
           MovBackwardEditCursor(editbox);	//光标右移
           return TRUE;
        case KEY_NCK:
	   //if (SWITCHFLAG==FALSE) {
              return EditBoxDeleteChar(editbox);	//删除当前光标后的字符
	 //  } else {
	  //    SWITCHFLAG = FALSE;
	  //    return TRUE;
	 //  }
        case KEY_ACK:
        //   if (SWITCHFLAG==FALSE) {
               ExecFunc = editbox->execfunc;	//确认键按下后触发的事件
               if (ExecFunc != NULL) {
                  UnIndicateEditBox(editbox);	//转到ExecFunc执行相应的处理函数
                  (*ExecFunc)();
              }   
	 //  }else{
	  //     SWITCHFLAG = FALSE;
	  // }
	   return TRUE;
        default:
          return TRUE;//EditBox_HdlNumKey(editbox,key);
     }      
} 

⌨️ 快捷键说明

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