TestSegExDlg.cpp
上传用户:fujunqh
上传日期:2021-05-10
资源大小:7090k
文件大小:23k
源码类别:

多国语言处理

开发平台:

Visual C++

  1. // TestSegExDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "TestSegEx.h"
  5. #include "TestSegExDlg.h"
  6. #include "WaitDlgmy.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CAboutDlg dialog used for App About
  14. class CAboutDlg : public CDialog
  15. {
  16. public:
  17. CAboutDlg();
  18. // Dialog Data
  19. //{{AFX_DATA(CAboutDlg)
  20. enum { IDD = IDD_ABOUTBOX };
  21. //}}AFX_DATA
  22. // ClassWizard generated virtual function overrides
  23. //{{AFX_VIRTUAL(CAboutDlg)
  24. protected:
  25. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  26. //}}AFX_VIRTUAL
  27. // Implementation
  28. protected:
  29. //{{AFX_MSG(CAboutDlg)
  30. afx_msg void OnStaticAboutpic();
  31. //}}AFX_MSG
  32. DECLARE_MESSAGE_MAP()
  33. };
  34. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  35. {
  36. //{{AFX_DATA_INIT(CAboutDlg)
  37. //}}AFX_DATA_INIT
  38. }
  39. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  40. {
  41. CDialog::DoDataExchange(pDX);
  42. //{{AFX_DATA_MAP(CAboutDlg)
  43. //}}AFX_DATA_MAP
  44. }
  45. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  46. //{{AFX_MSG_MAP(CAboutDlg)
  47. ON_BN_CLICKED(IDC_STATIC_ABOUTPIC, OnStaticAboutpic)
  48. //}}AFX_MSG_MAP
  49. END_MESSAGE_MAP()
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CTestSegExDlg dialog
  52. CTestSegExDlg::CTestSegExDlg(CWnd* pParent /*=NULL*/)
  53. : CDialog(CTestSegExDlg::IDD, pParent)
  54. {
  55. //{{AFX_DATA_INIT(CTestSegExDlg)
  56. m_strSource = _T("");
  57. m_strResult = _T("");
  58. m_bKeyWord = FALSE;
  59. m_bPos = FALSE;
  60. m_bSearch = FALSE;
  61. m_bFinger = FALSE;
  62. m_strFinger = _T("");
  63. m_strKey = _T("");
  64. //}}AFX_DATA_INIT
  65. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  66. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  67. }
  68. void CTestSegExDlg::DoDataExchange(CDataExchange* pDX)
  69. {
  70. CDialog::DoDataExchange(pDX);
  71. //{{AFX_DATA_MAP(CTestSegExDlg)
  72. DDX_Control(pDX, IDC_RICHEDIT_RESULT, m_cResult);
  73. DDX_Text(pDX, IDC_EDIT_SOURCE, m_strSource);
  74. DDX_Text(pDX, IDC_RICHEDIT_RESULT, m_strResult);
  75. DDX_Check(pDX, IDC_CHECK_IE, m_bKeyWord);
  76. DDX_Check(pDX, IDC_CHECK_POS, m_bPos);
  77. DDX_Check(pDX, IDC_CHECK_SEARCH, m_bSearch);
  78. DDX_Check(pDX, IDC_CHECK_UUI, m_bFinger);
  79. DDX_Text(pDX, IDC_STATIC_UUID, m_strFinger);
  80. DDX_Text(pDX, IDC_RICHEDIT_KEY, m_strKey);
  81. //}}AFX_DATA_MAP
  82. }
  83. BEGIN_MESSAGE_MAP(CTestSegExDlg, CDialog)
  84. //{{AFX_MSG_MAP(CTestSegExDlg)
  85. ON_WM_SYSCOMMAND()
  86. ON_WM_PAINT()
  87. ON_WM_QUERYDRAGICON()
  88. ON_BN_CLICKED(IDC_BTN_EXIT, OnBtnExit)
  89. ON_BN_CLICKED(IDC_BTN_SEGMENT, OnBtnSegment)
  90. ON_BN_CLICKED(IDC_BTN_CLEAR, OnBtnClear)
  91. ON_BN_CLICKED(IDC_BTN_LOAD_FILE, OnBtnLoadFile)
  92. ON_BN_CLICKED(IDC_BTN_MTEST, OnBtnMtest)
  93. ON_WM_CLOSE()
  94. ON_BN_CLICKED(IDC_BTN_ABOUT, OnBtnAbout)
  95. ON_BN_CLICKED(IDC_STATIC_PIC, OnStaticPic)
  96. ON_BN_CLICKED(IDC_BTN_OPEN_UDICT, OnBtnOpenUdict)
  97. ON_BN_CLICKED(IDC_BTN_CLOSEUDICT, OnBtnCloseudict)
  98. //}}AFX_MSG_MAP
  99. END_MESSAGE_MAP()
  100. /////////////////////////////////////////////////////////////////////////////
  101. // CTestSegExDlg message handlers
  102. BOOL CTestSegExDlg::OnInitDialog()
  103. {
  104. CDialog::OnInitDialog();
  105. // Add "About..." menu item to system menu.
  106. // IDM_ABOUTBOX must be in the system command range.
  107. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  108. ASSERT(IDM_ABOUTBOX < 0xF000);
  109. CMenu* pSysMenu = GetSystemMenu(FALSE);
  110. if (pSysMenu != NULL)
  111. {
  112. CString strAboutMenu;
  113. strAboutMenu.LoadString(IDS_ABOUTBOX);
  114. if (!strAboutMenu.IsEmpty())
  115. {
  116. pSysMenu->AppendMenu(MF_SEPARATOR);
  117. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  118. }
  119. }
  120. // Set the icon for this dialog.  The framework does this automatically
  121. //  when the application's main window is not a dialog
  122. SetIcon(m_hIcon, TRUE); // Set big icon
  123. SetIcon(m_hIcon, FALSE); // Set small icon
  124. // TODO: Add extra initialization here
  125. ///初始化分词
  126. if(!HLSplitInit())
  127. {
  128. AfxMessageBox("分词初始化失败!");
  129. return FALSE ;
  130. }
  131. return TRUE;  // return TRUE  unless you set the focus to a control
  132. }
  133. void CTestSegExDlg::OnSysCommand(UINT nID, LPARAM lParam)
  134. {
  135. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  136. {
  137. CAboutDlg dlgAbout;
  138. dlgAbout.DoModal();
  139. }
  140. else
  141. {
  142. CDialog::OnSysCommand(nID, lParam);
  143. }
  144. }
  145. // If you add a minimize button to your dialog, you will need the code below
  146. //  to draw the icon.  For MFC applications using the document/view model,
  147. //  this is automatically done for you by the framework.
  148. void CTestSegExDlg::OnPaint() 
  149. {
  150. if (IsIconic())
  151. {
  152. CPaintDC dc(this); // device context for painting
  153. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  154. // Center icon in client rectangle
  155. int cxIcon = GetSystemMetrics(SM_CXICON);
  156. int cyIcon = GetSystemMetrics(SM_CYICON);
  157. CRect rect;
  158. GetClientRect(&rect);
  159. int x = (rect.Width() - cxIcon + 1) / 2;
  160. int y = (rect.Height() - cyIcon + 1) / 2;
  161. // Draw the icon
  162. dc.DrawIcon(x, y, m_hIcon);
  163. }
  164. else
  165. {
  166. CDialog::OnPaint();
  167. }
  168. }
  169. // The system calls this to obtain the cursor to display while the user drags
  170. //  the minimized window.
  171. HCURSOR CTestSegExDlg::OnQueryDragIcon()
  172. {
  173. return (HCURSOR) m_hIcon;
  174. }
  175. //********************************************************************
  176. // 函 数 名: OnBtnExit
  177. // 作    者: lili
  178. // 日    期:   2005.4.20
  179. // 功能描述: 退出函数
  180. // 参数说明:
  181. // 返 回 值:
  182. // 负面影响: 无   
  183. // 备    忘:
  184. // 已知限制: 无
  185. // 错 误 号: 无
  186. // 更新纪录:
  187. //  日    期        姓   名                    描述
  188. // ===========     =========  ========================================
  189. //********************************************************************
  190. void CTestSegExDlg::OnBtnExit() 
  191. {
  192. // TODO: Add your control notification handler code here
  193. //卸载分词
  194. HLFreeSplit();
  195. CDialog::OnOK();
  196. }
  197. //********************************************************************
  198. // 函 数 名: OnBtnSegment
  199. // 作    者: lili
  200. // 日    期:   2005.4.20
  201. // 功能描述: 对输入框内的内容进行分词
  202. // 参数说明:
  203. // 返 回 值:
  204. // 负面影响: 无   
  205. // 备    忘:
  206. // 已知限制: 无
  207. // 错 误 号: 无
  208. // 更新纪录:
  209. //  日    期        姓   名                    描述
  210. // ===========     =========  ========================================
  211. //********************************************************************
  212. void CTestSegExDlg::OnBtnSegment() 
  213. {
  214. // TODO: Add your control notification handler code here
  215. UpdateData();
  216. m_strResult.Empty();
  217. m_strFinger.Empty();
  218. int nExtra = 0;
  219. m_strKey.Empty();
  220. //获得附加计算标识
  221. if(m_bPos)
  222. nExtra |= HL_CAL_OPT_POS ;
  223. if(m_bKeyWord)
  224. nExtra |= HL_CAL_OPT_KEYWORD ;
  225. if(m_bSearch)
  226. nExtra |= HL_CAL_OPT_SEARCH;
  227. if(m_bFinger)
  228. nExtra |= HL_CAL_OPT_FINGER ;
  229. ///打开分词句柄
  230. HANDLE hHandle = HLOpenSplit();
  231. if(hHandle == INVALID_HANDLE_VALUE)
  232. {
  233. AfxMessageBox("分词句柄打开失败!");
  234. return ;
  235. }
  236. DWORD dwStart = GetTickCount();
  237. HLSplitWord(hHandle,(LPCTSTR)m_strSource,nExtra);//进行分词
  238. DWORD dwEnd = GetTickCount();
  239. CString strMsg ;
  240. strMsg.Format("字节:%d  耗时:%dms",m_strSource.GetLength(),(dwEnd-dwStart));
  241. AfxMessageBox(strMsg);
  242. int nCnt = HLGetWordCnt(hHandle) ;//获得分词结果个数
  243. SHLSegWord* pWord = NULL ;
  244. for(int i = 0 ; i < nCnt ; i++)
  245. {//获得分词结果
  246. CString strWord;
  247. pWord = HLGetWordAt(hHandle,i);//获得指定的分词结果
  248. strWord = pWord->s_szWord ;
  249. if(m_bPos)//词性
  250. {//显示词性标准
  251. AddNatureString(strWord,pWord->s_dwPOS);
  252. }
  253. strWord += _T(" ");
  254. m_strResult += strWord ;
  255. }//for i
  256. if(m_bKeyWord)
  257. {//获取关键词
  258. int nKeyCnt = HLGetFileKeyCnt(hHandle) ;//获得关键词个数
  259. for(int j = 0 ; j < nKeyCnt ; j++)
  260. {
  261. SHLSegWord* pKey = HLGetFileKeyAt(hHandle,j);//获得指定的关键词
  262. if(!pKey)
  263. continue ;
  264. CString strKey ;
  265. strKey.Format("%d. %s %fn",j+1,pKey->s_szWord ,pKey->s_fWeight) ;
  266. m_strKey += strKey ;
  267. }//for j
  268. }
  269. if(m_bFinger)
  270. {//获取语义指纹
  271. LPBYTE pData ;
  272. unsigned long nDataLen ;
  273. m_strFinger += _T("语义指纹:");
  274. if(HLGetFingerM(hHandle,pData,nDataLen))//获得语义指纹
  275. {
  276. for(int j = 0 ; j < nDataLen ; j++)
  277. {
  278. CString strU ;
  279. strU.Format("%2.2x ",pData[j]);
  280. m_strFinger += strU ;
  281. }
  282. }//
  283. }
  284. HLCloseSplit(hHandle);//关闭分词句柄
  285. UpdateData(FALSE);
  286. }
  287. //********************************************************************
  288. // 函 数 名: OnBtnClear
  289. // 作    者: lili
  290. // 日    期:   2005.4.20
  291. // 功能描述: 清空界面显示
  292. // 参数说明:
  293. // 返 回 值:
  294. // 负面影响: 无   
  295. // 备    忘:
  296. // 已知限制: 无
  297. // 错 误 号: 无
  298. // 更新纪录:
  299. //  日    期        姓   名                    描述
  300. // ===========     =========  ========================================
  301. //********************************************************************
  302. void CTestSegExDlg::OnBtnClear() 
  303. {
  304. // TODO: Add your control notification handler code here
  305. m_strSource = _T("");
  306. m_strResult = _T("");
  307. m_cResult.SetWindowText("");
  308. m_bKeyWord = FALSE;
  309. m_bPos = FALSE;
  310. m_bSearch = FALSE;
  311. m_bFinger = FALSE;
  312. m_strFinger = _T("");
  313. m_strKey.Empty();
  314. UpdateData(FALSE);
  315. }
  316. //********************************************************************
  317. // 函 数 名: OnBtnLoadFile
  318. // 作    者: lili
  319. // 日    期:   2005.4.20
  320. // 功能描述: 装载文件
  321. // 参数说明:
  322. // 返 回 值:
  323. // 负面影响: 无   
  324. // 备    忘:
  325. // 已知限制: 无
  326. // 错 误 号: 无
  327. // 更新纪录:
  328. //  日    期        姓   名                    描述
  329. // ===========     =========  ========================================
  330. //********************************************************************
  331. void CTestSegExDlg::OnBtnLoadFile() 
  332. {
  333. // TODO: Add your control notification handler code here
  334. UpdateData();
  335. //选择文件
  336. CFileDialog cdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"文本文件(*.txt)|*.txt|All File(*.*)|*.*||",this);
  337. if(cdlg.DoModal()==IDOK)
  338. {
  339. CFile file ;
  340. CString strFile = cdlg.GetFileName();
  341. if(!file.Open(strFile,CFile::modeRead))//打开选择的文件
  342. {
  343. AfxMessageBox("文件打开失败!");
  344. return ;
  345. }
  346. int nLen = file.GetLength();//获得文件长度
  347. LPSTR lpTemp = m_strSource.GetBuffer(nLen+1);
  348. file.Read(lpTemp,nLen);//读取文件内容
  349. lpTemp[nLen] = _T('');
  350. m_strSource.ReleaseBuffer() ;
  351. UpdateData(FALSE);//显示在界面中
  352. }
  353. }
  354. //********************************************************************
  355. // 函 数 名: AddNatureString
  356. // 作    者: lili
  357. // 日    期:   2005.4.20
  358. // 功能描述: 根据词性标识标注词性
  359. // 参数说明: strWord [IN/OUT] 一个分词结果串
  360. // dwPos [IN] 词性标识
  361. // 返 回 值:
  362. // 负面影响: 无   
  363. // 备    忘:
  364. // 已知限制: 无
  365. // 错 误 号: 无
  366. // 更新纪录:
  367. //  日    期        姓   名                    描述
  368. // ===========     =========  ========================================
  369. //********************************************************************
  370. void CTestSegExDlg::AddNatureString(CString &strWord, DWORD dwPos)
  371. {
  372. if((dwPos & NATURE_D_A) == NATURE_D_A)
  373. {
  374. strWord += _T("/a");//形容词
  375. }
  376. else if((dwPos & NATURE_D_B) == NATURE_D_B)
  377. {
  378. strWord += _T("/b");//区别词
  379. }
  380. else if((dwPos & NATURE_D_C) == NATURE_D_C)
  381. {
  382. strWord += _T("/c");//连词
  383. }
  384. else if((dwPos & NATURE_D_D) == NATURE_D_D)
  385. {
  386. strWord += _T("/d");//副词
  387. }
  388. else if((dwPos & NATURE_D_E) == NATURE_D_E)
  389. {
  390. strWord += _T("/e");//叹词
  391. }
  392. else if((dwPos & NATURE_D_F) == NATURE_D_F)
  393. {
  394. strWord += _T("/f");//方位词
  395. }
  396. else if((dwPos & NATURE_D_I) == NATURE_D_I)
  397. {
  398. strWord += _T("/i");//成语
  399. }
  400. else if((dwPos & NATURE_D_L) == NATURE_D_L)
  401. {
  402. strWord += _T("/l");//习语
  403. }
  404. else if((dwPos & NATURE_A_M) == NATURE_A_M)
  405. {
  406. strWord += _T("/m");//数词
  407. }
  408. else if((dwPos & NATURE_D_MQ) == NATURE_D_MQ)
  409. {
  410. strWord += _T("/mq");//数量词
  411. }
  412. else if((dwPos & NATURE_D_N) == NATURE_D_N)
  413. {
  414. strWord += _T("/n");//名词
  415. }
  416. else if((dwPos & NATURE_D_O) == NATURE_D_O)
  417. {
  418. strWord += _T("/o");//拟声词
  419. }
  420. else if((dwPos & NATURE_D_P) == NATURE_D_P)
  421. {
  422. strWord += _T("/p");//介词
  423. }
  424. else if((dwPos & NATURE_A_Q) == NATURE_A_Q)
  425. {
  426. strWord += _T("/q");//量词
  427. }
  428. else if((dwPos & NATURE_D_R) == NATURE_D_R)
  429. {
  430. strWord += _T("/r");//代词
  431. }
  432. else if((dwPos & NATURE_D_S) == NATURE_D_S)
  433. {
  434. strWord += _T("/s");//处所词
  435. }
  436. else if((dwPos & NATURE_D_T) == NATURE_D_T)
  437. {
  438. strWord += _T("/t");//时间词
  439. }
  440. else if((dwPos & NATURE_D_U) == NATURE_D_U)
  441. {
  442. strWord += _T("/u");//助词
  443. }
  444. else if((dwPos & NATURE_D_V) == NATURE_D_V)
  445. {
  446. strWord += _T("/v");//动词
  447. }
  448. else if((dwPos & NATURE_D_W) == NATURE_D_W)
  449. {
  450. strWord += _T("/w");//标点符号
  451. }
  452. else if((dwPos & NATURE_D_X) == NATURE_D_X)
  453. {
  454. strWord += _T("/x");//非语素字
  455. }
  456. else if((dwPos & NATURE_D_Y) == NATURE_D_Y)
  457. {
  458. strWord += _T("/y");//语气词
  459. }
  460. else if((dwPos & NATURE_D_Z) == NATURE_D_Z)
  461. {
  462. strWord += _T("/z");//状态词
  463. }
  464. else if((dwPos & NATURE_A_NR) == NATURE_A_NR)
  465. {
  466. strWord += _T("/nr");//人名
  467. }
  468. else if((dwPos & NATURE_A_NS) == NATURE_A_NS)
  469. {
  470. strWord += _T("/ns");//地名
  471. }
  472. else if((dwPos & NATURE_A_NT) == NATURE_A_NT)
  473. {
  474. strWord += _T("/nt");//机构团体
  475. }
  476. else if((dwPos & NATURE_A_NX) == NATURE_A_NX)
  477. {
  478. strWord += _T("/nx");//外文字符
  479. }
  480. else if((dwPos & NATURE_A_NZ) == NATURE_A_NZ)
  481. {
  482. strWord += _T("/nz");//其他专名
  483. }
  484. else if((dwPos & NATURE_D_H) == NATURE_D_H)
  485. {
  486. strWord += _T("/h");//前接成分
  487. }
  488. else if((dwPos & NATURE_D_K) == NATURE_D_K)
  489. {
  490. strWord += _T("/k");//后接成分
  491. }
  492. else
  493. {
  494. strWord += _T("/?");//未知词性
  495. }
  496. }
  497. //********************************************************************
  498. // 函 数 名: OnBtnMtest
  499. // 作    者: lili
  500. // 日    期:   2005.4.20
  501. // 功能描述: 批量处理
  502. // 参数说明:
  503. // 返 回 值:
  504. // 负面影响: 无   
  505. // 备    忘:
  506. // 已知限制: 无
  507. // 错 误 号: 无
  508. // 更新纪录:
  509. //  日    期        姓   名                    描述
  510. // ===========     =========  ========================================
  511. //********************************************************************
  512. void CTestSegExDlg::OnBtnMtest() 
  513. {
  514. // TODO: Add your control notification handler code here
  515. UpdateData();
  516. m_bstop = false ;
  517. m_bPause = FALSE ;
  518. int nFileCnt = 0 , nSplitCnt = 0 , nAllLen = 0 ;
  519. DWORD dwTime = 0 ;//耗时
  520. //选择目录
  521. CDirDialog cdlg ;
  522. CString strPath;
  523. if(cdlg.DoBrowse(this))
  524. {
  525. strPath = cdlg.m_strSelDir ;//目录路径
  526. }
  527. //遍历目录,获得目录下的txt文件
  528. CStringArray csaFileName ;
  529. csaFileName.RemoveAll();
  530. GetFileName((LPCTSTR)strPath,csaFileName);
  531. nFileCnt = csaFileName.GetSize();
  532. /////设置进度对话框
  533. CWaitDlgmy dlgWait;
  534. dlgWait.Create(IDD_DIALOG_WAIT, this);
  535. dlgWait.CenterWindow(this);
  536. dlgWait.ShowWindow(SW_SHOW);
  537. dlgWait.SetRange(1, nFileCnt);
  538. //对每个txt文件 进行分词
  539. for(int i = 0 ; i < nFileCnt &&!m_bstop ; i++)
  540. {
  541. TreatMessageLoop();
  542. dlgWait.SetPos(i);//设置进度条
  543. CString strText ;
  544. CString strFileName = csaFileName.GetAt(i);//获得文件名称
  545. //打开文件读取文件内容
  546. CFile cSplitFile ;
  547. if(!cSplitFile.Open(strFileName,CFile::shareDenyWrite))//打开文件
  548. continue ;
  549. int nFileLen = cSplitFile.GetLength();//获得文件长度
  550. LPTSTR lpText = strText.GetBuffer(nFileLen+1) ;
  551. cSplitFile.Read(lpText,nFileLen) ;//读取文件内容
  552. lpText[nFileLen] = _T('') ;
  553. strText.ReleaseBuffer();
  554. cSplitFile.Close() ;//关闭文件
  555. //进行分词
  556. HANDLE hHandle = HLOpenSplit();//打开分词句柄
  557. if(hHandle == INVALID_HANDLE_VALUE)
  558. {
  559. AfxMessageBox("打开分词句柄失败!");
  560. continue ;
  561. }
  562. DWORD dwStart = GetTickCount();
  563. bool bOK = HLSplitWord(hHandle,strText,0);//分词
  564. DWORD dwEnd = GetTickCount();
  565. dwTime +=(dwEnd-dwStart);
  566. if(bOK)
  567. {//分词成功
  568. nAllLen += nFileLen ;
  569. CString strResult ;//存放分词结果
  570. int nSplitWordCnt = HLGetWordCnt(hHandle);//获得分词结果个数
  571. for(int j = 0 ; j < nSplitWordCnt ; j++)
  572. {//获得分词结果
  573. SHLSegWord* pWord = HLGetWordAt(hHandle,j) ;
  574. strResult += pWord->s_szWord ;
  575. strResult += _T(' ');//以空格分割分词结果
  576. }//for j
  577. nSplitCnt++ ;
  578. }
  579. HLCloseSplit(hHandle);//关闭分词句柄
  580. while(m_bPause && !m_bstop)
  581. {
  582. Sleep(5);//暂停
  583. TreatMessageLoop();
  584. }
  585. }//for i
  586. dlgWait.DestroyWindow();
  587. CString strMsg ;
  588. float fPer = ((float)nAllLen/(float)1024)/(float)(dwTime/1000) ;
  589. strMsg.Format("处理完成,共有%d篇,成功处理%d篇,文章长度%d字节,耗时%dms!效率:%fKB/s!",nFileCnt,nSplitCnt,nAllLen,dwTime,fPer);
  590. AfxMessageBox((LPCTSTR)strMsg);
  591. }
  592. //********************************************************************
  593. // 函 数 名: OnClose
  594. // 作    者: lili
  595. // 日    期:   2005.4.20
  596. // 功能描述: 退出程序
  597. // 参数说明:
  598. // 返 回 值:
  599. // 负面影响: 无   
  600. // 备    忘:
  601. // 已知限制: 无
  602. // 错 误 号: 无
  603. // 更新纪录:
  604. //  日    期        姓   名                    描述
  605. // ===========     =========  ========================================
  606. //********************************************************************
  607. void CTestSegExDlg::OnClose() 
  608. {
  609. // TODO: Add your message handler code here and/or call default
  610. HLFreeSplit();//卸载分词系统
  611. CDialog::OnClose();
  612. }
  613. //********************************************************************
  614. // 函 数 名: OnBtnAbout
  615. // 作    者: lili
  616. // 日    期:   2005.4.20
  617. // 功能描述: 显示About对话框
  618. // 参数说明:
  619. // 返 回 值:
  620. // 负面影响: 无   
  621. // 备    忘:
  622. // 已知限制: 无
  623. // 错 误 号: 无
  624. // 更新纪录:
  625. //  日    期        姓   名                    描述
  626. // ===========     =========  ========================================
  627. //********************************************************************
  628. void CTestSegExDlg::OnBtnAbout() 
  629. {
  630. // TODO: Add your control notification handler code here
  631. CAboutDlg cAbout ;
  632. cAbout.DoModal();
  633. }
  634. //********************************************************************
  635. // 函 数 名: GetFileName
  636. // 作    者: lili
  637. // 日    期:   2005.4.20
  638. // 功能描述: 遍历目录,获得目录下的txt文件名
  639. // 参数说明: lpPath [IN] 目录名称
  640. // csaFileName [OUT] 目录下的文件名数组
  641. // 返 回 值:
  642. // 负面影响: 无   
  643. // 备    忘:
  644. // 已知限制: 无
  645. // 错 误 号: 无
  646. // 更新纪录:
  647. //  日    期        姓   名                    描述
  648. // ===========     =========  ========================================
  649. //********************************************************************
  650. void CTestSegExDlg::GetFileName(LPCTSTR lpPath , CStringArray& csaFileName)
  651. {
  652. CStringArray astrPath  ;
  653. CString strDir(lpPath);
  654. if(strDir.IsEmpty())
  655. return ;
  656. astrPath.Add(lpPath);
  657. strDir += _T("*.*");
  658. CFileFind cFind;
  659. bool bFindDir = false;
  660. BOOL bFindNext = cFind.FindFile(strDir);
  661. while(bFindNext)
  662. {
  663. bFindNext = cFind.FindNextFile();
  664. if(!cFind.IsDots())
  665. {
  666. CString strTmp = cFind.GetFilePath();
  667. if(cFind.IsDirectory())
  668. {//是目录
  669. if(!bFindDir)
  670. {
  671. astrPath.Add(strTmp);
  672. }
  673. else
  674. {
  675. csaFileName.Add(cFind.GetFileTitle());
  676. }
  677. }
  678. else if(strTmp.Right(strlen(".txt")).CompareNoCase(".txt") == 0)
  679. {//是txt文件
  680. csaFileName.Add(strTmp);
  681. }
  682. }
  683. if(!bFindNext)
  684. {
  685. if(bFindDir)
  686. break;
  687. int iUpBound = astrPath.GetUpperBound();
  688. if(iUpBound == 0)
  689. break;
  690. cFind.Close();
  691. CString strTmpDir = astrPath.GetAt(iUpBound);
  692. astrPath.RemoveAt(iUpBound);
  693. if(strTmpDir.Right(1) != _T('\'))
  694. strTmpDir += _T('\');
  695. strTmpDir += _T("*.*");
  696. bFindNext = cFind.FindFile(strTmpDir);
  697. }
  698. }
  699. cFind.Close();
  700. }
  701. //********************************************************************
  702. // 函 数 名: SetStopFlag
  703. // 作    者: lili
  704. // 日    期:   2005.4.20
  705. // 功能描述: 设置停止标识
  706. // 参数说明: 无
  707. // 返 回 值:
  708. // 负面影响: 无   
  709. // 备    忘:
  710. // 已知限制: 无
  711. // 错 误 号: 无
  712. // 更新纪录:
  713. //  日    期        姓   名                    描述
  714. // ===========     =========  ========================================
  715. //********************************************************************
  716. void CTestSegExDlg::SetStopFlag()
  717. {
  718. m_bstop = true ;
  719. }
  720. //********************************************************************
  721. // 函 数 名: SetPauseFlag
  722. // 作    者: lili
  723. // 日    期:   2005.4.20
  724. // 功能描述: 设置暂停标识
  725. // 参数说明: 无
  726. // 返 回 值:
  727. // 负面影响: 无   
  728. // 备    忘:
  729. // 已知限制: 无
  730. // 错 误 号: 无
  731. // 更新纪录:
  732. //  日    期        姓   名                    描述
  733. // ===========     =========  ========================================
  734. //********************************************************************
  735. void CTestSegExDlg::SetPauseFlag(BOOL bPause)
  736. {
  737. m_bPause = bPause ;
  738. }
  739. //********************************************************************
  740. // 函 数 名: TreatMessageLoop
  741. // 作    者: lili
  742. // 日    期:   2005.4.20
  743. // 功能描述: 消息循环函数
  744. // 参数说明: 无
  745. // 返 回 值:
  746. // 负面影响: 无   
  747. // 备    忘:
  748. // 已知限制: 无
  749. // 错 误 号: 无
  750. // 更新纪录:
  751. //  日    期        姓   名                    描述
  752. // ===========     =========  ========================================
  753. //********************************************************************
  754. void CTestSegExDlg::TreatMessageLoop()
  755. {
  756. MSG msg;
  757. while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  758. {
  759. TranslateMessage(&msg);
  760. DispatchMessage(&msg);
  761. }
  762. }
  763. void CTestSegExDlg::OnStaticPic() 
  764. {
  765. // TODO: Add your control notification handler code here
  766. ShellExecute(this->m_hWnd,"open","http://www.hylanda.com/center/introduction.htm","","",SW_SHOW);
  767. }
  768. //********************************************************************
  769. // 函 数 名: OnBtnOpenUdict
  770. // 作    者: lili
  771. // 日    期:   2005.4.20
  772. // 功能描述: 装载用户词典
  773. // 参数说明: 无
  774. // 返 回 值:
  775. // 负面影响: 无   
  776. // 备    忘:
  777. // 已知限制: 无
  778. // 错 误 号: 无
  779. // 更新纪录:
  780. //  日    期        姓   名                    描述
  781. // ===========     =========  ========================================
  782. //********************************************************************
  783. void CTestSegExDlg::OnBtnOpenUdict() 
  784. {
  785. // TODO: Add your control notification handler code here
  786. UpdateData(TRUE);
  787. CFileDialog cdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"文本文件(*.txt)|*.txt|All File(*.*)|*.*||",this);
  788. if(cdlg.DoModal()==IDOK)
  789. {
  790. CFile file ;
  791. CString strFile = cdlg.GetFileName();//获得选择的文件名
  792. bool bOK = HLOpenUsrDict((LPCTSTR)strFile);//装载用户词典
  793. if(bOK)
  794. AfxMessageBox("装载用户词典成功!");
  795. else
  796. AfxMessageBox("装载用户词典失败!");
  797. }
  798. }
  799. //********************************************************************
  800. // 函 数 名: OnBtnCloseudict
  801. // 作    者: lili
  802. // 日    期:   2005.4.20
  803. // 功能描述: 卸载用户词典
  804. // 参数说明: 无
  805. // 返 回 值:
  806. // 负面影响: 无   
  807. // 备    忘:
  808. // 已知限制: 无
  809. // 错 误 号: 无
  810. // 更新纪录:
  811. //  日    期        姓   名                    描述
  812. // ===========     =========  ========================================
  813. //********************************************************************
  814. void CTestSegExDlg::OnBtnCloseudict() 
  815. {
  816. // TODO: Add your control notification handler code here
  817. UpdateData(TRUE);
  818. HLFreeUsrDict();
  819. AfxMessageBox("卸载成功!");
  820. }
  821. void CAboutDlg::OnStaticAboutpic() 
  822. {
  823. // TODO: Add your control notification handler code here
  824. ShellExecute(this->m_hWnd,"open","http://www.hylanda.com/center/introduction.htm","","",SW_SHOW);
  825. }