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

📄 t9dispose.h

📁 主要实现T9输入法功能!自已开发,并修正6万多汉字及使用频率,单键切换输入法,输入类型分为:英文,数字,T9拼音,常用符号等!
💻 H
字号:
#pragma once

#include "HZK.h"
#include "SetControl.h"


class CDispose
{
public:
	CZK *pZk;

	UINT T9Type; //当前输入法类型(0为数字,1为字母,2为T9拼音)
	UINT T9TypeOld;

	int m_iKeyPress; //按键次数
	int m_iPYNum; //可用拼音总数
	int m_iPYNumOld;

	CString m_arrInputWord[6]; //当前输入字母
	CString m_arrSelectWord[20]; //当前符合拼音组合

	CString m_sShowWord; //当前符合的所有汉字(用于显示)

	CString m_sOutWord; //当前输出的字符串值(用于输出结果)

	CString m_sInputWord; //当前配置好的输入字母

	CString m_arrEng[5];
	CString m_sEng; //保存当前输入的英文字母
	CString m_sNum; //保存当前输入的数字


	CControl *pControl; //自定义控件组操作类
	CRect pRt; //保存当前自定义控件组的矩形大小

public:
	CDispose(void);
	~CDispose(void);

	void InitDispose(CRect rt, CWnd * pMain);

	void T9TypeOperate(); //控制当前输入法的类型切换
	void ConfigT9(WCHAR input); //对输入的数字配置T9键位字母
	void ConfigWord(WCHAR input);

	void OperateT9(void);
	void Operate123(WCHAR input);
	void OperateABC(void);
	void OperateFH(void);

	void SetControl(CString strTemp);
	CString SelectData(CPoint point);

	CString GetChiWord(CString SelectWord);
	CString GetEngWord(int index);
	CString Get123(void);
	CString GetFH(void);
	CString GetResult(void);
	CRect GetDisposeRect(void);

	void DelControl(void);

	void DelInputWord(void);
	void DelT9All(void);
	void DelABC(void);
	void Del123Input(void);
	void Del123All(void);


	void Show();//测试用


};



CDispose::CDispose(void)
{
    pZk = new CZK(); //
	T9Type = 0;      //T9输入类型初始化
	m_iKeyPress = 0; //按键记数初始化
	m_iPYNum = 0;    //本次输入所得可用拼音总数初始化
	m_iPYNumOld = 0; //上一次输入所得可用拼音总数初始化


	m_sInputWord.Empty(); //输入字符初始化
	m_sShowWord.Empty(); //显示字符初始化
	m_sOutWord.Empty(); //输出字符初始化

	m_sEng.Empty();
	m_sNum.Empty();

	pControl = new CControl();

	for(int i=0;i<20;i++)
	{
		if(i < 6)
		{
			m_arrInputWord[i].Empty();
		}
		m_arrSelectWord[i].Empty();
		
	}

}

CDispose::~CDispose(void)
{}

void CDispose::T9TypeOperate()
{
	m_sOutWord.Empty();

	static int type = 0;//(类型转换:0为数字,1为字母,2为T9拼音)

	switch(type)
	{
	case 0:
		Del123All();
		break;
	case 1:
		DelABC();
		break;
	case 2:
		DelT9All();
		break;
	default:
		break;
	}
	
	type++;

	if(type > 2)
	{
		type = 0;
	}
	T9Type = type;

}

void CDispose::InitDispose(CRect rt,CWnd *pMain)
{
	pControl->InitCStatic(&rt,pMain);
	pRt = pControl->GetControlRect();
}

void CDispose::ConfigT9(WCHAR input)
{

	if(input == _T('#'))
	{
		T9TypeOperate();
		return ;
	}

	if(input == _T('*'))
	{
		OperateFH();
		return ;
	}

	if(T9Type == 0)
	{
		Operate123(input);
	}
	else
	{
		switch(input)
		{
				case '1':
					return;
				case '2':
					m_sInputWord = "abc";
					break;
				case '3':
					m_sInputWord = "def";
					break;
				case '4':
					m_sInputWord = "ghi";
					break;
				case '5':
					m_sInputWord = "jkl";
					break;
				case '6':
					m_sInputWord = "mno";
					break;
				case '7':
					m_sInputWord = "pqrs";
					break;
				case '8':
					m_sInputWord = "tuv";
					break;
				case '9':
					m_sInputWord = "wxyz";
					break;
				//case '*':
				//	OperateFH();
				//	return;
				default:
					break;
		}

		if(input == '0')
		{
			m_sOutWord = _T(" ");
			return;
		}

		if(T9Type == 1)
		{
			OperateABC();
			return;
		}

		if(m_iKeyPress < 6)
		{
			m_arrInputWord[m_iKeyPress] = m_sInputWord; //保存当前输入至字符串数组

			m_iKeyPress++;
			
		}
		else
		{
			return ;
		}

		if(T9Type == 2)
		{
			
			OperateT9();
		}

	}
	

}

void CDispose::OperateABC(void)
{
	pControl->DelData();
	pControl->SetEngData(m_sInputWord);
}


void CDispose::OperateFH(void)
{
	m_sShowWord = pZk->GetInputString(_T("*"),1);
	pControl->DelData();
	pControl->SetFHData(m_sShowWord);
}

void CDispose::Operate123(WCHAR input)
{
	m_sNum = input;
	m_sOutWord = m_sNum;
}

void CDispose::OperateT9()
{
	CString strTemp;
	CString arrTemp[20];
	int count1,count2;//count1为外循环(上次可用拼音组合次数),count2为内循环(当前按键字母数)


	
	if(m_iKeyPress == 1)//如初次按键则赋外循环为1,只判断当前按键字母的拼音组合
	{
		count1 = 1;
	}
	else
	{
		count1 = m_iPYNumOld; //外循环次数为上次可用拼音组合
	}
		
	count2 = m_arrInputWord[m_iKeyPress-1].GetLength();

	CString str1,str2,temp;

	m_iPYNum = 0; //当前可用拼音组合总数(用于当前可用拼音组合数组下标)

	for(int m=0;m<count1;m++)
	{
			str1 = m_arrSelectWord[m];
			
			for(int n=0;n<count2;n++)
			{
				str2 = m_arrInputWord[m_iKeyPress-1].Mid(n,1);

				temp = str1 + str2;
//	AfxMessageBox(m_arrInputWord[m_iKeyPress-1]);
				m_sShowWord = pZk->GetInputString(temp,m_iKeyPress);
				if(!m_sShowWord.IsEmpty())
				{
					arrTemp[m_iPYNum] = temp;
					//m_arrSelectWord[index] = arrTemp[index];	
					m_iPYNum++; //可用拼音组合计数
				}
			}
	}

	if(m_iPYNum <= 0)
	{
		for(int i=m_iKeyPress-1;i>-1;i--)
		{
			if(m_arrInputWord[i] != _T(""))
			{
				m_arrInputWord[i].Empty();
				m_iKeyPress--;
				return;
			}
		}
	}
	m_iPYNumOld = m_iPYNum;
	//先清空数组,再从(临时)可用拼音数组保存至(成员变量)可用拼音组合数组
	for(int i=0;i<20;i++)
	{
		m_arrSelectWord[i].Empty();
		
		m_arrSelectWord[i] = arrTemp[i];
	}

}

void CDispose::SetControl(CString strTemp)
{

	pControl->SetChiData(strTemp);
	
}

CString CDispose::SelectData(CPoint point)
{
	CString strTemp = _T("");
	strTemp = pControl->SelectData(point,T9Type);
	if(strTemp!=_T(""))
	{
		m_sOutWord += strTemp;
		pControl->DelData();
		if(T9Type == 2)
		{
			DelT9All();
		}
		if(T9Type == 1)
		{
			DelABC();
		}	
	}
	
	return strTemp;
}

void CDispose::DelABC(void)
{
	m_sInputWord.Empty();
}

void CDispose::DelT9All(void)
{
	m_iKeyPress = 0;
	m_iPYNum = 0;
	m_iPYNumOld = 0;
	m_sShowWord.Empty();

	for(int i=0;i<20;i++)
	{
		if(i < 6)
		{
			m_arrInputWord[i].Empty();
		}
		m_arrSelectWord[i].Empty();
	}
}

void CDispose::DelInputWord()
{
	for(int i=m_iKeyPress-1;i>-1;i--)
	{
		if(m_arrInputWord[i] != _T(""))
		{
			m_arrInputWord[i].Empty();
			m_iKeyPress--;
			if(m_iKeyPress == 0)
			{
				m_sShowWord = _T("");
				m_iKeyPress = 0;
				m_iPYNum = 0;
				
			}
			for(int z=0;z<20;z++)
			{
				m_arrSelectWord[z].Empty();
			}


			CString strTemp;
			CString arrTemp[20];
			int count1,count2;//count1为外循环(上次可用拼音组合次数),count2为内循环(当前按键字母数)
			for(int j=1;j<=m_iKeyPress;j++)
			{

				if(j == 1)//如初次按键则赋外循环为1,只判断当前按键字母的拼音组合
				{
					count1 = 1;
				}
				else
				{
					count1 = m_iPYNumOld; //外循环次数为上次可用拼音组合
				}
				count2 = m_arrInputWord[j-1].GetLength();

				CString str1,str2,temp;

				m_iPYNum = 0; //当前可用拼音组合总数(用于当前可用拼音组合数组下标)

				for(int m=0;m<count1;m++)
				{
						str1 = m_arrSelectWord[m];

						for(int n=0;n<count2;n++)
						{
							str2 = m_arrInputWord[j-1].Mid(n,1);

							temp = str1 + str2;

							m_sShowWord = pZk->GetInputString(temp,j);
							if(m_sShowWord != _T(""))
							{
								arrTemp[m_iPYNum] = temp;
			  
								m_iPYNum++; //可用拼音组合计数
							}
						}
				}

				m_iPYNumOld = m_iPYNum;
				//先清空数组,再从(临时)可用拼音数组保存至(成员变量)可用拼音组合数组
				for(int i=0;i<20;i++)
				{
					m_arrSelectWord[i] = _T("");
					
					m_arrSelectWord[i] = arrTemp[i];
				}
			}
			return ;
		}
	}

}

void CDispose::Del123All(void)
{
	m_sNum.Empty();
}

void CDispose::Del123Input(void)
{
	if(m_sNum != _T(""))
	{
		int count = m_sNum.GetLength();
		m_sNum.Delete(count-1,1);
	}
}

void CDispose::DelControl(void)
{
	pControl->DelData();
}

CString CDispose::GetChiWord(CString SelectWord)
{
	m_sShowWord = pZk->GetInputString(SelectWord,m_iKeyPress);
	return m_sShowWord;
}

CString CDispose::GetEngWord(int index)
{
	return m_arrSelectWord[index];
}


CString CDispose::Get123(void)
{
	return m_sNum;
}

CString CDispose::GetResult(void)
{
	return m_sOutWord;
}

CRect CDispose::GetDisposeRect(void)
{
	return pRt;
}


void CDispose::Show() //测试用
{
	for(int i=0;i<20;i++)
	{
		if(i<6)
		{
			AfxMessageBox(m_arrInputWord[i]);
		}
		//if(m_arrSelectWord[i] != _T(""))
		//{
			//AfxMessageBox(m_arrSelectWord[i]);
		//}
	}
}


///读文件词库////////////////////////////////////////////////////////////////////////////////////////
//void CDispose::ReadZK(CString str)
//{
//	FILE* fp;
//	char cBuffer; //字符缓存
//	CString strBuffer; //字符串缓存
//	CString strTemp = _T("");
//
//	m_iNodeNum = 0;
//
//	fp=fopen("CK.tab","r");
//	if(fp==NULL)	
//	{	
//		fclose(fp);	
//		return ;
//	}
//
//	while(true)
//	{
//		if(fread(&cBuffer,sizeof(cBuffer),1,fp)==0)
//		{	
//			break;
//		}
//		else	
//		{
//			if(cBuffer == char(10))
//			{
//				int iTemp = strBuffer.Find(char(32));
//				
//				if(iTemp>0)
//				{
//					strTemp = strBuffer.Left(iTemp);
//
//					if(CompareZD(strTemp,str))
//					{	
//						m_sSelectWord = strTemp;
//						m_sShowWord = strBuffer.Mid(iTemp+1);
//						//AfxMessageBox(m_sShowWord);
//						AddListNode(m_sSelectWord, m_sShowWord);
//					}	
//				}
//				strBuffer = _T("");
//			}
//			else
//			{
//				strBuffer += cBuffer;
//			}
//		}
//	}
//	m_sShowWord = m_pHead->sChiWord;
//	fclose(fp);
//}

⌨️ 快捷键说明

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