📄 dlginput.cpp
字号:
// 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 + -