📄 selebox.c
字号:
OptFunc = selectbox->optfunc;
if (OptFunc != NULL) {
(*OptFunc)();
}
}
return TRUE;
}
}
void InitSelectBox(SELECTBOX *selectbox)
{
INT8U i;
selectbox->cursor = 0;
selectbox->line = 0;
selectbox->textlen = 0;
for (i=0;i<6;i++) selectbox->asciichar[i]=0;
LetterInit();//y
}
//y
void DestroySelectBox(SELECTBOX *selectbox)
{
selectbox = selectbox;
StopTmr(KeyInTmr);
RemoveTmr(KeyInTmr);
}
//y
void CreateSelectBox(SELECTBOX *selectbox)
{
LockOutBox(selectbox->box);
ReadSelectBoxPara(selectbox);
ShowSelectBoxText(selectbox,0);
}
void IndicateSelectBox(SELECTBOX *selectbox)
{
INT8U TempFlag;
LockOutBox(selectbox->box);
selectbox->line = 0;
ReadSelectBoxPara(selectbox);
ShowSelectBoxText(selectbox,1);
TempFlag = SelMode;
if(SignFlag==TRUE) SelMode = 1;
if (selectbox->textlen > 0) {
ReverseSelectBoxCursor(selectbox,1);
}
SelMode = TempFlag;
}
void UnIndicateSelectBox(SELECTBOX * selectbox)
{
LockOutBox(selectbox->box);
selectbox->line = 0;
selectbox->textlen = 0;
memset(selectbox->asciichar,0,sizeof(selectbox->asciichar));//清空asciichar
memset(selectbox->seltext, ' ',sizeof(selectbox->seltext));
ReadSelectBoxPara(selectbox);
ShowSelectBoxText(selectbox,1);
}
void SetSelectionMode(SELECTBOX *selectbox, INT8U mode)
{
if (mode > CHINESESELECTMODE) mode = CHINESESELECTMODE;
selectbox->selmode = mode;
}
INT8U GetSeletionMode(SELECTBOX *selectbox)
{
return selectbox->selmode;
}
//将textptr的内容拷贝到selebox中,以及设置输入法为selmode
void AddDplyTextToSelectBox(SELECTBOX *selectbox,INT8U *textptr,INT16U textlen,INT8U selmode)
{
if (textlen > MAXSELECTTEXTLEN) {
textlen = MAXSELECTTEXTLEN;
}
memcpy(selectbox->seltext,textptr,textlen);
selectbox->textlen = textlen;
SetSelectionMode(selectbox,selmode);
}
//返回当前光标的字
INT8U *GetSelectedText(SELECTBOX *selectbox)
{
INT8U index;
LockOutBox(selectbox->box);
ReadSelectBoxPara(selectbox);
index = LineLen * selectbox->line + selectbox->cursor;
return &selectbox->seltext[index];
}
//将备选汉字显示到selebox中
void DplyHZText(SELECTBOX *selectbox)
{
GetChineseMessage(P_Y_index[(selectbox->cursor)/2 + (selectbox->line)*8], &maptable);
wordaddrbase = PYMatchAddr[(selectbox->cursor+16*selectbox->line)];
wordaddrbase = (wordaddrbase<<8) + PYMatchAddr[selectbox->cursor+1+(selectbox->line)*16];
memset(selectbox->seltext, NULL, sizeof(selectbox->seltext));
AddDplyTextToSelectBox(selectbox,maptable.chinese, maptable.chlen * 2,CHINESESELECTMODE);
}
void DplyPHRText(SELECTBOX * selectbox)
{
INT8U NumofPHR = 0,i;
BOOLEAN TEMPBOOL;
memset(PHRMatchAddr, 0x00, sizeof(PHRMatchAddr));
TEMPBOOL = SearchPhraseByWord(wordaddrbase+(selectbox->cursor)+(selectbox->line)*16, PHRMatchAddr, &NumofPHR);
memset(selectbox->seltext, NULL, sizeof(selectbox->seltext));
if(TEMPBOOL==FALSE) return;//error
if(NumofPHR==0) {//该字无词组
memcpy(PHRMatchAddr, (INT8U*)PHRASEUSUAL_BASE, 16);//常用字
NumofPHR = 16;
for(i=0;i<(NumofPHR/2);i++) {
usualword[2*i] = *(INT8U*)(GBCODE_BASE + (INT16U)(PHRMatchAddr[2*i])*0x100+PHRMatchAddr[2*i+1]);
usualword[2*i+1] = *(INT8U*)(GBCODE_BASE + (INT16U)(PHRMatchAddr[2*i])*0x100+PHRMatchAddr[2*i+1]+1);
}
AddDplyTextToSelectBox(selectbox, usualword, NumofPHR, CHINESESELECTMODE);//加对无词组的处理
}else{
memcpy(&(PHRMatchAddr[NumofPHR]), (INT8U*)PHRASEUSUAL_BASE, 16);//常用字
NumofPHR += 16;
for(i = 0;i<(NumofPHR / 2);i++) {
pinyin_string[2*i] = *(INT8U*)(GBCODE_BASE + (INT16U)(PHRMatchAddr[2*i])*0x100+PHRMatchAddr[2*i+1]);
pinyin_string[2*i+1] = *(INT8U*)(GBCODE_BASE + (INT16U)(PHRMatchAddr[2*i])*0x100+PHRMatchAddr[2*i+1]+1);
}
AddDplyTextToSelectBox(selectbox,pinyin_string,NumofPHR,CHINESESELECTMODE);
}
}
void DplyPHRText2(SELECTBOX * selectbox)
{
INT8U NumofPHR = 0,i;
BOOLEAN TEMPBOOL;
INT16U TEMPADDRS;
TEMPADDRS = PHRMatchAddr[(selectbox->cursor)+(selectbox->line)*16];
TEMPADDRS = (TEMPADDRS<<8) + PHRMatchAddr[(selectbox->cursor)+1+(selectbox->line)*16];
memset(PHRMatchAddr, 0x00, sizeof(PHRMatchAddr));
TEMPBOOL = SearchPhraseByWord(TEMPADDRS, PHRMatchAddr, &NumofPHR);
memset(selectbox->seltext, NULL, sizeof(selectbox->seltext));
if(TEMPBOOL==FALSE) return;//error
if(NumofPHR==0) {//该字无词组
memcpy(PHRMatchAddr, (INT8U*)PHRASEUSUAL_BASE, 16);//常用字
NumofPHR = 16;
for(i=0;i<(NumofPHR/2);i++) {
usualword[2*i] = *(INT8U*)(GBCODE_BASE + (INT16U)(PHRMatchAddr[2*i])*0x100+PHRMatchAddr[2*i+1]);
usualword[2*i+1] = *(INT8U*)(GBCODE_BASE + (INT16U)(PHRMatchAddr[2*i])*0x100+PHRMatchAddr[2*i+1]+1);
}
AddDplyTextToSelectBox(selectbox, usualword, NumofPHR, CHINESESELECTMODE);//加对无词组的处理
}else{
memcpy(&(PHRMatchAddr[NumofPHR]), (INT8U*)PHRASEUSUAL_BASE, 16);//常用字
NumofPHR += 16;
for(i = 0;i<(NumofPHR / 2);i++) {
pinyin_string[2*i] = *(INT8U*)(GBCODE_BASE + (INT16U)(PHRMatchAddr[2*i])*0x100+PHRMatchAddr[2*i+1]);
pinyin_string[2*i+1] = *(INT8U*)(GBCODE_BASE + (INT16U)(PHRMatchAddr[2*i])*0x100+PHRMatchAddr[2*i+1]+1);
}
AddDplyTextToSelectBox(selectbox,pinyin_string,NumofPHR,CHINESESELECTMODE);
}
}
static void UsualWordInput(SELECTBOX* selectbox)
{
INT8U i;
INPUTSTATE = PHRASESELECTSTATE;
memcpy(PHRMatchAddr, (INT8U*)PHRASEUSUAL_BASE, 16);//常用字
for(i=0;i<(16/2);i++) {
usualword[2*i] = *(INT8U*)(GBCODE_BASE + (INT16U)(PHRMatchAddr[2*i])*0x100+PHRMatchAddr[2*i+1]);
usualword[2*i+1] = *(INT8U*)(GBCODE_BASE + (INT16U)(PHRMatchAddr[2*i])*0x100+PHRMatchAddr[2*i+1]+1);
}
AddDplyTextToSelectBox(selectbox, usualword, 16, CHINESESELECTMODE);
}
static void SignInput(SELECTBOX* selectbox)
{
SignFlag = TRUE;
INPUTSTATE = EDITINPUTSTATE;
KeyFlag = FirstKey;
LockOutBox(selectbox->box);
ReadSelectBoxPara(selectbox);
StopTmr(KeyInTmr);
memset(selectbox->asciichar, 0x00, sizeof(selectbox->asciichar));
AddDplyTextToSelectBox(selectbox, ENG_BD,strlen((INT8S*)ENG_BD), selectbox->selmode);
ClearPyBox();
IndicateSelectBox(selectbox);
}
/*
********************************************************************************
PYBOX SETTING
********************************************************************************
*/
void ShowPYBoxText(SELECTBOX *selectbox, TEXTBOX *pybox)
{
pybox->textlen = 6;
pybox->text = matchpy[(selectbox->cursor) / 2 + selectbox->line * 8];
RefreshTextBox(pybox);
}
static BOOLEAN CheckKeyValue(INT8U keyvalue)
{
if(IsInRange(keyvalue, KEY_0, KEY_9)) return TRUE;
if((KEY_UP == keyvalue) || (KEY_DOWN == keyvalue) || (KEY_XING == keyvalue) || (KEY_ACK == keyvalue)
|| (KEY_NCK == keyvalue) || (KEY_CLR == keyvalue) || (KEY_JING == keyvalue)) return TRUE;
return FALSE;
}
BOOLEAN SelectBox_HdlKey(SELECTBOX * selectbox)
{
void (*ExecFunc)(void);
void (*OptFunc)(void);
INT8U key;
key = GetCurLcdKey();
if(!CheckKeyValue(key)) return TRUE;
if((key!=KEY_UP)&&(key!=KEY_DOWN)&&(key!=KEY_XING)&&(key!=KEY_ACK)&&(key!=KEY_CLR)&&(key!=KEY_0)&&(key!=KEY_1))
{
SignFlag = FALSE;
// key = GetInputValue();
}
// Printu("key:\n");
// Printu("%x ",key);
switch (key) {
case KEY_UP:
MovUpSelection(selectbox,SignFlag);
if((selectbox->selmode==ASCIISELECTMODE)&&(SignFlag==FALSE)) {
StopTmr(KeyInTmr);
StartTmr(KeyInTmr, SECOND, 2);
}
if(INPUTSTATE == PINYININPUTSTATE) RefreshCurPY();
return TRUE;
case KEY_DOWN:
MovDownSelection(selectbox,SignFlag);
if((selectbox->selmode==ASCIISELECTMODE)&&(SignFlag==FALSE)) {
StopTmr(KeyInTmr);
StartTmr(KeyInTmr, SECOND, 2);
}
if(INPUTSTATE == PINYININPUTSTATE) RefreshCurPY();
return TRUE;
case KEY_ACK:
if ((selectbox->selmode==ASCIISELECTMODE)||(SignFlag==TRUE)) {//E文输入状态
DplyLetter();
StopTmr(KeyInTmr);
KeyFlag = FirstKey;
SWITCHFLAG = TRUE;//焦点切换而不删除editbox当前光标的内容
SignFlag = FALSE;
INPUTSTATE = EDITINPUTSTATE;
return FALSE;
}
if (INPUTSTATE == EDITINPUTSTATE) {//中文输入状态
return FALSE;
} else {
// if (INPUTSTATE == PINYININPUTSTATE) DsplayHZText();
ExecFunc = selectbox->execfunc;
if (ExecFunc != NULL) (*ExecFunc)();
return TRUE;
}
case KEY_NCK:
return FALSE;
case KEY_CLR:
if((selectbox->selmode==ASCIISELECTMODE)||(SignFlag==TRUE)) {//E文输入状态
UnIndicateSelectBox(selectbox);//清空selebox
StopTmr(KeyInTmr);
KeyFlag = FirstKey;
SWITCHFLAG = TRUE;
SignFlag = FALSE;
INPUTSTATE = EDITINPUTSTATE;
return FALSE;
}
if (INPUTSTATE == PINYININPUTSTATE) {
if (DelAsciiChar(selectbox)==FALSE) {
SWITCHFLAG = TRUE;
return FALSE;
} else return TRUE;
} else {
INPUTSTATE = EDITINPUTSTATE;
SWITCHFLAG = TRUE;
ExecFunc = selectbox->emptyfunc;
if (ExecFunc != NULL) {
(*ExecFunc)();
}
//RefreshCurPY();
return FALSE;//焦点转移
}
case KEY_2:
case KEY_3:
case KEY_4:
case KEY_5:
case KEY_6:
case KEY_7:
case KEY_8:
case KEY_9:
if(selectbox->selmode==ASCIISELECTMODE) return SeleLetter(selectbox, key);
if((selectbox->selmode==CHINESESELECTMODE)&&((INPUTSTATE==PINYINSELECTSTATE)||(INPUTSTATE==PHRASESELECTSTATE))) {
memset(selectbox->asciichar,0,sizeof(selectbox->asciichar));
}
return InputAsciiChar(selectbox,key);
case KEY_1:
if(selectbox->selmode==ASCIISELECTMODE) {
if(SignFlag==TRUE){
SignFlag = FALSE;
KeyFlag = RepeatKey;
}
return DplySpace();
}
SignFlag = FALSE;
UsualWordInput(selectbox);
OptFunc = selectbox->optfunc;
if (OptFunc != NULL) (*OptFunc)();
return TRUE;
case KEY_0:
if(selectbox->selmode==ASCIISELECTMODE) {
if(SignFlag==TRUE){
SignFlag = FALSE;
KeyFlag = RepeatKey;
}
return DplySpace();
}else {
if(INPUTSTATE==EDITINPUTSTATE) return FALSE;
else return TRUE;
}
case KEY_XING://标点输入
SignInput(selectbox);
return TRUE;
case KEY_JING:
return FALSE;
default:
return FALSE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -