DlgInput.cpp
上传用户:bingyunhe
上传日期:2013-07-06
资源大小:723k
文件大小:41k
源码类别:

词法分析

开发平台:

Visual C++

  1. /*! @file   DlgInput.cpp    brief  文件功能: 输入对话框的实现文件 ,在没有真实键盘的情况下,实现各种输入             <br>                                                       <br>  文件名称:   DlgInput.cpp                                                         <br>  模块名  : 输入法                                                      <br>  author     zqp      version  1.0.0     remark                                                                        <br>  修改记录 :  <br>   日 期 &nbsp;&nbsp;&nbsp;&nbsp;版本&nbsp;&nbsp;&nbsp;&nbsp;修改人&nbsp;&nbsp;&nbsp;&nbsp;修改内容<br> 2005/06/13   &nbsp; 1.0.0  &nbsp;  zqp  &nbsp;  创建  <br> ******************************************************************************** <br> 版权:浙江昆仑科技有限公司      保留所有权利  *******************************************************************************/ /////// comment generated by CommentMakerPro from www.FeinSoftware.com ////////
  2. // DlgInput.cpp : 实现文件
  3. //
  4. #include "stdafx.h"
  5. #include "ChineseInputer.h"
  6. #include "DlgInput.h"
  7. #include  <atltime.h>
  8. #include ".dlginput.h"
  9. // CDlgInput 对话框
  10. IMPLEMENT_DYNAMIC(CDlgInput, CDialog)
  11. CDlgInput::CDlgInput(CWnd* pParent /*=NULL*/)
  12. : CDialog(CDlgInput::IDD, pParent)
  13. , m_strChar(_T(""))
  14. , m_strInput(_T(""))
  15. , m_bSpell(FALSE)
  16. , m_bNum(TRUE)
  17. , m_bChar(TRUE)
  18. , m_bStrokeOrder(TRUE)
  19. , m_bLower(FALSE)
  20. , m_bUpper(TRUE ) 
  21.    m_Inputer.SetMode(ChineseInputer::Inputer::Input_Spell) ;
  22.    m_bKillThread = FALSE ; 
  23.    m_bLock = FALSE ;
  24. }
  25. CDlgInput::~CDlgInput( )
  26. {  
  27.     
  28. HANDLE  hWinThread = m_pWinThread->m_hThread ;
  29. m_bKillThread = TRUE ;
  30. int ret = WaitForSingleObject(hWinThread ,5000) ; 
  31. if ( ret == WAIT_FAILED ) 
  32.         AfxMessageBox("结束线程出错!") ; 
  33.     enumer.clear( ) ;
  34. //free(&m_Dic ) ;
  35. void CDlgInput::DoDataExchange(CDataExchange* pDX)
  36. {
  37. CDialog::DoDataExchange(pDX);
  38. DDX_Control(pDX, IDC_LIST, m_lsList);
  39. DDX_Text(pDX, IDC_STCCHAR, m_strChar);
  40. DDX_Control(pDX, IDC_BTNHOME, m_btnHome);
  41. DDX_Control(pDX, IDC_BUTTON1, m_btnB1);
  42. DDX_Control(pDX, IDC_BTNUPGAGE, m_btnUpPage);
  43. DDX_Control(pDX, IDC_BTNDOWNGAGE, m_btnDownPage);
  44. DDX_Control(pDX, IDC_BTNEND, m_btnEnd);
  45. DDX_Control(pDX, IDC_BTNBACk, m_btnBack); 
  46. DDX_Radio(pDX, IDC_RADSPELL, m_bSpell);
  47. DDX_Radio(pDX, IDC_RADNUM, m_bNum);
  48. DDX_Radio(pDX, IDC_RADCHAR, m_bChar);
  49. DDX_Radio(pDX, IDC_RADSTROKEORDER, m_bStrokeOrder);
  50. DDX_Radio(pDX, IDC_RADUPPER, m_bUpper);
  51. DDX_Radio(pDX, IDC_RADLOWER, m_bLower);
  52. DDX_Text(pDX, IDC_EDTIN, m_strInput);
  53. DDX_Control(pDX, IDC_EDTIN, m_edtIn);
  54. }
  55. BEGIN_MESSAGE_MAP(CDlgInput, CDialog)
  56. // ON_WM_KEYUP()
  57. // ON_WM_SYSKEYUP()
  58. // ON_WM_CHAR()
  59. // ON_WM_KEYDOWN()
  60. ON_LBN_DBLCLK(IDC_LIST, OnLbnDblclkList)
  61. // ON_LBN_SELCHANGE(IDC_LIST, OnLbnSelchangeList)
  62. ON_BN_CLICKED(IDC_BTN1, OnBnClickedBtn1)
  63. ON_BN_CLICKED(IDC_BTN2, OnBnClickedBtn2)
  64. ON_BN_CLICKED(IDC_BTN3, OnBnClickedBtn3)
  65. ON_BN_CLICKED(IDC_BTN4, OnBnClickedBtn4)
  66. ON_BN_CLICKED(IDC_BTN5, OnBnClickedBtn5)
  67. ON_BN_CLICKED(IDC_BTN6, OnBnClickedBtn6)
  68. ON_BN_CLICKED(IDC_BTN7, OnBnClickedBtn7)
  69. ON_BN_CLICKED(IDC_BTN8, OnBnClickedBtn8)
  70. ON_BN_CLICKED(IDC_BTN9, OnBnClickedBtn9)
  71. ON_BN_CLICKED(IDC_BTNHOME, OnBnClickedBtnhome)
  72. ON_BN_CLICKED(IDC_BTNDOWNGAGE, OnBnClickedBtndowngage)
  73. ON_BN_CLICKED(IDC_BTNEND, OnBnClickedBtnend)
  74. ON_BN_CLICKED(IDC_BTNUPGAGE, OnBnClickedBtnupgage)
  75. ON_BN_CLICKED(IDC_RADSPELL, OnBnClickedRadspell)
  76. ON_BN_CLICKED(IDC_RADNUM, OnBnClickedRadnum)
  77. ON_BN_CLICKED(IDC_RADCHAR, OnBnClickedRadchar)
  78. ON_BN_CLICKED(IDC_RADSTROKEORDER, OnBnClickedRadstrokeorder)
  79. ON_BN_CLICKED(IDC_BTN10, OnBnClickedBtn10)
  80. ON_BN_CLICKED(IDC_BTNBACk, OnBnClickedBtnback)
  81. ON_BN_CLICKED(IDC_BTNLEFT, OnBnClickedBtnleft)
  82. ON_BN_CLICKED(IDC_BTNRIGHT, OnBnClickedBtnright)
  83. ON_EN_SETFOCUS(IDC_EDTIN, OnEnSetfocusEdtin)
  84. ON_EN_KILLFOCUS(IDC_EDTIN, OnEnKillfocusEdtin)
  85. ON_LBN_SELCHANGE(IDC_LIST, OnLbnSelchangeList)
  86. ON_EN_MAXTEXT(IDC_EDTIN, OnEnMaxtextEdtin)
  87. ON_BN_CLICKED(IDC_BTN11, OnBnClickedBtn11)
  88. ON_BN_CLICKED(IDC_RADUPPER, OnBnClickedRadupper)
  89. ON_BN_CLICKED(IDC_RADLOWER, OnBnClickedRadlower)
  90. ON_BN_CLICKED(IDC_BTNOK, OnBnClickedBtnok)
  91. END_MESSAGE_MAP( )
  92. BOOL CDlgInput::PreTranslateMessage(MSG* pMsg)
  93. {
  94. // TODO: 在此添加专用代码和/或调用基类
  95.   int nChar; 
  96.       CString  strStrokeOrder = "一丨丿丶乙" ; 
  97.   CString strFilter ;
  98.      
  99.     if ( pMsg->message == WM_LBUTTONDOWN )
  100. {
  101.       CPoint pos = pMsg->pt ;   
  102. RECT  rInput  ;
  103. m_edtIn.GetWindowRect(&rInput) ; 
  104.         
  105. //CPoint pInput =
  106. if ( ( pos.x >=  rInput.left) && (pos.x <= rInput.right )
  107. &&(pos.y >= rInput.top ) && ( pos.y <= rInput.bottom ) ) 
  108. {
  109. return TRUE ;  //不需要再处理
  110. }
  111. else  //不是在此矩形框内,转发此消息
  112. {
  113. return CDialog::PreTranslateMessage(pMsg) ; 
  114. }
  115. }
  116. else if ( (pMsg->message != WM_KEYUP ) && ( pMsg->message != WM_KEYDOWN ) 
  117. && (pMsg->message != WM_CHAR ) )   
  118. {
  119.          return CDialog::PreTranslateMessage(pMsg) ; //转发其它消息
  120. }
  121. else
  122. {
  123.   nChar = pMsg->wParam ; 
  124.   if( ( nChar >= 65 && nChar <= 90) || ( nChar >= 48 && nChar <= 57 )
  125. || (nChar == 8 ) || ( nChar == 37 ) || ( nChar == 39 ) )  
  126.  {
  127.  if  (pMsg->message == WM_KEYUP )
  128.  {
  129.     
  130. TCHAR cChar =  pMsg->wParam ; 
  131.          
  132. //是向前删除键
  133.      if ( nChar == 8 )
  134.   {   
  135. int al = m_strChar.GetLength( )  ; 
  136. if ( m_nMode == StrokesOrder_Mode )  //!笔顺输入模式
  137. al = (int) al/2  ; 
  138. if ( al > 1 ) 
  139. {  
  140. if (m_nMode == 0)  //!拼音输入模式
  141. {
  142. m_strChar = m_strChar.Left(m_strChar.GetLength() -1 ) ;
  143. m_Inputer.Reset( ) ;
  144. m_Inputer.Put(_T(m_strChar) ) ; 
  145. }
  146. else if (m_nMode == StrokesOrder_Mode) //!笔顺输入模式
  147. {  
  148. m_strChar = m_strChar.Left(m_strChar.GetLength() - 2 ) ;
  149. m_strOrderFilter = m_strOrderFilter.Left(m_strOrderFilter.GetLength() -1 ) ;
  150. m_Inputer.Reset( ) ;
  151. m_Inputer.Put(_T(m_strOrderFilter) ) ; 
  152. }
  153. }
  154. else if (al == 1)
  155. {
  156. m_strChar ="" ;
  157. m_strOrderFilter ="" ;
  158. m_Inputer.Reset( ) ;
  159. m_lsList.ResetContent( ) ;
  160. this->UpdateData(FALSE) ; 
  161. return TRUE ;
  162. }
  163. else
  164.  CDialog::PreTranslateMessage(pMsg) ;
  165.  this->UpdateData( TRUE ) ; 
  166.  return  FALSE  ; 
  167.                    }
  168. }
  169. else if (( nChar == 37 ) || ( nChar == 39 ) ) //左右箭头键
  170. {  
  171. if  ( nChar == 37 ) 
  172. {   
  173. if (m_nCount == 0 )
  174. {
  175.                             m_edtIn.SetFocus( ) ;
  176. m_edtIn.SetSel(m_nCount,m_nCount) ;  
  177. return TRUE ;
  178. }
  179. char  cCount = m_strInput.GetAt(m_nCount-1) ;
  180. if ( cCount<0 || cCount > 255 )  //!不是ASCII码字符
  181. m_nCount-- ;
  182. m_nCount-- ;
  183. if( m_nCount < 0 )
  184. m_nCount = 0 ;
  185. m_edtIn.SetFocus( ) ;
  186. m_edtIn.SetSel(m_nCount,m_nCount) ;  
  187. }
  188. else
  189. {   
  190. char  cCount = m_strInput.GetAt(m_nCount) ;
  191. if ( cCount< 0  || cCount > 255 )  //!不是ASCII码字符
  192. {  
  193. if ( m_nCount < m_nInputMaxLen - 1 )  
  194.    m_nCount += 2  ; 
  195.  
  196. else
  197. {
  198.   if ( m_nCount < m_nInputMaxLen ) 
  199.    m_nCount++ ; 
  200. }
  201. if( m_nCount > m_strInput.GetLength( ) )
  202. m_nCount =  m_strInput.GetLength( ) ;
  203. m_edtIn.SetFocus( ) ;
  204. m_edtIn.SetSel(m_nCount,m_nCount ) ;  
  205. }
  206. }
  207. else  //字符和数字键
  208.  if ( m_nMode == Number_Mode ) //数字输入模式
  209.  {
  210.  if  ( nChar >= 48 && nChar <= 57 )  
  211. {
  212. // m_strInput = m_strInput + cChar ;
  213.  //this->UpdateData(FALSE) ;  
  214.  }
  215.  return TRUE ; 
  216.   }
  217.  else if (m_nMode == Char_Mode) //字符输入模式
  218. {   
  219. if( (  nChar >= 65 && nChar <= 90) || ( nChar >= 48 && nChar <= 57 )  )
  220. {   
  221. // m_strInput = m_strInput + cChar ;
  222. //  this->UpdateData(FALSE) ; 
  223. }
  224. return  TRUE ; 
  225. }
  226. else if ( m_nMode == Spell_Mode ) // 拼音输入方式
  227. {   
  228. if(  nChar >= 65 && nChar <= 90) 
  229. {
  230.   m_strChar =m_strChar + cChar ;
  231. m_Inputer.Put(_T(cChar));
  232.     
  233.  } 
  234. else
  235. return TRUE ; 
  236. }
  237. else if (m_nMode == StrokesOrder_Mode)  //笔顺输入模式
  238. {
  239. if (nChar >= 49 && nChar <= 53 )
  240. {
  241. m_strChar =m_strChar +  strStrokeOrder.Mid(2* (nChar-49),2) ;
  242.   m_strOrderFilter = m_strOrderFilter + cChar ;
  243. m_Inputer.Put( cChar ) ;
  244. else 
  245. return TRUE ; 
  246.     
  247. }
  248.   
  249. this->UpdateData(FALSE ) ;
  250.    if (m_nMode == Spell_Mode ) //拼音输放模式
  251.    {
  252.   strFilter = m_Inputer.GetSpell( ) ;
  253. if ( strFilter.GetLength( ) < 1  )  //没有字符串
  254.    return TRUE ; //CDialog::PreTranslateMessage(pMsg);
  255. strFilter.MakeLower( ) ;
  256. ChineseDictionary::SpellQuery * spellquery =  m_ChineseInputer.GetSpellQuery( ) ; 
  257. enumer.clear( );
  258.                  if ( !spellquery->QueryWords(strFilter , enumer ) ) 
  259.    return TRUE ; 
  260.     //增中排序
  261.    }
  262.    else  if ( m_nMode == StrokesOrder_Mode) //笔顺
  263.    {
  264.     strFilter = m_Inputer.GetStrokesOrder(  )  ;
  265. if ( strFilter.GetLength( ) < 1  )  //没有字符串
  266.    return TRUE ; //CDialog::PreTranslateMessage(pMsg);
  267. ChineseDictionary::StrokesOrderQuery   * STrokeOrderQuery =  m_ChineseInputer.GetStrokesOrderQuery( ) ;
  268. enumer.clear( );
  269.                  if ( !STrokeOrderQuery->QueryWords(strFilter , enumer )) 
  270.    return TRUE ; 
  271.    //增中排序
  272.    }
  273. CString stri  ;
  274. m_lsList.ResetContent( ) ;
  275. ChineseInputer::WordEnumerator::iterator  it ; 
  276.                 
  277.           m_it= enumer.begin( ) ; 
  278.      m_nPageCount = (int)(enumer.size( )/m_nPageSize)  ; //总页数
  279. //计数总页数
  280. if ( (enumer.size( ) % m_nPageSize ) != 0 )
  281. m_nPageCount = m_nPageCount + 1  ; 
  282.            m_nCurrPage = 0 ;  //当前页码 
  283.                 for (int i = 1 ; i<= m_nPageSize  ; i++ )  //m_it =enumer.begin( ) ; m_it !=enumer.end() ;m_it++ 
  284. {   
  285. if (  m_it == enumer.end( )  ) 
  286. break ;
  287. if ( i == 10 )
  288. stri.Format("%d" ,0) ;
  289. else
  290. stri.Format("%d" ,i) ;
  291. m_lsList.AddString( stri+ ":" + (CString)(Word)(*m_it)) ; 
  292.                   if ( i != m_nPageSize )   
  293.   m_it++ ;  //下移一个
  294. }  
  295. }  
  296. else
  297. return TRUE ;
  298. }
  299. }
  300. /*! @function  public  SpellQuery ******************************************************************************** brief   功能    : 根据输入的拼音字母查询汉字    <br> 函数名  : return BOOL <insert return value description here> exception   author  zqp   remark    <br> 典型用法:   <br> 复杂度 :                          *******************************************************************************/ BOOL CDlgInput::SpellQuery(  ) 
  301. {
  302.        
  303.  CString  strFilter = m_Inputer.GetSpell( ) ;
  304.  if ( strFilter.GetLength( ) < 1  )  //没有字符串
  305.  return TRUE ; //CDialog::PreTranslateMessage(pMsg);
  306. strFilter.MakeLower( ) ;
  307. ChineseDictionary::SpellQuery * spellquery =  m_ChineseInputer.GetSpellQuery( ) ; 
  308. enumer.clear( );
  309.       if ( !spellquery->QueryWords(strFilter , enumer ) ) //!查询失败
  310.    return FALSE ;  
  311.     CString stri  ;
  312. m_lsList.ResetContent( ) ;
  313. ChineseInputer::WordEnumerator::iterator  it ; 
  314.                 
  315.         m_it= enumer.begin( ) ; 
  316.      m_nPageCount = (int)(enumer.size( )/m_nPageSize)  ; //!总页数
  317. //!计数总页数
  318. if ( (enumer.size( ) % m_nPageSize ) != 0 )
  319. m_nPageCount = m_nPageCount + 1  ; 
  320. m_nCurrPage = 0 ;  //!当前页码 
  321.         for (int i = 1 ; i<= m_nPageSize  ; i++ )  //m_it =enumer.begin( ) ; m_it !=enumer.end() ;m_it++ 
  322. {   
  323. if (  m_it == enumer.end( )  ) 
  324. break ;
  325. if ( i == 10 )
  326. stri.Format("%d" ,0) ;
  327. else
  328. stri.Format("%d" ,i) ;
  329. m_lsList.AddString( stri+ ":" + (CString)(Word)(*m_it)) ; 
  330.             if ( i != m_nPageSize )   
  331.     m_it++ ;  //下移一个
  332. }  
  333. }
  334. void CDlgInput::OnBnClickedBtnabc( )
  335. {
  336. // TODO: 在此添加控件通知处理程序代码 
  337.     //MSG * pMsg ;
  338. // pMsg->hwnd = this->m_hWnd ; 
  339. // pMsg->wParam = 65 ;
  340.    this->PostMessage(WM_KEYUP ,65,0 ) ; 
  341. }
  342. void CDlgInput::OnLbnDblclkList( )
  343. {
  344. // TODO: 在此添加控件通知处理程序代码
  345.     
  346.  
  347. }
  348. //void CDlgInput::OnLbnSelchangeList( )
  349. //{
  350. // // TODO: 在此添加控件通知处理程序代码
  351. //}
  352. BOOL CDlgInput::OnInitDialog( )
  353. {
  354. CDialog::OnInitDialog();
  355. //HICON ico = ::LoadIcon( ::AfxGetInstanceHandle( ),MAKEINTRESOURCE(IDI_ICOHOME) ) ;  //IDI_QUESTION   MAKEINTRESOURCE( IDI_ICOHOME) ) ;
  356. //m_btnB1.SetIcon(ico ) ; 
  357.    //!初始化上翻,下翻,最前和最后的按钮图标
  358. m_btnHome.SetIcon(::LoadIcon( ::AfxGetInstanceHandle( ),MAKEINTRESOURCE(IDI_ICOHOME) ) ) ; 
  359. m_btnEnd.SetIcon(::LoadIcon( ::AfxGetInstanceHandle( ),MAKEINTRESOURCE(IDI_ICOEND) ) ) ; 
  360. m_btnUpPage.SetIcon(::LoadIcon( ::AfxGetInstanceHandle( ),MAKEINTRESOURCE(IDI_ICOUPPAGE) ) ) ; 
  361. m_btnDownPage.SetIcon(::LoadIcon( ::AfxGetInstanceHandle( ),MAKEINTRESOURCE(IDI_ICODOWNPAGE) ) ) ; 
  362. //!初始化回退按钮的图标
  363. m_btnBack.SetIcon(::LoadIcon( ::AfxGetInstanceHandle( ),MAKEINTRESOURCE(IDI_ICOBACK) ) ) ; 
  364. CFont ft ;
  365. ft.CreateFont(19,                        // nHeight
  366.    10,                         // nWidth
  367.    0,                         // nEscapement
  368.    0,                         // nOrientation
  369.   15,                         // nWeight   FW_NORMAL
  370.    FALSE,                     // bItalic
  371.    FALSE,                     // bUnderline
  372.    0,                         // cStrikeOut
  373.    DEFAULT_CHARSET,              // nCharSet
  374.    OUT_DEFAULT_PRECIS,        // nOutPrecision
  375.    CLIP_DEFAULT_PRECIS,       // nClipPrecision
  376.    DEFAULT_QUALITY,           // nQuality
  377.    DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
  378.    "宋体" );                  // lpszFacename   Arial
  379. //!设置列表框的字体 
  380. m_lsList.SetFont( &ft ) ;  
  381. ft.DeleteObject( ) ;
  382.     //!初始化光标前的字符个数为0;
  383. m_nCount = 0 ;  
  384.     m_nPageCount = 0 ;
  385. enumer.clear( ) ;
  386.  
  387. //!初始化输入框的字体 
  388. LOGFONT lf ;
  389. lf.lfHeight = 20 ;
  390. lf.lfWidth = 10 ;
  391. lf.lfEscapement = 0 ;
  392. lf.lfOrientation= 0 ;
  393. lf.lfWeight = 15 ;
  394. lf.lfItalic =FALSE ;
  395. lf.lfUnderline = FALSE ;
  396. lf.lfStrikeOut = 0 ; 
  397. lf.lfCharSet = DEFAULT_CHARSET ; 
  398. lf.lfOutPrecision = OUT_DEFAULT_PRECIS ;
  399. lf.lfClipPrecision = CLIP_DEFAULT_PRECIS ;
  400. lf.lfQuality =  DEFAULT_QUALITY ;
  401. lf.lfPitchAndFamily =  DEFAULT_PITCH | FF_SWISS ;
  402. //lf.lfFaceName =CString::CopyChars( "宋体" ;
  403. //StringCchCopy( (LPSTR)&lf.lfFaceName, 5, "宋体" ); 
  404.  TCHAR *  strFace =  "宋体" ;
  405. ::strcpy(lf.lfFaceName ,strFace ) ;
  406.   
  407. CFont  fInput ; //! 获取输入框的字
  408. fInput.CreateFontIndirect( &lf ) ; 
  409. m_edtIn.SetFont(&fInput) ;
  410.    
  411. //fInput->GetLogFont( &lf) ; 
  412. //CString fName =  lf.lfFaceName  ;
  413.   
  414. //!默认的输入模式为拼音输入法
  415. m_nMode = Spell_Mode ;
  416.     
  417. //!默认为小写
  418. m_nUpperOrLower = CharLower  ; 
  419.     
  420.  //!初始化连续击键的时间间隔 ,单位是毫秒 
  421. m_nTimeGap = 1000 ;  
  422. //!初始化前一次击键的时间
  423. m_tPreTime = CFileTime::GetCurrentTime( ) ;
  424. //!初始化前一次击键的序号
  425. m_nPreBtnNo = 0 ;
  426. m_edtIn.SetLimitText(m_nInputMaxLen ) ; 
  427.     
  428. //!初始化特殊符号
  429. m_aSymbol[0]  ='!' ;
  430. m_aSymbol[1]  ='@' ;
  431. m_aSymbol[2]  ='#' ;
  432. m_aSymbol[3]  ='$' ;
  433. m_aSymbol[4]  ='%' ;
  434. m_aSymbol[5]  ='?' ;
  435. m_aSymbol[6]  ='&' ;
  436. m_aSymbol[7]  ='*' ;
  437. m_aSymbol[8]  ='(' ;
  438. m_aSymbol[9]  =')' ;
  439. m_aSymbol[10]  ='-' ;
  440. m_aSymbol[11]  ='+' ;
  441. m_aSymbol[12]  ='=' ;
  442. m_aSymbol[13]  ='_' ;
  443. m_aSymbol[14]  ='.' ;
  444. m_aSymbol[15]  ='^' ;
  445. m_aSymbol[16]  ='<' ;
  446. m_aSymbol[17]  ='>' ;
  447. // TODO:  在此添加额外的初始化
  448. //开启一个线程
  449. //if ( m_pWinThread == NULL )
  450. //{
  451. m_ThreadInfor.hWnd = this->m_hWnd ;
  452. m_ThreadInfor.lpKillThread = &m_bKillThread ;
  453. m_ThreadInfor.lpLock =  &m_bLock ;
  454. m_ThreadInfor.pBtnMsg = &m_BtnMsg ;
  455.     
  456. m_pWinThread =  AfxBeginThread(ThreadProc ,(LPVOID)&m_ThreadInfor) ;
  457. m_pWinThread->m_bAutoDelete = FALSE ;
  458. //}
  459. return TRUE;  // return TRUE unless you set the focus to a control
  460. // 异常: OCX 属性页应返回 FALSE
  461. }
  462. void CDlgInput::BtnClick(int nBtnNo ) 
  463. {   
  464.      //等待开锁
  465.       while(m_bLock == TRUE )
  466.   { 
  467.   }
  468.    // 加锁
  469.     m_bLock = TRUE ; 
  470.     CBtnMsg * pBtn = new CBtnMsg( ) ; 
  471. // pBtn->cCurrTime = CTime::GetCurrentTime( ) ;
  472.      int* pNo = new int(nBtnNo); 
  473.  pBtn->pBtnNo = pNo ;  
  474.    CFileTime * ft1= new CFileTime(CFileTime::GetCurrentTime( ) )  ; 
  475.      pBtn->pCurrTime =  ft1 ; 
  476.  m_BtnMsg.AddTail( pBtn) ;  
  477.   //解锁
  478.  m_bLock = FALSE ; 
  479. }
  480. void  CDlgInput::BtnClickEx(int nBtnNo ,int nNumber )
  481. {
  482.   if ( m_nMode == StrokesOrder_Mode  )  //笔顺
  483.    {
  484.       ::PostMessage(m_hWnd , WM_KEYUP,nNumber ,0) ;    
  485.    }
  486.   else if ( m_nMode == Number_Mode ) //数字
  487.   {
  488.  InputNumber( nBtnNo ) ;  
  489.   }
  490.    else if ( m_nMode == Spell_Mode )  //拼音
  491.    { 
  492.   //不使用线程的方式
  493.       // BtnClick(nBtnNo) ;  
  494.  
  495.        InputSpell(nBtnNo ) ;    
  496.    }
  497.    else if ( m_nMode ==Char_Mode  )  //字符
  498.   {
  499. InputChar( nBtnNo ) ;
  500.   }
  501. }
  502. void CDlgInput::OnBnClickedBtn1( )
  503. {    
  504.    
  505. // TODO: 在此添加控件通知处理程序代码
  506. BtnClickEx(1,49) ;
  507. }
  508. void CDlgInput::OnBnClickedBtn2( )
  509.  // TODO: 在此添加控件通知处理程序代码
  510. BtnClickEx(2,50) ;
  511. }
  512. void CDlgInput::OnBnClickedBtn3( )
  513. {   
  514. BtnClickEx(3,51) ;  
  515. // TODO: 在此添加控件通知处理程序代码
  516. }
  517. void CDlgInput::OnBnClickedBtn4()
  518. {
  519. // TODO: 在此添加控件通知处理程序代码
  520.   BtnClickEx(4,52) ;
  521. }
  522. void CDlgInput::OnBnClickedBtn5()
  523. {
  524. // TODO: 在此添加控件通知处理程序代码
  525.   BtnClickEx(5,53) ;;  
  526. }
  527. void CDlgInput::OnBnClickedBtn6()
  528. {
  529. // TODO: 在此添加控件通知处理程序代码
  530. BtnClickEx(6,54) ;
  531. }
  532. void CDlgInput::OnBnClickedBtn7()
  533. {
  534. // TODO: 在此添加控件通知处理程序代码
  535. BtnClickEx(7,55) ;
  536. }
  537. void CDlgInput::OnBnClickedBtn8()
  538. {
  539. // TODO: 在此添加控件通知处理程序代码
  540. BtnClickEx(8,56) ;
  541. }
  542. void CDlgInput::OnBnClickedBtn9()
  543. {
  544. // TODO: 在此添加控件通知处理程序代码
  545. BtnClickEx(9,57) ;   
  546. }
  547. void CDlgInput::OnBnClickedBtnhome( )  //第一页
  548. {
  549. // TODO: 在此添加控件通知处理程序代码
  550.     CString stri ;
  551. if(m_nMode == Char_Mode || m_nMode == Number_Mode) //!字符输入模式或数字输入模式 
  552. {
  553. SymbolHome( ) ;
  554. return ;
  555. }
  556. if ( ( m_nCurrPage != 0 )  && (m_nPageCount > 0 ) ) //不是第一页
  557. {
  558. m_nCurrPage = 0 ;  //置为第一页
  559. int i = 1 ;
  560. m_lsList.ResetContent(  ) ;
  561. for (m_it =enumer.begin( ) ; m_it !=enumer.end() ;m_it++  )
  562. {   
  563. if ( i == 10 )
  564. stri.Format("%d" ,0) ;
  565. else
  566. stri.Format("%d" ,i) ;
  567. m_lsList.AddString( stri+ ":" + (CString)(Word)(*m_it)) ; 
  568. if ( i == m_nPageSize ) 
  569. break ;
  570. else
  571. i++ ;
  572. }
  573. }
  574. else
  575. {
  576. //::Beep(500,1000 )  ;
  577. }
  578. }
  579. void CDlgInput::OnBnClickedBtndowngage( )  //下翻一页
  580. {
  581. // TODO: 在此添加控件通知处理程序代码 
  582.     CString stri ;
  583. if(m_nMode == Char_Mode || m_nMode == Number_Mode) //!字符输入模式或数字 
  584. {
  585. SymbolDownPage(  ) ;
  586. return ;
  587. }
  588.    if ( ( m_nCurrPage != (m_nPageCount-1)) && (m_nPageCount > 0 )  )  //不是最后一页
  589.    {  
  590.         m_nCurrPage = m_nCurrPage + 1 ;
  591. m_lsList.ResetContent( ) ; //清空原来的
  592. for (int i = 1 ; i<= 10 ; i++ )  //m_it =enumer.begin( ) ; m_it !=enumer.end() ;m_it++ 
  593. {   
  594. m_it++ ;  //下移一个
  595. if ( i == 10 )
  596. stri.Format("%d" ,0) ;
  597. else
  598. stri.Format("%d" ,i) ;
  599. m_lsList.AddString( stri+ ":" + (CString)(Word)(*m_it)) ; 
  600. if (  m_it == enumer.end( ) ) 
  601. break ;
  602. }  
  603.     }
  604.    else
  605.    {
  606.          //::Beep(500,1000 )  ;
  607.    }
  608. }
  609. void CDlgInput::OnBnClickedBtnend() //最后一页
  610. {
  611. // TODO: 在此添加控件通知处理程序代码
  612.       CString stri ;
  613.   
  614. if(m_nMode == Char_Mode || m_nMode == Number_Mode) //!字符输入模式或数字 
  615. {
  616. SymbolEnd( ) ;
  617. return ;
  618. }
  619.    if ( ( m_nCurrPage != (m_nPageCount-1) )  && (m_nPageCount > 0 ) ) //不是最后一页
  620.    {
  621.        
  622.     m_nCurrPage = (m_nPageCount-1) ;//当前页置为最后一页
  623.     m_it = enumer.begin( ) ;
  624. for (int j = 1 ; j < (m_nPageCount-1)* m_nPageSize ; j++ ) 
  625. {
  626.    m_it++ ;     
  627. }
  628.      m_lsList.ResetContent( ) ; //清空原来的
  629. int i = 0 ;
  630.         while (m_it !=enumer.end() )  //m_it =enumer.begin( ) ; m_it !=enumer.end() ;m_it++ 
  631. {   
  632.            i++ ;
  633.            m_it++ ;  //下移一个
  634.    if ( i == 10 )
  635. stri.Format("%d" ,0) ;
  636. else
  637. stri.Format("%d" ,i) ;
  638. m_lsList.AddString( stri+ ":" + (CString)(Word)(*m_it)) ;  
  639.    
  640. }  
  641.    }
  642.    else
  643.    {
  644.      //::Beep(500,1000 )  ;
  645.    }
  646. }
  647. void CDlgInput::OnBnClickedBtnupgage( )  //向上一页
  648. {
  649. // TODO: 在此添加控件通知处理程序代码
  650.         CString stri ;
  651. if(m_nMode == Char_Mode || m_nMode == Number_Mode ) //!字符输入模式 或数字
  652. {
  653. SymbolUpPage( ) ;
  654. return ;
  655. }
  656.    if ( (m_nCurrPage  != 0)  && ( m_nPageCount > 0 ) ) //不是第一页
  657.    {
  658.           
  659.        int nUpCount ; //回退的项数 
  660.    if ( m_nCurrPage == (m_nPageCount-1) ) //是最后一页 
  661.    {  
  662.     m_it = enumer.begin( ) ;
  663. for (int j = 1 ; j < (m_nPageCount-2)* m_nPageSize ; j++ ) 
  664. {
  665. m_it++ ;     
  666. }
  667.    }
  668.    else if ( m_nCurrPage ==1 ) //是第二页
  669.    {
  670.             OnBnClickedBtnhome( ) ; //置为第一页
  671. return ;
  672.    }
  673.    else  //既不是最后一页,也不是第二页
  674.    {    
  675. nUpCount = 2*m_nPageSize ;  
  676.     //向上回退nUpCount项
  677. for (int j =1 ; j <= nUpCount  ; j++ )
  678. {
  679. m_it-- ;
  680. if (  m_it == enumer.begin( ) )
  681. break ; 
  682. }
  683.    }
  684.         m_nCurrPage =  m_nCurrPage - 1 ; 
  685. m_lsList.ResetContent( ) ; //清空原来的
  686. for (int i = 1 ; i<= m_nPageSize  ; i++ )  //m_it =enumer.begin( ) ; m_it !=enumer.end() ;m_it++ 
  687. {   
  688. m_it++ ;  //下移一个
  689. if ( i == 10 )
  690. stri.Format("%d" ,0) ;
  691. else
  692. stri.Format("%d" ,i) ;
  693. m_lsList.AddString( stri+ ":" + (CString)(Word)(*m_it)) ; 
  694.    } 
  695.    else
  696.    {
  697.   // ::Beep(500,1000 )  ;
  698.    }
  699. }
  700.  
  701. /*! @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 )
  702. {
  703.     switch ( nInputMode ) 
  704. {
  705. case Spell_Mode :     //!拼音模式
  706. {
  707. m_nMode =Spell_Mode  ;
  708. m_bSpell = FALSE ;
  709. m_bNum = TRUE ;
  710. m_bChar = TRUE ; 
  711. m_bStrokeOrder = TRUE ; 
  712.         break;
  713. }
  714.       case BS_Mode :  //!部首模式 
  715. {
  716.        break ;
  717. }
  718. case Strokes_Mode : //!笔画模式
  719. break; 
  720. }
  721. case StrokesOrder_Mode  ://!笔顺模式
  722. {
  723.     m_nMode =StrokesOrder_Mode ;
  724. m_bSpell = TRUE ;
  725. m_bNum = TRUE ;
  726. m_bChar = TRUE ; 
  727. m_bStrokeOrder = FALSE ; 
  728. break; 
  729. }
  730. case Number_Mode : //!数字模式
  731. {
  732. m_nMode =Number_Mode ;
  733. m_bSpell = TRUE ;
  734. m_bNum = FALSE ;
  735. m_bChar = TRUE ; 
  736. m_bStrokeOrder = TRUE ; 
  737. break ; 
  738. }
  739. case Char_Mode ://!字符模式 
  740. {
  741. m_nMode =Char_Mode ;
  742. m_bSpell = TRUE ;
  743. m_bNum = TRUE ;
  744. m_bChar = FALSE ; 
  745. m_bStrokeOrder = TRUE ; 
  746.  }
  747.      }  //!Switch end 
  748.   
  749.    if (m_nMode >= Spell_Mode &&  m_nMode <= StrokesOrder_Mode ) 
  750.    {
  751. m_Inputer.SetMode(m_nMode) ;  
  752. m_Inputer.Reset( ) ;
  753.    }
  754. m_strChar ="" ;
  755. m_strOrderFilter = "" ;
  756. enumer.clear( ) ;
  757. m_lsList.ResetContent( ) ; 
  758. m_nPageCount = 0 ;
  759. this->UpdateData(FALSE ) ;
  760. }
  761. void CDlgInput::OnBnClickedRadspell()
  762. {
  763. // TODO: 在此添加控件通知处理程序代码 
  764. if ( m_nMode !=Spell_Mode ) 
  765. RadioFunc( Spell_Mode ) ;
  766.   
  767. }
  768. void CDlgInput::OnBnClickedRadnum()
  769. {
  770. // TODO: 在此添加控件通知处理程序代码
  771. if ( m_nMode !=Number_Mode ) 
  772. RadioFunc(Number_Mode ) ;
  773.   
  774. }
  775. void CDlgInput::OnBnClickedRadchar()
  776. {
  777. // TODO: 在此添加控件通知处理程序代码 
  778. if ( m_nMode !=Char_Mode ) 
  779. RadioFunc(Char_Mode ) ;
  780.   
  781. }
  782. void CDlgInput::OnBnClickedRadstrokeorder()
  783. {
  784. // TODO: 在此添加控件通知处理程序代码
  785. if ( m_nMode !=StrokesOrder_Mode ) 
  786. RadioFunc(StrokesOrder_Mode ) ;
  787.   
  788. }
  789. void CDlgInput::OnBnClickedBtn10( )
  790. {
  791. // TODO: 在此添加控件通知处理程序代码
  792. if ( m_nMode == Number_Mode ) 
  793.        InputNumber( 10 ) ;  
  794. }
  795. void CDlgInput::OnBnClickedBtnback( )
  796. {
  797. // TODO: 在此添加控件通知处理程序代码 
  798. // ::PostMessage(m_hWnd , WM_KEYDOWN,8 ,0) ; 
  799. // ::PostMessage(m_hWnd , WM_CHAR,8 ,0) ; 
  800. if ( m_strChar.GetLength( ) > 0 ) 
  801. {
  802.        ::PostMessage(m_hWnd , WM_KEYUP,8 ,0) ; 
  803. }
  804. else
  805.         DeleteChar(  )   ;
  806. }
  807.    
  808. }
  809. void CDlgInput::OnBnClickedBtnleft()
  810. {
  811. // TODO: 在此添加控件通知处理程序代码 
  812.      ::PostMessage(m_hWnd , WM_KEYUP,37 ,0) ; 
  813.    
  814. }
  815. void CDlgInput::OnBnClickedBtnright()
  816. {
  817. // TODO: 在此添加控件通知处理程序代码
  818. ::PostMessage(m_hWnd , WM_KEYUP,39 ,0) ; 
  819. }
  820. void CDlgInput::OnEnSetfocusEdtin( )
  821. {   
  822. // TODO: 在此添加控件通知处理程序代码 
  823. /*
  824. m_edtIn.CreateSolidCaret(1, 25);
  825. //CPoint pos =m_edtIn.GetCaretPos( ) ; 
  826. //m_edtIn.SetCaretPos(m_pLocal ) ;
  827.     m_edtIn.ShowCaret( ); 
  828.     */
  829.  
  830. }
  831. void CDlgInput::OnEnKillfocusEdtin( )
  832. {  
  833. // TODO: 在此添加控件通知处理程序代码 
  834. //m_pLocal =m_edtIn.GetCaretPos( ) ;
  835. //CString strdis ;
  836. // strdis.Format("x=%d ,y=%d" ,m_pLocal.x ,m_pLocal.y )  ;
  837. // ::AfxMessageBox( strdis) ;
  838. //m_edtIn.HideCaret( ) ; 
  839. }
  840. void CDlgInput::InputChar( int nBtnNO )   //输入字符串
  841. {
  842. TCHAR aUpperChar[9][4] ={{'A','B','C'},{'D','E','F'},{'G','H','I'},
  843.  {'J','K','L'},{'M','N','O'},{'P','Q','R'},
  844.  {'S','T','U'},{'V','W','X'},{'Y','Z',' '}  };  
  845. TCHAR aLowerChar[9][4] ={{'a','b','c'},{'d','e','f'},{'g','h','i'},
  846.  {'j','k','l'},{'m','n','o'},{'p','q','r'},
  847.  {'s','t','u'},{'v','w','x'},{'y','z',' '}  };  
  848.      
  849.        TCHAR cChar ; 
  850.    CFileTimeSpan tSpan ;
  851.    CFileTime  tCurrTime =CFileTime::GetCurrentTime( ) ; 
  852.    tSpan = tCurrTime - m_tPreTime ;  //!前一次击键的时间间隔
  853.        BOOL bIsAdd = TRUE ;  //! 是否是增加
  854.  
  855.    if ( m_nPreBtnNo != nBtnNO )  //使用不同的字符
  856.    {
  857.    if ( m_nUpperOrLower == CharUpper ) 
  858.       cChar = aUpperChar[nBtnNO-1][0] ;
  859.    else
  860.   cChar = aLowerChar[nBtnNO-1][0] ;
  861.    }
  862.    else if ( ( m_nPreBtnNo == nBtnNO ) && ( tSpan >= m_nTimeGap*CFileTime::Millisecond ) )
  863.    {
  864.             if ( m_nUpperOrLower == CharUpper ) 
  865.       cChar = aUpperChar[nBtnNO-1][0] ;
  866.     else
  867.   cChar = aLowerChar[nBtnNO-1][0] ;
  868.    }
  869.    else if ( ( m_nPreBtnNo == nBtnNO ) && ( tSpan < m_nTimeGap*CFileTime::Millisecond ) ) //!击键间隔在1秒之内
  870.    {           
  871.             
  872.    CString strPos = m_strInput.Mid(m_nCount-1,1) ;
  873.    if ( m_nUpperOrLower == CharUpper ) 
  874.    {
  875.  for (int i = 0 ; i < 3 ; i++ )
  876.  {
  877.  if (aUpperChar[nBtnNO-1][i] == strPos )
  878.   break ;
  879.  }
  880.  
  881.  if ( ( i== 3 ) ||  ( i ==2 ) ) 
  882. {
  883.  cChar = aUpperChar[nBtnNO-1][0] ;
  884.  }
  885.  else
  886.  {
  887.  cChar = aUpperChar[nBtnNO-1][ i+1] ;
  888.  }
  889.    }
  890.    else
  891.    {
  892. for (int i = 0 ; i < 3 ; i++ )
  893.  {
  894.  if (aLowerChar[nBtnNO-1][i] == strPos )
  895.   break ;
  896.  }
  897.  
  898.  if ( ( i== 3 ) ||  ( i ==2 ) ) 
  899. {
  900.  cChar = aLowerChar[nBtnNO-1][0] ;
  901.  }
  902.  else
  903.  {
  904.  cChar = aLowerChar[nBtnNO-1][ i+1] ;
  905.  }
  906.    }
  907.        bIsAdd = FALSE ;  //!置修改标志
  908.    }
  909.    
  910.     m_nPreBtnNo = nBtnNO ; //置为前一次按键序号
  911. m_tPreTime = tCurrTime ;  //置为前一次按键时间
  912. CString strRight ;
  913. if  (m_strInput.GetLength( ) == m_nCount ) //当前的光标在最后
  914. {   
  915. if ( bIsAdd == TRUE ) //!增加  
  916. {   
  917.                 
  918. if ( IsExceedLimit(1) ) //超出了限制
  919. {
  920. m_edtIn.SetFocus( ) ;
  921. m_edtIn.SetSel(m_nCount,m_nCount );  
  922. return  ;
  923. }
  924.      m_strInput = m_strInput + cChar ; 
  925. m_nCount++ ;
  926. }
  927. else  //!修改
  928. {
  929. m_strInput = m_strInput.Left( m_strInput.GetLength( ) -1 ) + cChar ; 
  930. }
  931. }
  932. else    //!当前光标不在最后 
  933. {  
  934. if ( bIsAdd == TRUE ) //!增加 
  935. {
  936. if ( IsExceedLimit(1) ) //超出了限制
  937. {
  938. m_edtIn.SetFocus( ) ;
  939. m_edtIn.SetSel(m_nCount,m_nCount );  
  940. return  ;
  941. }
  942. strRight = m_strInput.Right(m_strInput.GetLength( ) - m_nCount ) ;
  943. m_strInput = m_strInput.Left( m_nCount ) ;
  944. m_strInput = m_strInput + cChar + strRight ;
  945. m_nCount++ ;
  946. }
  947. else //!修改
  948. {
  949. strRight = m_strInput.Right(m_strInput.GetLength( ) - m_nCount ) ;
  950. m_strInput = m_strInput.Left( m_nCount -1 ) ;
  951. m_strInput = m_strInput + cChar + strRight ;
  952. }
  953. this->UpdateData(FALSE)  ;
  954.         m_edtIn.SetFocus( ) ;
  955. m_edtIn.SetSel(m_nCount-1,m_nCount ) ; 
  956. }
  957. /*! @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  )
  958. {
  959. TCHAR aLowerChar[9][4] ={{'a','b','c'},{'d','e','f'},{'g','h','i'},
  960.  {'j','k','l'},{'m','n','o'},{'p','q','r'},
  961.  {'s','t','u'},{'v','w','x'},{'y','z',' '}  };  
  962.      
  963.        TCHAR cChar ; 
  964.    CFileTimeSpan tSpan ;
  965.    CFileTime  tCurrTime =CFileTime::GetCurrentTime( ) ; 
  966.    tSpan = tCurrTime - m_tPreTime ;  //!前一次击键的时间间隔
  967.        BOOL bIsAdd = TRUE ;  //! 是否是增加
  968.  
  969.  
  970.    if ( m_nPreBtnNo != nBtnNO )  //使用不同的字符
  971.    {
  972.   
  973.   cChar = aLowerChar[nBtnNO-1][0] ;
  974.    }
  975.    else if ( ( m_nPreBtnNo == nBtnNO ) && ( tSpan >= m_nTimeGap*CFileTime::Millisecond ) )
  976.    {
  977.      
  978.   cChar = aLowerChar[nBtnNO-1][0] ;
  979.    }
  980.    else if ( ( m_nPreBtnNo == nBtnNO ) && ( tSpan < m_nTimeGap*CFileTime::Millisecond ) ) //!击键间隔在1秒之内
  981.    {           
  982.             
  983.    CString strPos = m_strChar.Mid(m_strChar.GetLength( )-1 ,1) ;
  984. for (int i = 0 ; i < 3 ; i++ )
  985.  {
  986.  if (aLowerChar[nBtnNO-1][i] == strPos )
  987.   break ;
  988.  }
  989.  
  990. if ( ( i== 3 ) ||  ( i ==2 ) ) 
  991. {
  992.  cChar = aLowerChar[nBtnNO-1][0] ;
  993.  }
  994.  else
  995.  {
  996.  cChar = aLowerChar[nBtnNO-1][ i+1] ;
  997.  }
  998.  bIsAdd = FALSE ;  //!置修改标志
  999.    }
  1000.   
  1001.     m_nPreBtnNo = nBtnNO ; //置为前一次按键序号
  1002. m_tPreTime = tCurrTime ;  //置为前一次按键时间
  1003.  
  1004. if ( bIsAdd == TRUE ) //!增加  
  1005. {
  1006.   if (m_strChar.GetLength( ) >= m_nCharMaxLen ) 
  1007.        return  ;
  1008.      m_strChar = m_strChar + cChar ; 
  1009. }
  1010. else  //!修改
  1011. {
  1012. m_strChar = m_strChar.Left( m_strChar.GetLength( ) -1 ) + cChar ; 
  1013. }
  1014. this->UpdateData(FALSE)  ; 
  1015. m_Inputer.Reset( ) ;
  1016. m_Inputer.Put(_T(m_strChar) ) ;  
  1017. SpellQuery( ) ;
  1018.        
  1019. }
  1020. /*! @function  public  DeleteChar ******************************************************************************** brief   功能    :删除一个字符                         <br> 函数名  : return void 无返回值 exception   author  zqp   remark    <br> 典型用法:   <br> 复杂度 :                          *******************************************************************************/ void CDlgInput::DeleteChar(  )  
  1021. {  
  1022.   
  1023.  
  1024.    if ( m_nCount > 0 )
  1025.    {   
  1026.     char  cCount = m_strInput.GetAt(m_nCount-1) ;
  1027. if ( cCount<0 || cCount > 255 )  //!不是ASCII码字符
  1028. {
  1029. m_nCount-=2  ;
  1030.             m_strInput.Delete(m_nCount,2 ) ;
  1031. }
  1032. else
  1033. {
  1034. m_nCount-- ;
  1035. m_strInput.Delete(m_nCount,1 ) ;  
  1036. }
  1037.   
  1038. this->UpdateData(FALSE)  ;
  1039.         m_edtIn.SetFocus( ) ;
  1040. m_edtIn.SetSel(m_nCount,m_nCount ) ;  
  1041.    } 
  1042. }
  1043. /*! @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 )   //输入数字
  1044. {    
  1045.  TCHAR aChar[10] = {'1','2','3','4','5','6','7','8','9','0'} ;   
  1046.    TCHAR  cChar = aChar[nBtnNO-1] ;
  1047.          
  1048.    if ( IsExceedLimit(1) ) //超出了限制
  1049.    {
  1050. m_edtIn.SetFocus( ) ;
  1051. m_edtIn.SetSel(m_nCount,m_nCount );  
  1052. return  ;
  1053.    }
  1054.    
  1055. CString strRight ;
  1056. if  (m_strInput.GetLength( ) == m_nCount ) //当前的光标在最后
  1057. {   
  1058. m_strInput = m_strInput + cChar ; 
  1059. }
  1060. else    //!当前光标不在最后 
  1061. {  
  1062. strRight = m_strInput.Right(m_strInput.GetLength( ) - m_nCount ) ;
  1063. m_strInput = m_strInput.Left( m_nCount ) ;
  1064. m_strInput = m_strInput + cChar + strRight ;
  1065. m_nCount++ ; 
  1066. this->UpdateData(FALSE) ;
  1067.         m_edtIn.SetFocus( ) ;
  1068. m_edtIn.SetSel(m_nCount-1,m_nCount );  
  1069. }
  1070. /*! @function  public  InputSymbol ******************************************************************************** brief   功能    : 输入一些特殊的符号              <br> 函数名  : return void 无返回值 exception   author    zqp remark    <br> 典型用法:输入:'#','$'   <br> 复杂度 :                          *******************************************************************************/ /////// comment generated by CommentMakerPro from www.FeinSoftware.com //////// void CDlgInput::InputSymbol(  ) 
  1071. {
  1072.     
  1073.         CString strword ;
  1074. if ( IsExceedLimit(1) ) //超出了限制
  1075. {
  1076. m_edtIn.SetFocus( ) ;
  1077. m_edtIn.SetSel(m_nCount,m_nCount );  
  1078. return  ;
  1079. }
  1080. int nIndex =m_lsList.GetCurSel( ) ;
  1081. nIndex = m_nCurrPage*m_nPageSize + nIndex ;
  1082. if ( ( nIndex > m_nSymbolCount ) || ( m_nPageCount < 1 ) )
  1083. return  ;
  1084. strword  = m_aSymbol[nIndex] ;
  1085. if  (m_strInput.GetLength( ) == m_nCount ) //当前的光标在最后
  1086. {   
  1087. m_strInput = m_strInput + strword ; 
  1088. }
  1089. else    //!当前光标不在最后 
  1090. {  
  1091. CString strRight = m_strInput.Right(m_strInput.GetLength( ) - m_nCount ) ;
  1092. m_strInput = m_strInput.Left( m_nCount ) ;
  1093. m_strInput = m_strInput + strword + strRight ;
  1094. }
  1095. m_nCount++ ;
  1096.         this->UpdateData(FALSE) ;
  1097.         m_edtIn.SetFocus( ) ;
  1098. m_edtIn.SetSel(m_nCount,m_nCount );  
  1099. }
  1100.  
  1101. //最接近的除法 
  1102.   
  1103. /*! @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 )  
  1104. {
  1105.    int nRec  ,nMode ;
  1106.    nRec = (int) DevedNum/DevNum ;
  1107.    nMode = DevedNum % DevNum  ;
  1108.     
  1109. if ( nMode > (int)DevNum/2 ) 
  1110. nRec++ ; 
  1111.   return  nRec ;
  1112. }
  1113. void CDlgInput::OnLbnSelchangeList( )
  1114. {
  1115. // TODO: 在此添加控件通知处理程序代码
  1116. ChineseInputer::WordEnumerator::iterator  it ; 
  1117. int nIndex ;
  1118. if ( m_nMode == Char_Mode || m_nMode == Number_Mode )  //是字符输入模式
  1119. {
  1120.     InputSymbol( ) ;
  1121. return  ;
  1122. }
  1123.  
  1124.        if ( IsExceedLimit(2) ) //超出了限制
  1125.    {
  1126. m_edtIn.SetFocus( ) ;
  1127. m_edtIn.SetSel(m_nCount,m_nCount );  
  1128. return  ;
  1129.    }
  1130.     
  1131. nIndex = m_lsList.GetCurSel( ) ;
  1132. nIndex = m_nCurrPage * m_nPageSize + nIndex ;
  1133.  // 
  1134.  int i = 0 ;
  1135.  for( it = enumer.begin( ) ; it !=enumer.end() ;it++ )
  1136.  {
  1137.  if ( i == nIndex ) 
  1138.  break ;
  1139.  else 
  1140.  i++ ;
  1141.   }
  1142. CString strword ="" ;
  1143. strword = (CString)(Word)(*it) ;
  1144. strword.TrimLeft( ) ;
  1145. strword = strword.Left(2);
  1146.   
  1147. if  (m_strInput.GetLength( ) == m_nCount ) //当前的光标在最后
  1148. {   
  1149. m_strInput = m_strInput + strword ; 
  1150. }
  1151. else    //!当前光标不在最后 
  1152. {  
  1153. CString strRight = m_strInput.Right(m_strInput.GetLength( ) - m_nCount ) ;
  1154. m_strInput = m_strInput.Left( m_nCount ) ;
  1155. m_strInput = m_strInput + strword + strRight ;
  1156. }
  1157. m_nCount++ ; 
  1158. m_nCount++ ; 
  1159. m_strChar = "" ;
  1160. m_strOrderFilter ="" ;
  1161. m_Inputer.Reset( ) ; 
  1162. this->UpdateData(FALSE) ;
  1163.         m_edtIn.SetFocus( ) ;
  1164. m_edtIn.SetSel(m_nCount,m_nCount );  
  1165.         
  1166. }
  1167. void CDlgInput::OnEnMaxtextEdtin()
  1168. {
  1169. // TODO: 在此添加控件通知处理程序代码 
  1170. ::AfxMessageBox("超出了最大的长度" ) ;
  1171. }
  1172. /*! @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 ) 
  1173. if ( m_strInput.GetLength( ) + nInputLen >  m_nInputMaxLen  )   
  1174. return TRUE  ;
  1175. else
  1176. return FALSE ;
  1177. }
  1178. void  CDlgInput::MakeSymbol( ) //生成特殊符号
  1179. {
  1180.      
  1181.  CString stri  ;
  1182.     
  1183.  m_nPageCount = (int)( m_nSymbolCount/m_nPageSize)  ; //总页数
  1184. //计数总页数
  1185. if ( (m_nSymbolCount % m_nPageSize ) != 0 )
  1186. m_nPageCount = m_nPageCount + 1  ; 
  1187.  m_nCurrPage = 0 ;  //当前页码 
  1188.      int nIndex  ; 
  1189.      m_lsList.ResetContent( ) ;
  1190.      for (int i =1 ; i<= m_nPageSize ; i++ )  //m_it =enumer.begin( ) ; m_it !=enumer.end() ;m_it++ 
  1191. {   
  1192.  
  1193. if ( i == 10 )
  1194. stri.Format("%d" ,0) ;
  1195. else
  1196. stri.Format("%d" ,i) ; 
  1197. nIndex = m_nCurrPage*m_nPageSize + i - 1  ;
  1198.     if ( nIndex >=  m_nSymbolCount   )
  1199. break ;
  1200. m_lsList.AddString( stri+ ":" + m_aSymbol[ nIndex] ) ; 
  1201. }  
  1202. }
  1203. void CDlgInput::SymbolHome( ) //首页
  1204. {   
  1205.  CString stri ; 
  1206. if( m_nCurrPage ==  0 || m_nPageCount == 0 ) //第一页
  1207. return  ;
  1208.  m_nCurrPage = 0 ;  //当前页码 
  1209.      int nIndex  ; 
  1210.      m_lsList.ResetContent( ) ;
  1211.      for (int i = 1 ; i<=  m_nPageSize ; i++ )  //m_it =enumer.begin( ) ; m_it !=enumer.end() ;m_it++ 
  1212. {   
  1213.  
  1214. if ( i == 10 )
  1215. stri.Format("%d" ,0) ;
  1216. else
  1217. stri.Format("%d" ,i) ; 
  1218. nIndex = m_nCurrPage*m_nPageSize + i-1 ;
  1219.     if ( nIndex >=  m_nSymbolCount   )
  1220. break ;
  1221. m_lsList.AddString( stri+ ":" + m_aSymbol[ nIndex] ) ; 
  1222. }  
  1223. }
  1224. void CDlgInput::SymbolEnd( )  //末页
  1225. {
  1226.  CString stri ;
  1227. if( m_nCurrPage ==  m_nPageCount-1 || m_nPageCount == 0 )   //最后一页
  1228. return  ;
  1229.  m_nCurrPage = m_nPageCount-1 ;  //当前页码 
  1230.      int nIndex  ; 
  1231.      m_lsList.ResetContent( ) ;
  1232.      for (int i = 1 ; i<=  m_nPageSize ; i++ )  //m_it =enumer.begin( ) ; m_it !=enumer.end() ;m_it++ 
  1233. {   
  1234.  
  1235. if ( i == 10 )
  1236. stri.Format("%d" ,0) ;
  1237. else
  1238. stri.Format("%d" ,i) ; 
  1239. nIndex = m_nCurrPage*m_nPageSize + i - 1  ;
  1240.     if ( nIndex >=  m_nSymbolCount   )
  1241. break ;
  1242. m_lsList.AddString( stri+ ":" + m_aSymbol[ nIndex] ) ; 
  1243. }  
  1244. }
  1245. void CDlgInput::SymbolUpPage( ) //上一页
  1246. {
  1247. CString stri ; 
  1248. if( m_nCurrPage ==  0 || m_nPageCount == 0 ) //第一页
  1249. return  ;
  1250.  m_nCurrPage-- ;  //当前页码 
  1251.  if ( m_nCurrPage < 0 ) 
  1252. m_nCurrPage = 0 ;
  1253.      int nIndex  ; 
  1254.      m_lsList.ResetContent( ) ;
  1255.      for (int i = 1 ; i<=  m_nPageSize ; i++ )  //m_it =enumer.begin( ) ; m_it !=enumer.end() ;m_it++ 
  1256. {   
  1257.  
  1258. if ( i == 10 )
  1259. stri.Format("%d" ,0) ;
  1260. else
  1261. stri.Format("%d" ,i) ; 
  1262. nIndex = m_nCurrPage*m_nPageSize + i - 1 ;
  1263.     if ( nIndex >=  m_nSymbolCount   )
  1264. break ;
  1265. m_lsList.AddString( stri+ ":" + m_aSymbol[ nIndex] ) ; 
  1266. }  
  1267. }
  1268. void CDlgInput::SymbolDownPage( ) // 下一页  
  1269. {
  1270.    CString stri ; 
  1271.      
  1272.     if( m_nCurrPage ==  m_nPageCount-1 || m_nPageCount == 0 ) //最后一页
  1273. return  ;
  1274.  m_nCurrPage++ ;  //当前页码 
  1275.  if ( m_nCurrPage > m_nPageCount-1 ) 
  1276. m_nCurrPage = m_nPageCount-1  ;
  1277.      int nIndex  ; 
  1278.      m_lsList.ResetContent( ) ;
  1279.      for (int i = 1 ; i<=  m_nPageSize ; i++ )  //m_it =enumer.begin( ) ; m_it !=enumer.end() ;m_it++ 
  1280. {   
  1281.   if ( i == 10 )
  1282. stri.Format("%d" ,0) ;
  1283. else
  1284. stri.Format("%d" ,i) ; 
  1285. nIndex = m_nCurrPage*m_nPageSize + i-1 ;
  1286.     if ( nIndex >=  m_nSymbolCount )
  1287. break ;
  1288. m_lsList.AddString( stri+ ":" + m_aSymbol[ nIndex] ) ; 
  1289. }  
  1290. }
  1291. void CDlgInput::OnBnClickedBtn11( )
  1292. {
  1293. // TODO: 在此添加控件通知处理程序代码
  1294. if ( m_nMode == Char_Mode || m_nMode == Number_Mode ) //字符输入模式
  1295.        MakeSymbol( ) ;      
  1296. }
  1297. void CDlgInput::OnBnClickedRadupper( )
  1298. {
  1299. // TODO: 在此添加控件通知处理程序代码  
  1300. if ( m_nUpperOrLower ==  CharUpper )
  1301. return ;
  1302.     m_bUpper = FALSE ;
  1303. m_bLower =TRUE ;
  1304. m_nUpperOrLower = CharUpper ;
  1305. this->UpdateData(FALSE ) ;
  1306. }
  1307. void CDlgInput::OnBnClickedRadlower( )
  1308. {
  1309. // TODO: 在此添加控件通知处理程序代码 
  1310. if ( m_nUpperOrLower == CharLower ) 
  1311. return ;
  1312. m_bUpper = TRUE ;
  1313. m_bLower =FALSE ;
  1314. m_nUpperOrLower = CharLower ;
  1315. this->UpdateData(FALSE ) ;
  1316. }
  1317. void CDlgInput::OnBnClickedBtnok( )
  1318. {
  1319. // TODO: 在此添加控件通知处理程序代码
  1320. OnOK( ) ;
  1321. }