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