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

📄 dlginput.cpp

📁 包含拼音和笔画输入的中文输入法,使用VC.NET2003开发.portable Chinese input method includes phonetic input and stroke, the
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			if ( bIsAdd == TRUE ) //!增加  
			{   
                
				if ( IsExceedLimit(1) ) //超出了限制
				{
					m_edtIn.SetFocus( ) ;
					m_edtIn.SetSel(m_nCount,m_nCount );  
					return  ;
				}

    			m_strInput = m_strInput + cChar ; 
				m_nCount++ ;
			}
			else  //!修改
			{
				m_strInput = m_strInput.Left( m_strInput.GetLength( ) -1 ) + cChar ; 
			}

		}
		else    //!当前光标不在最后 
		{  
			if ( bIsAdd == TRUE ) //!增加 
			{
				if ( IsExceedLimit(1) ) //超出了限制
				{
					m_edtIn.SetFocus( ) ;
					m_edtIn.SetSel(m_nCount,m_nCount );  
					return  ;
				}
				strRight = m_strInput.Right(m_strInput.GetLength( ) - m_nCount ) ;
				m_strInput = m_strInput.Left( m_nCount ) ;		
				m_strInput = m_strInput + cChar + strRight ;
				m_nCount++ ;
			}
			else //!修改
			{
				strRight = m_strInput.Right(m_strInput.GetLength( ) - m_nCount ) ;
				m_strInput = m_strInput.Left( m_nCount -1 ) ;		
				m_strInput = m_strInput + cChar + strRight ;
			}
		} 

		this->UpdateData(FALSE)  ;
        m_edtIn.SetFocus( ) ;
		m_edtIn.SetSel(m_nCount-1,m_nCount ) ; 
}

/*! @function  public  InputSpell********************************************************************************\brief  功能    : 输入拼音字母                    <br>函数名  :\return void \exception  \author    zqp\remark    <br>典型用法:   <br>复杂度 :                         *******************************************************************************//////// comment generated by CommentMakerPro from www.FeinSoftware.com ////////void CDlgInput::InputSpell( int nBtnNO  )
{
	TCHAR aLowerChar[9][4] ={{'a','b','c'},{'d','e','f'},{'g','h','i'},
					 {'j','k','l'},{'m','n','o'},{'p','q','r'},
					 {'s','t','u'},{'v','w','x'},{'y','z',' '}  };  

     
       TCHAR cChar ; 
	   CFileTimeSpan tSpan ;
	   CFileTime  tCurrTime =CFileTime::GetCurrentTime( ) ; 
	   tSpan = tCurrTime - m_tPreTime ;  //!前一次击键的时间间隔
       BOOL bIsAdd = TRUE ;  //! 是否是增加

	 
 
	   if ( m_nPreBtnNo != nBtnNO )  //使用不同的字符
	   {
		  
			  cChar = aLowerChar[nBtnNO-1][0] ;
	   }
	   else if ( ( m_nPreBtnNo == nBtnNO ) && ( tSpan >= m_nTimeGap*CFileTime::Millisecond ) )
	   {
     
			  cChar = aLowerChar[nBtnNO-1][0] ;
	   }
	   else if ( ( m_nPreBtnNo == nBtnNO ) && ( tSpan < m_nTimeGap*CFileTime::Millisecond ) ) //!击键间隔在1秒之内
	   {           
		            
		   CString strPos = m_strChar.Mid(m_strChar.GetLength( )-1 ,1) ;

		
				for (int i = 0 ; i < 3 ; i++ )
				 {
				 if (aLowerChar[nBtnNO-1][i] == strPos )
					  break ;
				 }
				 
				if ( ( i== 3 ) ||  ( i ==2 ) ) 
				{
					 cChar = aLowerChar[nBtnNO-1][0] ;
				 }
				 else
				 {
					 cChar = aLowerChar[nBtnNO-1][ i+1] ;
				 }
			 bIsAdd = FALSE ;  //!置修改标志
	   }
  

	    m_nPreBtnNo = nBtnNO ; //置为前一次按键序号
		m_tPreTime = tCurrTime ;  //置为前一次按键时间

 
		if ( bIsAdd == TRUE ) //!增加  
		{
		  if (m_strChar.GetLength( ) >= m_nCharMaxLen ) 
		       return  ;

    		m_strChar = m_strChar + cChar ; 
			
		}
		else  //!修改
		{
			m_strChar = m_strChar.Left( m_strChar.GetLength( ) -1 ) + cChar ; 
		}

		this->UpdateData(FALSE)  ; 
		m_Inputer.Reset( ) ;
		m_Inputer.Put(_T(m_strChar) ) ;  
		SpellQuery( ) ;
       
}

/*! @function  public  DeleteChar********************************************************************************\brief  功能    :删除一个字符                         <br>函数名  :\return void 无返回值\exception  \author  zqp  \remark    <br>典型用法:   <br>复杂度 :                         *******************************************************************************/void CDlgInput::DeleteChar(  )  
{  
  
 
   if ( m_nCount > 0 )
   {   
	   	char  cCount = m_strInput.GetAt(m_nCount-1) ;

		if ( cCount<0 || cCount > 255 )  //!不是ASCII码字符
		{
			m_nCount-=2  ;
            m_strInput.Delete(m_nCount,2 ) ;
		}
		else
		{
			m_nCount-- ;
			m_strInput.Delete(m_nCount,1 ) ;  
		}
  
		this->UpdateData(FALSE)  ;
        m_edtIn.SetFocus( ) ;
		m_edtIn.SetSel(m_nCount,m_nCount ) ;  
   } 


}


/*! @function  public  InputNumber********************************************************************************\brief  功能    :                         <br>函数名  :@param  nBtnNO int   < insert parameter description here>\return void <insert return value description here>\exception  \author    \remark    <br>典型用法:   <br>复杂度 :                         *******************************************************************************//////// comment generated by CommentMakerPro from www.FeinSoftware.com ////////void CDlgInput::InputNumber( int nBtnNO )   //输入数字
{    

	 TCHAR aChar[10] = {'1','2','3','4','5','6','7','8','9','0'} ;   

	   TCHAR  cChar = aChar[nBtnNO-1] ;
         
	   if ( IsExceedLimit(1) ) //超出了限制
	   {
			m_edtIn.SetFocus( ) ;
			m_edtIn.SetSel(m_nCount,m_nCount );  
			return  ;
	   }
   
		CString strRight ;
		if  (m_strInput.GetLength( ) == m_nCount ) //当前的光标在最后
		{   
				m_strInput = m_strInput + cChar ; 
		}
		else    //!当前光标不在最后 
		{  
			strRight = m_strInput.Right(m_strInput.GetLength( ) - m_nCount ) ;
			m_strInput = m_strInput.Left( m_nCount ) ;		
			m_strInput = m_strInput + cChar + strRight ;
			
		} 
		m_nCount++ ; 					
		this->UpdateData(FALSE) ;
        m_edtIn.SetFocus( ) ;
		m_edtIn.SetSel(m_nCount-1,m_nCount );  
}

/*! @function  public  InputSymbol********************************************************************************\brief  功能    : 输入一些特殊的符号              <br>函数名  :\return void 无返回值\exception  \author    zqp\remark    <br>典型用法:输入:'#','$'   <br>复杂度 :                         *******************************************************************************//////// comment generated by CommentMakerPro from www.FeinSoftware.com ////////void CDlgInput::InputSymbol(  ) 
{
    
        CString strword ;
		if ( IsExceedLimit(1) ) //超出了限制
		{
			m_edtIn.SetFocus( ) ;
			m_edtIn.SetSel(m_nCount,m_nCount );  
			return  ;
		}

		int nIndex =m_lsList.GetCurSel( ) ;
		nIndex = m_nCurrPage*m_nPageSize + nIndex ;

		if ( ( nIndex > m_nSymbolCount ) || ( m_nPageCount < 1 ) )
			return  ;

		strword  = m_aSymbol[nIndex] ;

		if  (m_strInput.GetLength( ) == m_nCount ) //当前的光标在最后
		{   
				m_strInput = m_strInput + strword ; 
		}
		else    //!当前光标不在最后 
		{  
			CString strRight = m_strInput.Right(m_strInput.GetLength( ) - m_nCount ) ;
			m_strInput = m_strInput.Left( m_nCount ) ;		
			m_strInput = m_strInput + strword + strRight ;
			
		}

		m_nCount++ ;
        this->UpdateData(FALSE) ;
        m_edtIn.SetFocus( ) ;
		m_edtIn.SetSel(m_nCount,m_nCount );  
}


 

//最接近的除法 
  
/*! @function  public  NearDev********************************************************************************\brief  功能    :                         <br>函数名  :@param  DevNum int   除数@param  DevedNum int   被除数\return int 除法的结果\exception  \author  邹清平  \remark    <br>典型用法:  9/5 = 2 ;  6/5 =1  <br>复杂度 :                         *******************************************************************************//////// comment generated by CommentMakerPro from www.FeinSoftware.com ////////int CDlgInput::NearDev(int DevNum ,int DevedNum )  
{
   int nRec  ,nMode ;

   nRec = (int) DevedNum/DevNum ;
   nMode = DevedNum % DevNum  ;
    
	if ( nMode > (int)DevNum/2 ) 
		nRec++ ; 
  return  nRec ;
}
void CDlgInput::OnLbnSelchangeList( )
{
	// TODO: 在此添加控件通知处理程序代码
		ChineseInputer::WordEnumerator::iterator  it ; 
		int nIndex ;
		if ( m_nMode == Char_Mode || m_nMode == Number_Mode )  //是字符输入模式
		{
		    InputSymbol( ) ;
			return  ;
		}
 

       if ( IsExceedLimit(2) ) //超出了限制
	   {
			m_edtIn.SetFocus( ) ;
			m_edtIn.SetSel(m_nCount,m_nCount );  
			return  ;
	   }
    
		nIndex = m_lsList.GetCurSel( ) ;

		nIndex = m_nCurrPage * m_nPageSize + nIndex ;
 // 
		 int i = 0 ;
		 for( it = enumer.begin( ) ; it !=enumer.end() ;it++ )
		 {
			 if ( i == nIndex ) 
				 break ;
			 else 
				 i++ ;
		  }

		CString strword ="" ;
		strword = (CString)(Word)(*it) ;
		strword.TrimLeft( ) ;
		strword = strword.Left(2);
  

		if  (m_strInput.GetLength( ) == m_nCount ) //当前的光标在最后
		{   
				m_strInput = m_strInput + strword ; 
		}
		else    //!当前光标不在最后 
		{  
			CString strRight = m_strInput.Right(m_strInput.GetLength( ) - m_nCount ) ;
			m_strInput = m_strInput.Left( m_nCount ) ;		
			m_strInput = m_strInput + strword + strRight ;
			
		}

		m_nCount++ ; 
		m_nCount++ ; 

		m_strChar = "" ;
		m_strOrderFilter ="" ;
		m_Inputer.Reset( ) ; 

		this->UpdateData(FALSE) ;
        m_edtIn.SetFocus( ) ;
		m_edtIn.SetSel(m_nCount,m_nCount );  

	
        
}

void CDlgInput::OnEnMaxtextEdtin()
{
	// TODO: 在此添加控件通知处理程序代码 
	::AfxMessageBox("超出了最大的长度" ) ;
}

/*! @function  public  IsExceedLimit********************************************************************************\brief  功能    :   判断是否超出输入框的最在长度  <br>函数名  :@param  nInputLen int 需要输入的长度  \return BOOL TRUE 表示超出,FALSE 表示没有超出\exception  \author    邹清平\remark    <br>典型用法:   <br>复杂度 :                         *******************************************************************************//////// comment generated by CommentMakerPro from www.FeinSoftware.com ////////BOOL CDlgInput::IsExceedLimit( int nInputLen ) 
{ 
	if ( m_strInput.GetLength( ) + nInputLen >  m_nInputMaxLen  )   
		return TRUE  ;
	else
		return FALSE ;

}

void  CDlgInput::MakeSymbol( ) //生成特殊符号
{
     
	 CString stri  ;
    
	 m_nPageCount = (int)( m_nSymbolCount/m_nPageSize)  ; //总页数

				//计数总页数
	if ( (m_nSymbolCount % m_nPageSize ) != 0 )
		m_nPageCount = m_nPageCount + 1  ; 

	 m_nCurrPage = 0 ;  //当前页码 
     int nIndex  ; 
     m_lsList.ResetContent( ) ;	
     for (int i =1 ; i<= m_nPageSize ; i++ )  //m_it =enumer.begin( ) ; m_it !=enumer.end() ;m_it++ 
	{   
	 	
		if ( i == 10 )
			stri.Format("%d" ,0) ;
		else
			stri.Format("%d" ,i) ; 
		nIndex = m_nCurrPage*m_nPageSize + i - 1  ;
	    if ( nIndex >=  m_nSymbolCount   )
			break ;

		m_lsList.AddString( stri+ ":" + m_aSymbol[ nIndex] ) ; 

	}  

}

void CDlgInput::SymbolHome( ) //首页
{   
	 CString stri ; 
	if( m_nCurrPage ==  0 || m_nPageCount == 0 ) //第一页
		return  ;

	 m_nCurrPage = 0 ;  //当前页码 
     int nIndex  ; 
     m_lsList.ResetContent( ) ;	
     for (int i = 1 ; i<=  m_nPageSize ; i++ )  //m_it =enumer.begin( ) ; m_it !=enumer.end() ;m_it++ 
	{   
	 	
		if ( i == 10 )
			stri.Format("%d" ,0) ;
		else
			stri.Format("%d" ,i) ; 
		nIndex = m_nCurrPage*m_nPageSize + i-1 ;
	    if ( nIndex >=  m_nSymbolCount   )
			break ;
		m_lsList.AddString( stri+ ":" + m_aSymbol[ nIndex] ) ; 
	}  
}

void CDlgInput::SymbolEnd( )  //末页
{
	 CString stri ;
	if( m_nCurrPage ==  m_nPageCount-1 || m_nPageCount == 0 )   //最后一页
		return  ;

	 m_nCurrPage = m_nPageCount-1 ;  //当前页码 
     int nIndex  ; 
     m_lsList.ResetContent( ) ;	
     for (int i = 1 ; i<=  m_nPageSize ; i++ )  //m_it =enumer.begin( ) ; m_it !=enumer.end() ;m_it++ 
	{   
	 	
		if ( i == 10 )
			stri.Format("%d" ,0) ;
		else
			stri.Format("%d" ,i) ; 
		nIndex = m_nCurrPage*m_nPageSize + i - 1  ;
	    if ( nIndex >=  m_nSymbolCount   )
			break ;
		m_lsList.AddString( stri+ ":" + m_aSymbol[ nIndex] ) ; 
	}  

}

void CDlgInput::SymbolUpPage( ) //上一页
{
	CString stri ; 
	if( m_nCurrPage ==  0 || m_nPageCount == 0 ) //第一页
		return  ;

	 m_nCurrPage-- ;  //当前页码 
	 if ( m_nCurrPage < 0 ) 
		m_nCurrPage = 0 ;

     int nIndex  ; 
     m_lsList.ResetContent( ) ;	
     for (int i = 1 ; i<=  m_nPageSize ; i++ )  //m_it =enumer.begin( ) ; m_it !=enumer.end() ;m_it++ 
	{   
	 	
		if ( i == 10 )
			stri.Format("%d" ,0) ;
		else
			stri.Format("%d" ,i) ; 
		nIndex = m_nCurrPage*m_nPageSize + i - 1 ;
	    if ( nIndex >=  m_nSymbolCount   )
			break ;

		m_lsList.AddString( stri+ ":" + m_aSymbol[ nIndex] ) ; 
	}  

}
void CDlgInput::SymbolDownPage( ) // 下一页  
{
   CString stri ; 
     
    if( m_nCurrPage ==  m_nPageCount-1 || m_nPageCount == 0 ) //最后一页
		return  ;

	 m_nCurrPage++ ;  //当前页码 
	 if ( m_nCurrPage > m_nPageCount-1 ) 
		m_nCurrPage = m_nPageCount-1  ;

     int nIndex  ; 
     m_lsList.ResetContent( ) ;	
     for (int i = 1 ; i<=  m_nPageSize ; i++ )  //m_it =enumer.begin( ) ; m_it !=enumer.end() ;m_it++ 
	{   
	 	if ( i == 10 )
			stri.Format("%d" ,0) ;
		else
			stri.Format("%d" ,i) ; 

		nIndex = m_nCurrPage*m_nPageSize + i-1 ;
	    if ( nIndex >=  m_nSymbolCount )
			break ;

		m_lsList.AddString( stri+ ":" + m_aSymbol[ nIndex] ) ; 
	}  

}
void CDlgInput::OnBnClickedBtn11( )
{
	// TODO: 在此添加控件通知处理程序代码
	if ( m_nMode == Char_Mode || m_nMode == Number_Mode ) //字符输入模式
       MakeSymbol( ) ;      
}

void CDlgInput::OnBnClickedRadupper( )
{
	// TODO: 在此添加控件通知处理程序代码  
	if ( m_nUpperOrLower ==  CharUpper )
		return ;

    m_bUpper = FALSE ;
	m_bLower =TRUE ;
	m_nUpperOrLower = CharUpper ;
	this->UpdateData(FALSE ) ;


}

void CDlgInput::OnBnClickedRadlower( )
{
	// TODO: 在此添加控件通知处理程序代码 
	if ( m_nUpperOrLower == CharLower ) 
		return ;

	m_bUpper = TRUE ;
	m_bLower =FALSE ;
	m_nUpperOrLower = CharLower ;	
	this->UpdateData(FALSE ) ;

}


void CDlgInput::OnBnClickedBtnok( )
{
	// TODO: 在此添加控件通知处理程序代码
		OnOK( ) ;

}

⌨️ 快捷键说明

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