📄 editbox.c
字号:
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 + -