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

📄 dlginput.cpp

📁 包含拼音和笔画输入的中文输入法,使用VC.NET2003开发.portable Chinese input method includes phonetic input and stroke, the
💻 CPP
📖 第 1 页 / 共 3 页
字号:

	// TODO:  在此添加额外的初始化
	//开启一个线程
	//if ( m_pWinThread == NULL )
	//{
		m_ThreadInfor.hWnd = this->m_hWnd ;
		m_ThreadInfor.lpKillThread = &m_bKillThread ;
		m_ThreadInfor.lpLock =  &m_bLock ;
		m_ThreadInfor.pBtnMsg = &m_BtnMsg ;
    	
		m_pWinThread =  AfxBeginThread(ThreadProc ,(LPVOID)&m_ThreadInfor) ;
		m_pWinThread->m_bAutoDelete = FALSE ;

	//}
	return TRUE;  // return TRUE unless you set the focus to a control
	// 异常: OCX 属性页应返回 FALSE
}

void CDlgInput::BtnClick(int nBtnNo ) 
{   
	
   	 //等待开锁
      while(m_bLock == TRUE )
	  { 

	  }
   // 加锁
    m_bLock = TRUE ; 
    CBtnMsg * pBtn = new CBtnMsg( ) ; 
	// pBtn->cCurrTime = CTime::GetCurrentTime( ) ;
     int* pNo = new int(nBtnNo); 
	 pBtn->pBtnNo = pNo ;  
  	CFileTime * ft1= new CFileTime(CFileTime::GetCurrentTime( ) )  ; 
     pBtn->pCurrTime =  ft1 ; 
	 m_BtnMsg.AddTail( pBtn) ;  
 	//解锁
	 m_bLock = FALSE ; 

}

void  CDlgInput::BtnClickEx(int nBtnNo ,int nNumber )
{
  if ( m_nMode == StrokesOrder_Mode  )  //笔顺
   {
      ::PostMessage(m_hWnd , WM_KEYUP,nNumber ,0) ;    
   }
  else if ( m_nMode == Number_Mode ) //数字
  {
	 InputNumber( nBtnNo ) ;  
  }
   else if ( m_nMode == Spell_Mode )  //拼音
   { 
	  //不使用线程的方式
      // BtnClick(nBtnNo) ;  
 
       InputSpell(nBtnNo ) ;	   

   }
   else if ( m_nMode ==Char_Mode  )  //字符
  {
		InputChar( nBtnNo ) ;
  }


}

void CDlgInput::OnBnClickedBtn1( )
{    
   
	// TODO: 在此添加控件通知处理程序代码
	BtnClickEx(1,49) ;
}

void CDlgInput::OnBnClickedBtn2( )
{ 
	 // TODO: 在此添加控件通知处理程序代码
		BtnClickEx(2,50) ;
}

void CDlgInput::OnBnClickedBtn3( )
{   
		BtnClickEx(3,51) ;  
	// TODO: 在此添加控件通知处理程序代码
}


void CDlgInput::OnBnClickedBtn4()
{
	// TODO: 在此添加控件通知处理程序代码
	 	BtnClickEx(4,52) ;
}

void CDlgInput::OnBnClickedBtn5()
{
	// TODO: 在此添加控件通知处理程序代码
	 	BtnClickEx(5,53) ;;  
}

void CDlgInput::OnBnClickedBtn6()
{
	// TODO: 在此添加控件通知处理程序代码
	BtnClickEx(6,54) ;
}

void CDlgInput::OnBnClickedBtn7()
{
	// TODO: 在此添加控件通知处理程序代码
	BtnClickEx(7,55) ;
}

void CDlgInput::OnBnClickedBtn8()
{
	// TODO: 在此添加控件通知处理程序代码
		BtnClickEx(8,56) ;
}

void CDlgInput::OnBnClickedBtn9()
{
	// TODO: 在此添加控件通知处理程序代码
		BtnClickEx(9,57) ;   
}

void CDlgInput::OnBnClickedBtnhome( )  //第一页
{
	// TODO: 在此添加控件通知处理程序代码
    CString stri ;

	
	if(m_nMode == Char_Mode || m_nMode == Number_Mode) //!字符输入模式或数字输入模式 
	{
		SymbolHome( ) ;
		return ;
	}

	if ( ( m_nCurrPage != 0 )  && (m_nPageCount > 0 ) ) //不是第一页
	{
		m_nCurrPage = 0 ;  //置为第一页
		int i = 1 ;
		m_lsList.ResetContent(  ) ;	
		
		for (m_it =enumer.begin( ) ; m_it !=enumer.end() ;m_it++  )
		{   
			if ( i == 10 )
				stri.Format("%d" ,0) ;
			else
				stri.Format("%d" ,i) ;

			m_lsList.AddString( stri+ ":" + (CString)(Word)(*m_it)) ; 

			if ( i == m_nPageSize ) 
				break ;
			else
				i++ ;
		}
		
	}
	else
	{
		//::Beep(500,1000 )  ;
	}

}

void CDlgInput::OnBnClickedBtndowngage( )  //下翻一页
{
	// TODO: 在此添加控件通知处理程序代码 
    CString stri ;

	if(m_nMode == Char_Mode || m_nMode == Number_Mode) //!字符输入模式或数字 
	{
		SymbolDownPage(  ) ;
		return ;
	}



   if ( ( m_nCurrPage != (m_nPageCount-1)) && (m_nPageCount > 0 )  )  //不是最后一页
   {	 
        m_nCurrPage = m_nCurrPage + 1 ;

		m_lsList.ResetContent( ) ;	//清空原来的
		for (int i = 1 ; i<= 10 ; i++ )  //m_it =enumer.begin( ) ; m_it !=enumer.end() ;m_it++ 
		{   
			m_it++ ;  //下移一个

			if ( i == 10 )
				stri.Format("%d" ,0) ;
			else
				stri.Format("%d" ,i) ;

			m_lsList.AddString( stri+ ":" + (CString)(Word)(*m_it)) ; 

			if (  m_it == enumer.end( ) ) 
				break ;
		}  
    }
   else
   {
         //::Beep(500,1000 )  ;
   }


}

void CDlgInput::OnBnClickedBtnend() //最后一页
{
	// TODO: 在此添加控件通知处理程序代码
      CString stri ;
	  
	if(m_nMode == Char_Mode || m_nMode == Number_Mode) //!字符输入模式或数字 
	{
		SymbolEnd( ) ;
		return ;
	}


   if ( ( m_nCurrPage != (m_nPageCount-1) )  && (m_nPageCount > 0 ) ) //不是最后一页
   {	
       
	    m_nCurrPage = (m_nPageCount-1) ;//当前页置为最后一页

	    m_it = enumer.begin( ) ;
		for (int j = 1 ; j < (m_nPageCount-1)* m_nPageSize ; j++ ) 
		{
		   m_it++ ; 	   
		}
    	m_lsList.ResetContent( ) ;	//清空原来的
		int i = 0 ;
        while (m_it !=enumer.end() )  //m_it =enumer.begin( ) ; m_it !=enumer.end() ;m_it++ 
		{   
           i++ ;
           m_it++ ;  //下移一个
		   if ( i == 10 )
				stri.Format("%d" ,0) ;
			else
				stri.Format("%d" ,i) ;
			m_lsList.AddString( stri+ ":" + (CString)(Word)(*m_it)) ;  
   
		}  
		

   }
   else
   {
     //::Beep(500,1000 )  ;
   }


}

void CDlgInput::OnBnClickedBtnupgage( )  //向上一页
{
	// TODO: 在此添加控件通知处理程序代码
        CString stri ;

	if(m_nMode == Char_Mode || m_nMode == Number_Mode ) //!字符输入模式 或数字
	{
		SymbolUpPage( ) ;
		return ;
	}

   if ( (m_nCurrPage  != 0)  && ( m_nPageCount > 0 ) ) //不是第一页
   {	
      	   
       int nUpCount ; //回退的项数 

	   if ( m_nCurrPage == (m_nPageCount-1) ) //是最后一页 
	   {  
		    m_it = enumer.begin( ) ;
			for (int j = 1 ; j < (m_nPageCount-2)* m_nPageSize ; j++ ) 
			{
				m_it++ ; 	   
			}
	   }
	   else if ( m_nCurrPage ==1 ) //是第二页
	   {
            OnBnClickedBtnhome( ) ; //置为第一页
			return ;
	   }
	   else  //既不是最后一页,也不是第二页
	   {    

			nUpCount = 2*m_nPageSize ;  
		    //向上回退nUpCount项
			for (int j =1 ; j <= nUpCount  ; j++ )
			{
				m_it-- ;
				if (  m_it == enumer.begin( ) )
						break ; 
			}

	   }

        m_nCurrPage =  m_nCurrPage - 1 ; 
		m_lsList.ResetContent( ) ;	//清空原来的
		for (int i = 1 ; i<= m_nPageSize  ; i++ )  //m_it =enumer.begin( ) ; m_it !=enumer.end() ;m_it++ 
		{   
	
			m_it++ ;  //下移一个
			if ( i == 10 )
				stri.Format("%d" ,0) ;
			else
				stri.Format("%d" ,i) ;

			m_lsList.AddString( stri+ ":" + (CString)(Word)(*m_it)) ; 

		} 

   } 
   else
   {
	  // ::Beep(500,1000 )  ;
   }


}
 
/*! @function  public  RadioFunc********************************************************************************\brief  功能    :  一组Radio 按钮的处理功能   <br>函数名  :@param  nInputMode int   输入模式\return void 无返回值\exception  \author    zqp\remark    <br>典型用法:   <br>复杂度 :                         *******************************************************************************//////// comment generated by CommentMakerPro from www.FeinSoftware.com ////////void CDlgInput::RadioFunc( int nInputMode )
{
	    switch ( nInputMode ) 
		{
			case Spell_Mode :     //!拼音模式
				{
					m_nMode =Spell_Mode  ;
					m_bSpell = FALSE ;
					m_bNum = TRUE ;
					m_bChar = TRUE ; 
					m_bStrokeOrder = TRUE ; 
			        break;
				}
     		case BS_Mode :  //!部首模式 
				{
		     		 break ;

				}
			case Strokes_Mode :	//!笔画模式
				{ 
						break; 
				}
			case StrokesOrder_Mode  ://!笔顺模式
				{
				    m_nMode =StrokesOrder_Mode ;
					m_bSpell = TRUE ;
					m_bNum = TRUE ;
					m_bChar = TRUE ; 
					m_bStrokeOrder = FALSE ; 
					break; 
				}
			case Number_Mode :	//!数字模式
				{
					m_nMode =Number_Mode ;

					m_bSpell = TRUE ;
					m_bNum = FALSE ;
					m_bChar = TRUE ; 
					m_bStrokeOrder = TRUE ; 
					break ; 
				}
			case Char_Mode ://!字符模式 
				{
					m_nMode =Char_Mode ;
					m_bSpell = TRUE ;
					m_bNum = TRUE ;
					m_bChar = FALSE ; 
					m_bStrokeOrder = TRUE ; 
					
				 }
    		}  //!Switch end 
		  
		   if (m_nMode >= Spell_Mode &&  m_nMode <= StrokesOrder_Mode ) 
		   {
				m_Inputer.SetMode(m_nMode) ;  
				m_Inputer.Reset( ) ;
		   }

			m_strChar ="" ;
			m_strOrderFilter = "" ;
			enumer.clear( ) ;
			m_lsList.ResetContent( ) ; 
			m_nPageCount = 0 ;
			this->UpdateData(FALSE ) ;

}
void CDlgInput::OnBnClickedRadspell()
{
	// TODO: 在此添加控件通知处理程序代码 
	if ( m_nMode !=Spell_Mode ) 
		RadioFunc( Spell_Mode ) ;
  
}

void CDlgInput::OnBnClickedRadnum()
{
	// TODO: 在此添加控件通知处理程序代码
		if ( m_nMode !=Number_Mode ) 
		RadioFunc(Number_Mode ) ;
  
}

void CDlgInput::OnBnClickedRadchar()
{
	// TODO: 在此添加控件通知处理程序代码 
	if ( m_nMode !=Char_Mode ) 
		RadioFunc(Char_Mode ) ;
  
}




void CDlgInput::OnBnClickedRadstrokeorder()
{
	// TODO: 在此添加控件通知处理程序代码
		if ( m_nMode !=StrokesOrder_Mode ) 
		RadioFunc(StrokesOrder_Mode ) ;
  
}

void CDlgInput::OnBnClickedBtn10( )
{
	// TODO: 在此添加控件通知处理程序代码
	if ( m_nMode == Number_Mode ) 
   	   InputNumber( 10 ) ;  
}

void CDlgInput::OnBnClickedBtnback( )
{
	// TODO: 在此添加控件通知处理程序代码 
	// ::PostMessage(m_hWnd , WM_KEYDOWN,8 ,0) ; 
	// ::PostMessage(m_hWnd , WM_CHAR,8 ,0) ; 
	if ( m_strChar.GetLength( ) > 0 ) 
	{
       ::PostMessage(m_hWnd , WM_KEYUP,8 ,0) ; 
	}
	else
	{ 
        DeleteChar(  )   ;
	}

	   
}

void CDlgInput::OnBnClickedBtnleft()
{
	// TODO: 在此添加控件通知处理程序代码 
     ::PostMessage(m_hWnd , WM_KEYUP,37 ,0) ; 
   
}

void CDlgInput::OnBnClickedBtnright()
{
	// TODO: 在此添加控件通知处理程序代码
	::PostMessage(m_hWnd , WM_KEYUP,39 ,0) ; 
}

void CDlgInput::OnEnSetfocusEdtin( )
{   
	
	// TODO: 在此添加控件通知处理程序代码 
	/*
	m_edtIn.CreateSolidCaret(1, 25);
	//CPoint pos =m_edtIn.GetCaretPos( ) ; 
	//m_edtIn.SetCaretPos(m_pLocal ) ;
    m_edtIn.ShowCaret( ); 
    */
	 

}

void CDlgInput::OnEnKillfocusEdtin( )
{  
	// TODO: 在此添加控件通知处理程序代码 
	//m_pLocal =m_edtIn.GetCaretPos( ) ;
	//CString strdis ;
	//	strdis.Format("x=%d ,y=%d" ,m_pLocal.x ,m_pLocal.y )  ;
	//	::AfxMessageBox( strdis) ;
	//m_edtIn.HideCaret( ) ; 
}

void CDlgInput::InputChar( int nBtnNO )   //输入字符串
{
	TCHAR aUpperChar[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 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 )  //使用不同的字符
	   {
		   if ( m_nUpperOrLower == CharUpper ) 
		      cChar = aUpperChar[nBtnNO-1][0] ;
		   else
			  cChar = aLowerChar[nBtnNO-1][0] ;
	   }
	   else if ( ( m_nPreBtnNo == nBtnNO ) && ( tSpan >= m_nTimeGap*CFileTime::Millisecond ) )
	   {
            if ( m_nUpperOrLower == CharUpper ) 
		      cChar = aUpperChar[nBtnNO-1][0] ;
		    else
			  cChar = aLowerChar[nBtnNO-1][0] ;
	   }
	   else if ( ( m_nPreBtnNo == nBtnNO ) && ( tSpan < m_nTimeGap*CFileTime::Millisecond ) ) //!击键间隔在1秒之内
	   {           
		            
		   CString strPos = m_strInput.Mid(m_nCount-1,1) ;

		   if ( m_nUpperOrLower == CharUpper ) 
		   {
				 for (int i = 0 ; i < 3 ; i++ )
				 {
				 if (aUpperChar[nBtnNO-1][i] == strPos )
					  break ;
				 }
				 
				 if ( ( i== 3 ) ||  ( i ==2 ) ) 
				{
					 cChar = aUpperChar[nBtnNO-1][0] ;
				 }
				 else
				 {
					 cChar = aUpperChar[nBtnNO-1][ i+1] ;
				 }
		   }
		   else
		   {
				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 ;  //置为前一次按键时间


		CString strRight ;
		if  (m_strInput.GetLength( ) == m_nCount ) //当前的光标在最后
		{   

⌨️ 快捷键说明

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