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

📄 keyboarddlg.cpp

📁 一个在Windows CE下开发的软键盘功能,支持联想输入,支持Unicode
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			}
			else  count=10;

			temp2=(char*)malloc(count*3+1);
			for (i=0;i<count;i++){
				temp2[3*i]='0'+i%10;
				temp2[3*i+1]=kb_hz_field[2*(i+kb_select_roll*10)];
				temp2[3*i+2]=kb_hz_field[2*(i+kb_select_roll*10)+1];
			}
			temp2[3*count]='\0';
			m_edit2.Format("%s",temp2);
			free(temp2);

			GetDlgItem(IDC_KEY12)->EnableWindow(true);
			WinRefresh(IDC_EDIT2,m_edit2);
		}
	}
}

void CKeyboardDlg::OnKey14() 
// "选择""加速"键
{
	if(kb_input_mode==INPUT_LETTER||kb_input_mode==INPUT_CAPLETTER){
		kb_last_keytime=0;
	}else if(kb_input_mode==INPUT_CHINESE){
		kb_selecting=1;
		kb_key_next=strlen(kb_key_input)+1;
		kb_key_repeat=0;

		if(strlen(kb_hz_field)>20)
			GetDlgItem(IDC_KEY13)->EnableWindow(true);

		GetDlgItem(IDC_KEY14)->EnableWindow(false);
	}
}

void CKeyboardDlg::OnKey15() 
// "撤销"键
{
	int hlen;
	
	if(kb_input_mode>=0&&kb_input_mode<=2){
		hlen=strlen(kb_hz_inputed);
		if(kb_hz_inputed[hlen-2]>'z')
			kb_hz_inputed[hlen-2]='\0';
		else
			kb_hz_inputed[hlen-1]='\0';

		m_edit1.Format("%s",kb_hz_inputed);
		WinRefresh(IDC_EDIT1,m_edit1);
		//enable "撤销"
		if(hlen<=1)	GetDlgItem(IDC_KEY15)->EnableWindow(false);

	}else if(kb_input_mode==INPUT_CHINESE){

		hlen=strlen(kb_hz_inputed);
		if (kb_selecting==1){
			kb_selecting=0;
			kb_select_roll=0;
		}

		kb_key_repeat=0;
		kb_last_key=0;
		kb_last_keytime=0;

		if (!strcmp(kb_key_input,"")){	
			if(hlen>0)	kb_hz_inputed[hlen-2]='\0';
		}

		strcpy(kb_key_input,"");
		if (kb_hz_field){
			free(kb_hz_field);
			kb_hz_field=NULL;
		}
	
		m_edit1.Format("%s",kb_hz_inputed);
		m_edit2.Format("%s","");
		m_edit3.Format("%s","");
		WinRefresh(IDC_EDIT1,m_edit1);
		WinRefresh(IDC_EDIT2,m_edit2);
		WinRefresh(IDC_EDIT3,m_edit3);
	
		if(!strcmp(kb_key_input,"")&&!strcmp(kb_hz_inputed,""))
			GetDlgItem(IDC_KEY15)->EnableWindow(false);	

		GetDlgItem(IDC_KEY12)->EnableWindow(false);
		GetDlgItem(IDC_KEY13)->EnableWindow(false);
		GetDlgItem(IDC_KEY14)->EnableWindow(false);
	}
}

void CKeyboardDlg::OnKey16() 
//  "输入法"键
{
	int hlen;

	if(kb_input_mode==INPUT_CHINESE){
		hlen=strlen(kb_hz_inputed);
		if (kb_selecting==1){
			kb_selecting=0;
			kb_select_roll=0;
		}

		kb_key_repeat=0;
		kb_last_key=0;
		kb_last_keytime=0;

		strcpy(kb_key_input,"");
		if (kb_hz_field){
			free(kb_hz_field);
			kb_hz_field=NULL;
		}
	
		m_edit2.Format("%s","");
		m_edit3.Format("%s","");
		WinRefresh(IDC_EDIT2,m_edit2);
		WinRefresh(IDC_EDIT3,m_edit3);
	}
	
	kb_input_mode++;
	kb_input_mode%=4;

	SetKeyBoard();
}

void CKeyboardDlg::OnOK() 
{
//	MessageBox(kb_hz_inputed);
		test();
	CDialog::OnOK();
}

void CKeyboardDlg::OnCancel() 
{
	
	CDialog::OnCancel();
}

void CKeyboardDlg::test()
{  
	CString sttr;
	char line[1024],tempchar;
	int No=0,k=0,sum=0;
	FILE *fp1,*fp2;

	fp1=fopen("pytable.txt","rt");
	fp2=fopen("output.txt","wt");

	do{
		fscanf(fp1,"%s\n",line);
		k=k+2;
		if (!strcmp(line,"*******"))
		// empty line
		{
//			sttr.Format("%d",k/2-1);
//			MessageBox(sttr);
			No=No+1;
			fprintf(fp2,"	// %c\n\n",'a'+No);
			k=0;
		}
		else
		{
			fprintf(fp2,"	wcscpy(pytable[%d].node[%d].yinjie,_T(\"%s\"));\n",No,k/2-1,line);
			fscanf(fp1,"%s\n",line);
			fprintf(fp2,"	pytable[%d].node[%d].count=%d;\n",No,k/2-1,strlen(line)/2);
			sum=sum+strlen(line)/2;
			fprintf(fp2,"	pytable[%d].node[%d].hzs=(TCHAR *)malloc((pytable[%d].node[%d].count+1)*MIN_UNIT_LEN);\n",No,k/2-1,No,k/2-1);
			fprintf(fp2,"	if(pytable[%d].node[%d].hzs==NULL){\n		remv_pytable();\n		return KB_ERROR;\n	}\n",No,k/2-1);
			fprintf(fp2,"	wcscpy(pytable[%d].node[%d].hzs,_T(\"%s\"));\n\n",No,k/2-1,line);
		}
	}while(!feof(fp1));
	
	sttr.Format("%d",sum);
	MessageBox(sttr);

	fclose(fp1);
	fclose(fp2);
}

int CKeyboardDlg::NumberKey(char cur_key)
{
	int tlen;

	tlen=strlen(kb_hz_inputed);
	kb_hz_inputed[tlen]=cur_key;
	kb_hz_inputed[tlen+1]='\0';

	m_edit1.Format("%s",kb_hz_inputed);
	WinRefresh(IDC_EDIT1,m_edit1);

	//enable "撤销"
	GetDlgItem(IDC_KEY15)->EnableWindow(true);
	return KB_OK;
}

int CKeyboardDlg::EnglishKey(char cur_key,int key_circle)
{
	int tlen;

	tlen=strlen(kb_hz_inputed);
	// 判断是否存在连续按同一个键,修改kb_key_repeat值
	CTime time0=CTime::GetCurrentTime();
	if ((time0-kb_last_keytime<KB_KEYDELAY)&&(kb_last_key==cur_key)){
		kb_key_repeat=kb_key_repeat+1;

		// 当前输入的英文字母
		kb_hz_inputed[tlen-1]=cur_key+(kb_key_repeat-1)%key_circle;
		kb_hz_inputed[tlen]='\0';
	}else{ 
		kb_key_repeat=1;
		kb_hz_inputed[tlen]=cur_key+(kb_key_repeat-1)%key_circle;
		kb_hz_inputed[tlen+1]='\0';
	}

	// 修改键盘全局变量
	kb_last_key=cur_key;
	kb_last_keytime=time0;

	m_edit1.Format("%s",kb_hz_inputed);
	WinRefresh(IDC_EDIT1,m_edit1);

	//enable "撤销"
	GetDlgItem(IDC_KEY15)->EnableWindow(true);
	return KB_OK;
}

int CKeyboardDlg::LetterKey(char cur_key,int key_circle)
{
	char temp[8],temp1[32]="\0",*temp2;
	int  i,tlen,count;

	// 判断是否存在连续按同一个键,修改kb_key_repeat值
	CTime time0=CTime::GetCurrentTime();
	if ((time0-kb_last_keytime<KB_KEYDELAY)&&(kb_last_key==cur_key)){
		kb_key_repeat=kb_key_repeat+1;
	}else{ 
		kb_key_next=strlen(kb_key_input)+1;
		kb_key_repeat=1;
	}

	// 修改键盘全局变量
	kb_last_key=cur_key;
	kb_last_keytime=time0;

	// 判断当前拼音音节是否合法,如果合法从对照表里找出相应字段,更新显示
	strcpy(temp,kb_key_input);
	tlen=strlen(temp);
	if( tlen>0 && tlen==kb_key_next && kb_key_repeat>1)
	{	temp[tlen-1]=cur_key+(kb_key_repeat-1)%key_circle;
		temp[tlen]='\0';
	}
	else
	{	temp[tlen]=cur_key+(kb_key_repeat-1)%key_circle;
		temp[tlen+1]='\0';
	}

	temp2=lookup_pytable(temp);    // 查找相应的汉字字段
	if (temp2==NULL){
		// 发错误提示音				
		sndPlaySound("res://IDB_WAVE_DING",SND_SYNC);
		return KB_ERROR;
	}else{ 
		if(kb_hz_field) free(kb_hz_field);
		kb_hz_field=temp2;
		// 修改当前音频音节
		strcpy(kb_key_input,temp);
		// 刷新显示
		m_edit3.Format("%s",kb_key_input);

		if(strlen(kb_hz_field)<=20)  count=strlen(kb_hz_field)/2;
		else  count=10;
		temp2=(char*)malloc(count*3+1);
		for (i=0;i<count;i++){
			temp2[3*i]='0'+i%10;
			temp2[3*i+1]=kb_hz_field[2*i];
			temp2[3*i+2]=kb_hz_field[2*i+1];
		}
		temp2[3*count]='\0';
		m_edit2.Format("%s",temp2);
		free(temp2);

		WinRefresh(IDC_EDIT1,m_edit1);
		WinRefresh(IDC_EDIT2,m_edit2);
		WinRefresh(IDC_EDIT3,m_edit3);
		
		// enable "选择"键
		GetDlgItem(IDC_KEY14)->EnableWindow(true);
		GetDlgItem(IDC_KEY15)->EnableWindow(true);	
	} 
	
	return KB_OK;
}

int CKeyboardDlg::SelectKey(int cur_key_int)
{
	int	hlen=strlen(kb_hz_inputed);
	cur_key_int=kb_select_roll*10+cur_key_int;

	kb_hz_inputed[hlen]=kb_hz_field[cur_key_int*2];
	kb_hz_inputed[hlen+1]=kb_hz_field[cur_key_int*2+1];
	kb_hz_inputed[hlen+2]='\0';

	kb_key_repeat=0;
	kb_key_next=0;
	kb_last_key=0;
	kb_last_keytime=0;
	kb_selecting=0;
	kb_select_roll=0;

	strcpy(kb_key_input,"");
	if (kb_hz_field)
	{	free(kb_hz_field);
		kb_hz_field=NULL;
	}
	
	m_edit1.Format("%s",kb_hz_inputed);
	m_edit2.Format("%s","");
	m_edit3.Format("%s","");
	WinRefresh(IDC_EDIT1,m_edit1);
	WinRefresh(IDC_EDIT2,m_edit2);
	WinRefresh(IDC_EDIT3,m_edit3);

	GetDlgItem(IDC_KEY12)->EnableWindow(false);
	GetDlgItem(IDC_KEY13)->EnableWindow(false);
	GetDlgItem(IDC_KEY15)->EnableWindow(true);
//	GetDlgItem(IDC_KEY16)->EnableWindow(false);
	
	return KB_OK;
}

void CKeyboardDlg::WinRefresh(int win_id,CString sttr)
{
	CWnd *pWnd;
	CDC  *pDC;
	pWnd=GetDlgItem(win_id);
	pDC=pWnd->GetDC();
	pDC->SetBkColor(RGB(0xd4,0xd0,0xcb));
	pDC->SelectObject(&kb_font_English);

	pWnd->Invalidate();
	pWnd->UpdateWindow();
	pDC->TextOut(5,5,sttr);
}

void CKeyboardDlg::SetKeyBoard()
{
	switch(kb_input_mode){
	
		case 0://数字

			GetDlgItem(IDC_KEY0)->SetWindowText("0");
			GetDlgItem(IDC_KEY1)->SetWindowText("1");
			GetDlgItem(IDC_KEY2)->SetWindowText("2");
			GetDlgItem(IDC_KEY3)->SetWindowText("3");
			GetDlgItem(IDC_KEY4)->SetWindowText("4");
			GetDlgItem(IDC_KEY5)->SetWindowText("5");
			GetDlgItem(IDC_KEY6)->SetWindowText("6");
			GetDlgItem(IDC_KEY7)->SetWindowText("7");
			GetDlgItem(IDC_KEY8)->SetWindowText("8");
			GetDlgItem(IDC_KEY9)->SetWindowText("9");

			GetDlgItem(IDC_KEY12)->SetWindowText("-");
			GetDlgItem(IDC_KEY13)->SetWindowText("+");
			
			GetDlgItem(IDC_KEY12)->ShowWindow(SW_SHOW);
			GetDlgItem(IDC_KEY13)->ShowWindow(SW_SHOW);
			GetDlgItem(IDC_KEY14)->ShowWindow(SW_HIDE);
			GetDlgItem(IDC_KEY15)->ShowWindow(SW_SHOW);
			GetDlgItem(IDC_KEY16)->SetWindowText("输入法/数");

			GetDlgItem(IDC_EDIT2)->ShowWindow(SW_HIDE);
			GetDlgItem(IDC_EDIT3)->ShowWindow(SW_HIDE);
			GetDlgItem(IDC_EDIT1)->MoveWindow(0,2,572,180,true);
			break;
		
		case 1://小写英文

			GetDlgItem(IDC_KEY0)->SetWindowText("空格");
			GetDlgItem(IDC_KEY1)->SetWindowText("abc");
			GetDlgItem(IDC_KEY2)->SetWindowText("def");
			GetDlgItem(IDC_KEY3)->SetWindowText("ghi");
			GetDlgItem(IDC_KEY4)->SetWindowText("jkl");
			GetDlgItem(IDC_KEY5)->SetWindowText("mn");
			GetDlgItem(IDC_KEY6)->SetWindowText("opq");
			GetDlgItem(IDC_KEY7)->SetWindowText("rst");
			GetDlgItem(IDC_KEY8)->SetWindowText("uvw");
			GetDlgItem(IDC_KEY9)->SetWindowText("xyz");
			GetDlgItem(IDC_KEY12)->SetWindowText(".");
			GetDlgItem(IDC_KEY13)->SetWindowText("_");
			GetDlgItem(IDC_KEY14)->SetWindowText("加速");

			GetDlgItem(IDC_KEY16)->SetWindowText("输入法/英");
			GetDlgItem(IDC_KEY14)->ShowWindow(SW_SHOW);

			break;			

		case 2://大写英文

			GetDlgItem(IDC_KEY1)->SetWindowText("ABC");
			GetDlgItem(IDC_KEY2)->SetWindowText("DEF");
			GetDlgItem(IDC_KEY3)->SetWindowText("GHI");
			GetDlgItem(IDC_KEY4)->SetWindowText("JKL");
			GetDlgItem(IDC_KEY5)->SetWindowText("MN");
			GetDlgItem(IDC_KEY6)->SetWindowText("OPQ");
			GetDlgItem(IDC_KEY7)->SetWindowText("RST");
			GetDlgItem(IDC_KEY8)->SetWindowText("UVW");
			GetDlgItem(IDC_KEY9)->SetWindowText("XYZ");
			break;
		
		case 3://中文

			GetDlgItem(IDC_KEY0)->SetWindowText("0/加速");
			GetDlgItem(IDC_KEY1)->SetWindowText("1 ABC");
			GetDlgItem(IDC_KEY2)->SetWindowText("2 DEF");
			GetDlgItem(IDC_KEY3)->SetWindowText("3 GHI");
			GetDlgItem(IDC_KEY4)->SetWindowText("4 JKL");
			GetDlgItem(IDC_KEY5)->SetWindowText("5 MN");
			GetDlgItem(IDC_KEY6)->SetWindowText("6 OPQ");
			GetDlgItem(IDC_KEY7)->SetWindowText("7 RST");
			GetDlgItem(IDC_KEY8)->SetWindowText("8 UVW");
			GetDlgItem(IDC_KEY9)->SetWindowText("9 XYZ");
			GetDlgItem(IDC_KEY12)->SetWindowText("前翻页");
			GetDlgItem(IDC_KEY13)->SetWindowText("后翻页");
			GetDlgItem(IDC_KEY14)->SetWindowText("选择");
			GetDlgItem(IDC_KEY16)->SetWindowText("输入法/汉");

			GetDlgItem(IDC_KEY12)->ShowWindow(SW_SHOW);
			GetDlgItem(IDC_KEY13)->ShowWindow(SW_SHOW);
			GetDlgItem(IDC_KEY14)->ShowWindow(SW_SHOW);
			GetDlgItem(IDC_KEY15)->ShowWindow(SW_SHOW);

			GetDlgItem(IDC_KEY12)->EnableWindow(false);
			GetDlgItem(IDC_KEY13)->EnableWindow(false);
			GetDlgItem(IDC_KEY14)->EnableWindow(false);

			GetDlgItem(IDC_EDIT1)->MoveWindow(0,2,572,122,true);
			GetDlgItem(IDC_EDIT2)->ShowWindow(SW_SHOW);
			GetDlgItem(IDC_EDIT3)->ShowWindow(SW_SHOW);

			break;

	}
}

⌨️ 快捷键说明

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