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

📄 input.c

📁 带五种输入方式的编辑框
💻 C
📖 第 1 页 / 共 2 页
字号:
        }
        else{
            i += 1;
        }
        //
        if(i > ginput_para.editseat){  //落在一个字中间
            ginput_para.editseat --;
            i -= 2;
            break;
        }
    }while(1);
    ginput_para.cursorline = (i-strtbl[row])*6;       //光标的列
    
    //下面开始实际显示
    for(i = ginput_para.startline; i <= ginput_para.endline; i ++){ //把行清空
        LcdClearRowRam(i);
    }
    row = 0;
    for(i = ginput_para.startline; i <= ginput_para.endline; i ++){
        if(strtbl[row+1] == 0xff){     //最后一行了
            LcdFillRowRam(i, 0, &ginput_para.str[strtbl[row]], FDISP);
            break;
        }
        len = strtbl[row+1]-strtbl[row];
        memcpy(dispbuf, &ginput_para.str[strtbl[row]], len);
        dispbuf[len] = 0;
        LcdFillRowRam(i, 0, dispbuf, FDISP);
        row ++;
    }
    LcdBrushScreen();
}

/*******************************************************************
函数名称: tpi_input_cursor
函数功能: 处理光标闪烁消息
相关调用: 
入口参数: 
返 回 值:
备    注:  
创建信息: YZM  2006-11-17
修改信息: 
********************************************************************/
void input_cursor_opentime(void)
{
    gTpiTimePwdPadCb.MsgPriority = MSG_NORMAL;				//一般消息              
    gTpiTimePwdPadCb.Status = MSG_SERVICE;					//服务
    gTpiTimePwdPadCb.MsgDest = TPI;                     	//至TPI层                   
    gTpiTimePwdPadCb.Msg = TPI_INPUT_CURSOR;                //光标闪烁
    gTpiTimePwdPadCb.WParam = 0;
    gTpiTimePwdPadCb.LParam = 0;
    OpenTimer(TIMER_CURSOR,10,(u32)&gTpiTimePwdPadCb);      //打开光标定时器
}
u8 tpi_input_cursortime(MSG *msg)
{
    addkey[0] = CURSOR_SHINE;  //加一个闪烁的键值
    input_cursor_opentime();
    return MSG_OUT;
}
void input_cursor_shine(u8 row, u8 line)  //闪烁函数
{
    u8 start, end;
    
    start = line;
    end = start+1;
    LcdRowNodispRamAt(row, start, end);
    LcdBrushScreen();
}
/*******************************************************************
函数名称: tpi_set_paypwd
函数功能: 输入字符主函数
相关调用: 
入口参数: WParam回调消息;LParam限制长度;
返 回 值: cbmsg.WParam(ENTER,ESC);cbmsg.LParam=*inputstr;
备    注:  
创建信息: YZM  2006-11-24
修改信息: 
********************************************************************/
u8 tpi_input(MSG *msg)
{
    u8 key, inputlen;
    u16 i;
    char outtemp[5];

    if(msg->Status == MSG_TERMINAL) //该消息被终止
    {
        CloseTimer(TIMER_ZIMULAST); //停止字母确定时间
        CloseTimer(TIMER_CURSOR);   //停止光标闪烁
    	return MSG_OUT;
    }
    if(msg->Status == MSG_INITIAL){
		msg->Status = MSG_SERVICE;
		addkey[0] = SHIFTKEY;
		input_cursor_opentime();    //打开光标定时器
		tpi_input_disp();
    }
    //判断时间和键值
    if(addkey[0]+addkey[1]){
        if(addkey[0]){
            key = addkey[0];
            addkey[0] = 0;
        }
        else{
            key = addkey[1];
            addkey[1] = 0;
        }
    }
    else{
        key = GetKey(gKeyPadTab);
    }
    
	if(key != 0){
	    memset(outtemp, 0, 5);
	    switch(ginput_para.modetbl[ginput_para.curmode]){
	        case 1:
	            key = t9main(key, outtemp, &ginput_para.t9pyatt);
	            break;
	        case 2:
	            key = zimumain(key, 2, outtemp, &ginput_para.zimuatt);
	            break;
	        case 3:
	            key = zimumain(key, 3, outtemp, &ginput_para.zimuatt);
	            break;
	        case 4:
	            key = shuzimain(key, outtemp);
	            break;
	        case 5:
	            key = fuhaomain(key, outtemp, &ginput_para.fuhaopage);
	            break;
	    }
	    //对输入法返回的值解析
	    switch(key){
	        case 0:
	            inputlen = strlen(outtemp);
	            if(inputlen == 0){   //无输入
	                break;
	            }
	            if((ginput_para.edittail-ginput_para.edithead+inputlen) > ginput_para.limitlen){
	                break;    //超过限定
	            }
	            //
	            for(i = ginput_para.edittail+inputlen; i > ginput_para.editseat; i --){
	                ginput_para.str[i] = ginput_para.str[i-inputlen];  //依次后移
	                if((i-inputlen) == 0){
	                    break;
	                }
	            }
	            memcpy(&ginput_para.str[ginput_para.editseat], outtemp, inputlen);
	            ginput_para.editseat += inputlen;
	            memset(outtemp, 0, 5);  //使用后清空
	            tpi_input_disp();
	        case CURSOR_SHINE:
	            input_cursor_shine(ginput_para.cursorrow, ginput_para.cursorline);
	            break;
	        case CLEAR:
	            if(ginput_para.editseat == ginput_para.edithead){
	                break;
	            }
	            key = 1;
	            if(ginput_para.editseat > ginput_para.edithead+1){
	                if(ginput_para.str[ginput_para.editseat-2] > 0x80){
	                    key = 2;
	                }
	            }
	            ginput_para.editseat -= key;
	            for(i = ginput_para.editseat; i <= ginput_para.edittail-key; i ++){
	                ginput_para.str[i] = ginput_para.str[i+key];
	            }
	            tpi_input_disp();
	            break;
	        case ENTER:
	            CloseTimer(TIMER_CURSOR);   //停止光标闪烁
	            tpi_input_disp();           //重新刷新显示
	            //
	            if(ginput_para.edittail-ginput_para.edithead > ginput_para.minlen){ //达到最小值
	                ginput_para.cbmsg.WParam = ENTER;
	                ginput_para.cbmsg.LParam = (u32)&ginput_para.str[ginput_para.edithead];
	                SendMessage(&ginput_para.cbmsg);
	                return MSG_OUT;
	            }
	            break;
	        case ESC:
	            CloseTimer(TIMER_CURSOR);   //停止光标闪烁
	            ginput_para.cbmsg.WParam = ESC;
	            SendMessage(&ginput_para.cbmsg);
	            return MSG_OUT;
	            break;
	        case LEFT:
	            if(ginput_para.editseat-ginput_para.edithead > 0){
	                key = 1;
	                if(ginput_para.editseat-ginput_para.edithead > 1){
	                    if(ginput_para.str[ginput_para.editseat-2] > 0x80){
	                        key = 2;
	                    }
	                }
	                ginput_para.editseat -= key;
	                tpi_input_disp();
	            }
	            break;
	        case RIGHT:
	            if(ginput_para.editseat < ginput_para.edittail){
	                if(ginput_para.str[ginput_para.editseat] > 0x80){
	                    key = 2;
	                }
	                else{
	                    key = 1;
	                }
	                ginput_para.editseat += key;
	                tpi_input_disp();
	            }
	            break;
	        case UP:
	            if(ginput_para.editseat-ginput_para.edithead >= 20){
	                ginput_para.editseat -= 20;
	                tpi_input_disp();
	            }
	            break;
	        case DOWN:
	            if((ginput_para.edittail-ginput_para.editseat) >= 20){
	                ginput_para.editseat += 20;
	                tpi_input_disp();
	            }
	            break;
	        case SHIFTKEY:
	            if(ginput_para.modetbl[ginput_para.curmode+1] == 0){
	                if(ginput_para.curmode == 0){
	                    break;
	                }
	                else{
	                    ginput_para.curmode = 0;
	                }
	            }
	            else{
	                ginput_para.curmode ++;
	            }
	            //
	            LcdClearRowRam(LINE4);
	            LcdClearRowRam(LINE5);
	            switch(ginput_para.modetbl[ginput_para.curmode]){
	                case 1:
	                    LcdFillRowRam(LINE4, 0, "T9:", FDISP|INCOL);
	                    memset(&ginput_para.t9pyatt, 0, sizeof(_T9PYATT));
	                    break;
	                case 2:
	                    LcdFillRowRam(LINE4, 0, "大写字母:", FDISP|INCOL);
	                    memset(&ginput_para.zimuatt, 0, sizeof(ZIMUATT));
	                    break;
	                case 3:
	                    LcdFillRowRam(LINE4, 0, "小写字母:", FDISP|INCOL);
	                    memset(&ginput_para.zimuatt, 0, sizeof(ZIMUATT));
	                    break;
	                case 4:
	                    LcdFillRowRam(LINE4, 0, "输入数字", FDISP|INCOL);
	                    break;
	                case 5:
	                    LcdFillRowRam(LINE4, 0, "输入符号:", FDISP|INCOL);
	                    ginput_para.fuhaopage = 0;
	                    fuhaomain(UP, outtemp, &ginput_para.fuhaopage);
	                    break;
	            }
	            LcdBrushScreen();
	            break;
	    }
	}
	return MSG_KEEP;
}
/*******************************************************************
函数名称: PostInput
函数功能: 调用输入字符消息
相关调用: 
入口参数: msgCbId回调消息;limitlen限制长度;inputbuf标记内存;
返 回 值:
备    注:  
创建信息: YZM  2006-11-24
修改信息: 
********************************************************************/
void PostInput(_INPUTPOSTFMT *inputpostfmt)
{
    u8 i;
    u32 mode;
    MSG msg;
    
	memset((u8*)&ginput_para, 0, sizeof(_INPUT_PARA));
	//
	ginput_para.cbmsg = inputpostfmt->cbmsg;
	mode = inputpostfmt->mode;
	for(i = 0; i < 8; i ++){
	    ginput_para.modetbl[i] = mode>>28;
	    mode <<= 4;
	}
	ginput_para.minlen = inputpostfmt->minlen;
	ginput_para.limitlen = inputpostfmt->limitlen;
	ginput_para.startline = inputpostfmt->startline;
	ginput_para.endline = inputpostfmt->endline;
	strcpy(ginput_para.str, inputpostfmt->title);       //把标题和正文都集合到一起
	strcat(ginput_para.str, inputpostfmt->str);
//	strcat(ginput_para.str, " ");  //编辑的时候多加一个空格;
	//
	ginput_para.curmode = 0xff;    //下一个就是0,用来首次刷新
	ginput_para.edithead = strlen(inputpostfmt->title); //标题长度,也是编辑的前截止位置
	ginput_para.edittail = strlen(ginput_para.str);
	ginput_para.editseat = ginput_para.edittail;
	ginput_para.dispstartline = 0; //从0行开始显示
	//
    msg.MsgPriority = MSG_NORMAL;       //普通消息 
    msg.Status = MSG_INITIAL;		    //初始化消息
    msg.MsgDest = TPI;				    //至MMI
    msg.Msg = TPI_INPUT;			    //INPUT消息
    msg.WParam = 0;
    msg.LParam = 0;
    SendMessage(&msg);
}

⌨️ 快捷键说明

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