`

语音识别的大规模汉语树形词典,搜索速度快如闪电

 
阅读更多
  1. #include"stdafx.h"
  2. #include"YuyinTree.h"
  3. #include"YuyinTreeDlg.h"
  4. #ifdef_DEBUG
  5. #definenewDEBUG_NEW
  6. #undefTHIS_FILE
  7. staticcharTHIS_FILE[]=__FILE__;
  8. #endif
  9. /////////////////////////////////////////////////////////////////////////////
  10. //CAboutDlgdialogusedforAppAbout
  11. CStoredPinyin*m_storedPinyin[30000];
  12. CWordTree*curTree=newCWordTree;//指向词语树指针
  13. CStringMaxLenghci='/'';//存储该单词包括的最大子词
  14. CStringTempci;//临时词
  15. intStoredNum=0;//已存入查询数组中拼音个数
  16. classCAboutDlg:publicCDialog
  17. {
  18. public:
  19. CAboutDlg();
  20. //DialogData
  21. //{{AFX_DATA(CAboutDlg)
  22. enum{IDD=IDD_ABOUTBOX};
  23. //}}AFX_DATA
  24. //ClassWizardgeneratedvirtualfunctionoverrides
  25. //{{AFX_VIRTUAL(CAboutDlg)
  26. protected:
  27. virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
  28. //}}AFX_VIRTUAL
  29. //Implementation
  30. protected:
  31. //{{AFX_MSG(CAboutDlg)
  32. //}}AFX_MSG
  33. DECLARE_MESSAGE_MAP()
  34. };
  35. CAboutDlg::CAboutDlg():CDialog(CAboutDlg::IDD)
  36. {
  37. //{{AFX_DATA_INIT(CAboutDlg)
  38. //}}AFX_DATA_INIT
  39. }
  40. voidCAboutDlg::DoDataExchange(CDataExchange*pDX)
  41. {
  42. CDialog::DoDataExchange(pDX);
  43. //{{AFX_DATA_MAP(CAboutDlg)
  44. //}}AFX_DATA_MAP
  45. }
  46. BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
  47. //{{AFX_MSG_MAP(CAboutDlg)
  48. //Nomessagehandlers
  49. //}}AFX_MSG_MAP
  50. END_MESSAGE_MAP()
  51. /////////////////////////////////////////////////////////////////////////////
  52. //CYuyinTreeDlgdialog
  53. CYuyinTreeDlg::CYuyinTreeDlg(CWnd*pParent/*=NULL*/)
  54. :CDialog(CYuyinTreeDlg::IDD,pParent)
  55. {
  56. //{{AFX_DATA_INIT(CYuyinTreeDlg)
  57. m_inputTongyin=_T("");
  58. //}}AFX_DATA_INIT
  59. //NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
  60. m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  61. }
  62. voidCYuyinTreeDlg::DoDataExchange(CDataExchange*pDX)
  63. {
  64. CDialog::DoDataExchange(pDX);
  65. //{{AFX_DATA_MAP(CYuyinTreeDlg)
  66. DDX_Text(pDX,IDC_PINYIN_EQUAL,m_inputTongyin);
  67. //}}AFX_DATA_MAP
  68. }
  69. BEGIN_MESSAGE_MAP(CYuyinTreeDlg,CDialog)
  70. //{{AFX_MSG_MAP(CYuyinTreeDlg)
  71. ON_WM_SYSCOMMAND()
  72. ON_WM_PAINT()
  73. ON_WM_QUERYDRAGICON()
  74. ON_BN_CLICKED(IDC_BTN_READFILE,OnBtnReadfile)
  75. ON_BN_CLICKED(IDC_BTN_TEST_PANDCHI,OnBtnTestPandchi)
  76. ON_BN_CLICKED(IDC_BTN_TEST_TONGYINCI,OnBtnTestTongyinci)
  77. ON_BN_CLICKED(IDC_YUYIN_QUERY,OnTongyinQuery)
  78. ON_NOTIFY(TVN_SELCHANGED,IDC_YUYIN_TREE,OnSelchangedYuyinTree)
  79. //}}AFX_MSG_MAP
  80. END_MESSAGE_MAP()
  81. /////////////////////////////////////////////////////////////////////////////
  82. //CYuyinTreeDlgmessagehandlers
  83. BOOLCYuyinTreeDlg::OnInitDialog()
  84. {
  85. CDialog::OnInitDialog();
  86. //Add"About..."menuitemtosystemmenu.
  87. //IDM_ABOUTBOXmustbeinthesystemcommandrange.
  88. ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
  89. ASSERT(IDM_ABOUTBOX<0xF000);
  90. CMenu*pSysMenu=GetSystemMenu(FALSE);
  91. if(pSysMenu!=NULL)
  92. {
  93. CStringstrAboutMenu;
  94. strAboutMenu.LoadString(IDS_ABOUTBOX);
  95. if(!strAboutMenu.IsEmpty())
  96. {
  97. pSysMenu->AppendMenu(MF_SEPARATOR);
  98. pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
  99. }
  100. }
  101. //Settheiconforthisdialog.Theframeworkdoesthisautomatically
  102. //whentheapplication'smainwindowisnotadialog
  103. SetIcon(m_hIcon,TRUE);//Setbigicon
  104. SetIcon(m_hIcon,FALSE);//Setsmallicon
  105. //TODO:Addextrainitializationhere
  106. //程序添加的代码:
  107. //初始化已读单词数组
  108. for(inti=0;i<30000;i++)
  109. {
  110. m_storedPinyin[i]=NULL;
  111. }
  112. FILE*InputFile=NULL;//读取文件指针
  113. CTreeNode*CurNode=NULL;//当前节点
  114. CTreeNode*FatherNode=NULL;//当前节点的父节点
  115. TCHARNodeItem[100];//节点的全部数据
  116. TCHARNodePinyin[51];//节点的拼音
  117. TCHARNodeHanzi[50];//节点汉字
  118. intZiMuNum,j,k;
  119. intWordNum=0;//统计词的数目
  120. BOOLIsFirst=TRUE;//标志是否是根节点的第一个孩子节点
  121. CTreeNode*TempfatherNode=NULL;//临时父节点
  122. CTreeNode*TempfatherNode1=NULL;//临时父节点
  123. InputFile=fopen("LexiconTree.txt","r");
  124. while(!feof(InputFile))
  125. {
  126. WordNum++;
  127. fscanf(InputFile,"%s",NodeItem);
  128. ZiMuNum=0;//ZiMuNum为读取字母个数
  129. while(NodeItem[ZiMuNum]!=',')//读取汉字
  130. {
  131. NodeHanzi[ZiMuNum]=NodeItem[ZiMuNum];
  132. ZiMuNum++;
  133. }
  134. NodeHanzi[ZiMuNum]='/0';//此时NodeHanzi存储了汉字
  135. ZiMuNum++;
  136. while(NodeItem[ZiMuNum]!=',')//读取词号
  137. {
  138. ZiMuNum++;
  139. }
  140. ZiMuNum++;
  141. j=ZiMuNum;
  142. k=0;
  143. while(NodeItem[j]!='/0')//读拼音
  144. {
  145. NodePinyin[k]=NodeItem[j];
  146. k++;
  147. j++;
  148. }
  149. NodePinyin[k-1]='/0';//此时NodePinyin存储了拼音
  150. CStringTempString;//暂时存储拼音
  151. TempString=NodePinyin;
  152. CurNode=newCTreeNode;
  153. CurNode->m_Pinyin=TempString;
  154. CurNode->m_Word=NodeHanzi;
  155. CurNode->m_pParent=NULL;
  156. CurNode->m_pchild=NULL;
  157. CurNode->m_pneighbour=NULL;
  158. CurNode->m_pchar=NULL;
  159. CurNode->m_CurNum=0;
  160. BOOLFviewed=FALSE;//是否查到的标志,默认为没查到
  161. BOOLFParent=FALSE;//接点是否有父节点的标志,如a,;a,ba,;a,ba,hao,
  162. BOOLFEqual=FALSE;//相同发音词标志,如a,啊,阿,呵
  163. for(inttemp=0;temp<30000;temp++)//temp为迭代次数,先检查看看是否已经插入了词
  164. {
  165. if(m_storedPinyin[temp]!=NULL)//看当前查看的数据项是否有值,若有进入循环,否则跳过
  166. {
  167. intt=-1;
  168. t=TempString.Find(m_storedPinyin[temp]->m_StoredPinyin);//find的意思是找到整个匹配串
  169. if(t>=0)//若有重叠项,进入语句,插数据项
  170. {
  171. if(TempString==m_storedPinyin[temp]->m_StoredPinyin)//若两者拼音完全相同,把汉字插入树节点项的相似字数组中
  172. {
  173. Fviewed=TRUE;//查到
  174. FEqual=TRUE;//相同词标记TRUE
  175. intTempCurNum=(m_storedPinyin[temp]->m_pcurPosition)->m_CurNum;
  176. CTongyinci*temp1=newCTongyinci;
  177. temp1->next=NULL;
  178. temp1->m_data=newchar[50];
  179. strcpy(temp1->m_data,NodeHanzi);
  180. CTongyinci*temp2=(m_storedPinyin[temp]->m_pcurPosition)->m_pchar;
  181. CTongyinci*pre;
  182. while(temp2!=NULL)
  183. {
  184. pre=temp2;
  185. temp2=temp2->next;
  186. }
  187. pre->next=temp1;
  188. (m_storedPinyin[temp]->m_pcurPosition)->m_CurNum=(m_storedPinyin[temp]->m_pcurPosition)->m_CurNum+1;
  189. break;
  190. }
  191. elseif(t==0)//否则,插入树节点项的子节点中,必需保证从第一个字对齐并且在待检查接点中重叠部分后一位为",",检查
  192. {//比如a和an不能是父子节点关系;la和a不能是父子节点关系
  193. Tempci=m_storedPinyin[temp]->m_StoredPinyin;
  194. intStrsize=Tempci.GetLength();//问题
  195. if(TempString.GetAt(Strsize)==',')//若满足重叠部分后一位为","
  196. {
  197. FParent=TRUE;//有父亲节点
  198. if(Strsize>=MaxLenghci.GetLength())
  199. {
  200. MaxLenghci=Tempci;//注意
  201. TempfatherNode1=m_storedPinyin[temp]->m_pcurPosition;//注意
  202. }
  203. Fviewed=TRUE;//查到
  204. }
  205. }
  206. }
  207. }
  208. else
  209. continue;
  210. }
  211. if(FParent&&!FEqual)
  212. {
  213. CurNode->m_CurNum++;//当前同音字数加1
  214. /*char**pTempChar=newchar*[50];//开辟一个而维数组,临时值向同音字的指针
  215. for(intl=0;l<50;l++)
  216. {
  217. pTempChar[l]=newchar[50];
  218. pTempChar[l][0]='/0';
  219. }
  220. */
  221. CTongyinci*temp=newCTongyinci;
  222. temp->next=NULL;
  223. temp->m_data=newchar[50];
  224. strcpy(temp->m_data,NodeHanzi);
  225. CurNode->m_pchar=temp;
  226. curTree->InsertNode(&CurNode,&TempfatherNode1);//在查到的节点处插入子节点
  227. CStoredPinyin*TempStorPinyin1=newCStoredPinyin;//创建临时待查询对象
  228. TempStorPinyin1->m_pcurPosition=CurNode;
  229. TempStorPinyin1->m_StoredPinyin=TempString;
  230. TempStorPinyin1->m_pchar=temp;
  231. m_storedPinyin[StoredNum++]=TempStorPinyin1;//将产生节点存放已访问数组中
  232. }
  233. MaxLenghci='/0';//恢复用到的两个变量到初值
  234. TempfatherNode1=NULL;
  235. if(!Fviewed)//如果在已存词表中找不到该词则在根节点插入新词,并存放在已访问数组中
  236. {
  237. if(IsFirst==TRUE)
  238. {
  239. TempfatherNode=curTree->m_Root;
  240. }
  241. CurNode->m_CurNum++;//当前同音字数加1
  242. /*char**pTempChar=newchar*[50];//开辟一个而维数组,临时值向同音字的指针,存100个词
  243. for(intl=0;l<50;l++)
  244. {
  245. pTempChar[l]=newchar[10];
  246. pTempChar[l][0]='/0';
  247. }
  248. CurNode->m_pchar=pTempChar;
  249. strcpy(CurNode->m_pchar[0],NodeHanzi);*/
  250. CTongyinci*temp=newCTongyinci;
  251. temp->next=NULL;
  252. temp->m_data=newchar[50];
  253. strcpy(temp->m_data,NodeHanzi);
  254. CurNode->m_pchar=temp;
  255. TempfatherNode=curTree->InsertFirstNode(&CurNode,&TempfatherNode);//在根节点插入新词
  256. IsFirst=FALSE;//以后插入的点全不是第一个节点
  257. CStoredPinyin*TempStorPinyin;//创建临时待查询对象
  258. TempStorPinyin=newCStoredPinyin;
  259. TempStorPinyin->m_pcurPosition=CurNode;
  260. TempStorPinyin->m_StoredPinyin=NodePinyin;
  261. TempStorPinyin->m_pchar=temp;
  262. //排错flagpass10月21号
  263. m_storedPinyin[StoredNum]=TempStorPinyin;//将产生节点存放已访问数组中
  264. StoredNum++;
  265. }
  266. }
  267. charbuffer[50];
  268. sprintf(buffer,"已读取单词:%d",WordNum);
  269. AfxMessageBox(buffer);
  270. BrowseYuyin();
  271. returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
  272. }
  273. voidCYuyinTreeDlg::OnSysCommand(UINTnID,LPARAMlParam)
  274. {
  275. if((nID&0xFFF0)==IDM_ABOUTBOX)
  276. {
  277. CAboutDlgdlgAbout;
  278. dlgAbout.DoModal();
  279. }
  280. else
  281. {
  282. CDialog::OnSysCommand(nID,lParam);
  283. }
  284. }
  285. //Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
  286. //todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
  287. //thisisautomaticallydoneforyoubytheframework.
  288. voidCYuyinTreeDlg::OnPaint()
  289. {
  290. if(IsIconic())
  291. {
  292. CPaintDCdc(this);//devicecontextforpainting
  293. SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
  294. //Centericoninclientrectangle
  295. intcxIcon=GetSystemMetrics(SM_CXICON);
  296. intcyIcon=GetSystemMetrics(SM_CYICON);
  297. CRectrect;
  298. GetClientRect(&rect);
  299. intx=(rect.Width()-cxIcon+1)/2;
  300. inty=(rect.Height()-cyIcon+1)/2;
  301. //Drawtheicon
  302. dc.DrawIcon(x,y,m_hIcon);
  303. }
  304. else
  305. {
  306. CDialog::OnPaint();
  307. }
  308. }
  309. //Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags
  310. //theminimizedwindow.
  311. HCURSORCYuyinTreeDlg::OnQueryDragIcon()
  312. {
  313. return(HCURSOR)m_hIcon;
  314. }
  315. //添加的主要代码
  316. voidCYuyinTreeDlg::OnBtnReadfile()//测试树第一层节点
  317. {
  318. //检验第一层节点插入是否正确,结果正确
  319. CTreeNode*root=curTree->m_Root;
  320. CTreeNode*Temp=root->m_pchild;
  321. while(Temp!=NULL)
  322. {
  323. AfxMessageBox(Temp->m_Pinyin);
  324. Temp=Temp->m_pneighbour;
  325. }
  326. }
  327. CWordTree::CWordTree()//树的初始化
  328. {
  329. m_Root=newCTreeNode;
  330. m_Root->m_Pinyin="";
  331. m_Root->m_pParent=NULL;
  332. m_Root->m_pchild=NULL;
  333. m_Root->m_pneighbour=NULL;
  334. m_Root->m_CurNum=0;
  335. m_Root->m_Word="";
  336. m_Root->m_pchar=NULL;
  337. }
  338. voidCWordTree::CreateTree()
  339. {
  340. }
  341. CTreeNode*CWordTree::InsertFirstNode(CTreeNode**newNode,CTreeNode**parent)//插入第一层节点
  342. {
  343. CTreeNode*WilladNode=*newNode;
  344. CTreeNode*FatherNode=*parent;
  345. if(FatherNode==curTree->m_Root)
  346. {
  347. FatherNode->m_pchild=WilladNode;
  348. WilladNode->m_pParent=curTree->m_Root;
  349. }
  350. else
  351. {
  352. FatherNode->m_pneighbour=WilladNode;
  353. WilladNode->m_pParent=curTree->m_Root;
  354. }
  355. returnWilladNode;
  356. }
  357. voidCWordTree::InsertNode(CTreeNode**newNode,CTreeNode**parent)//插入某层节点的孩子节点
  358. {
  359. CTreeNode*WilladNode=*newNode;
  360. CTreeNode*FatherNode=*parent;
  361. CTreeNode*Temp=NULL;
  362. if(FatherNode->m_pchild==NULL)
  363. {
  364. FatherNode->m_pchild=WilladNode;
  365. WilladNode->m_pParent=FatherNode;
  366. }
  367. else
  368. {
  369. Temp=FatherNode->m_pchild;
  370. while(Temp->m_pneighbour!=NULL)
  371. {
  372. Temp=Temp->m_pneighbour;
  373. }
  374. Temp->m_pneighbour=WilladNode;
  375. WilladNode->m_pParent=FatherNode;
  376. }
  377. }
  378. voidCYuyinTreeDlg::OnBtnTestPandchi()//测试树的相邻层接点
  379. {
  380. CTreeNode*root=curTree->m_Root;
  381. CTreeNode*Temp=root->m_pchild;
  382. AfxMessageBox(Temp->m_Pinyin);
  383. Temp=Temp->m_pchild;
  384. while(Temp!=NULL)
  385. {
  386. AfxMessageBox(Temp->m_Pinyin);
  387. Temp=Temp->m_pneighbour;
  388. }
  389. }
  390. voidCYuyinTreeDlg::OnBtnTestTongyinci()//测试发音为'a'的同音词
  391. {
  392. CTreeNode*NodeA=curTree->m_Root->m_pchild;
  393. CTongyinci*temp=NodeA->m_pchar;
  394. while(temp!=NULL)
  395. {
  396. AfxMessageBox(temp->m_data);
  397. temp=temp->next;
  398. }
  399. }
  400. voidCYuyinTreeDlg::BrowseYuyin()//遍历4层语音树
  401. {
  402. CTreeCtrl*pCtrl=(CTreeCtrl*)GetDlgItem(IDC_YUYIN_TREE);
  403. ASSERT(pCtrl!=NULL);
  404. TVINSERTSTRUCTtvInsert;
  405. tvInsert.hParent=NULL;
  406. tvInsert.hInsertAfter=NULL;
  407. tvInsert.item.mask=TVIF_TEXT;
  408. tvInsert.item.pszText=_T("词拼音");
  409. HTREEITEMhRoot=pCtrl->InsertItem(&tvInsert);
  410. CTreeNode*root=curTree->m_Root;
  411. CTreeNode*Temp=root->m_pchild;
  412. HTREEITEMhPA=NULL;
  413. HTREEITEMhPB=NULL;
  414. HTREEITEMhPC=NULL;
  415. while(Temp!=NULL)
  416. {
  417. hPA=pCtrl->InsertItem(TVIF_TEXT,
  418. _T(Temp->m_Pinyin),0,0,0,0,0,hRoot,NULL);
  419. CTreeNode*TempNode1=Temp->m_pchild;
  420. while(TempNode1!=NULL)
  421. {
  422. hPB=pCtrl->InsertItem(TVIF_TEXT,
  423. _T(TempNode1->m_Pinyin),0,0,0,0,0,hPA,NULL);
  424. CTreeNode*TempNode2=TempNode1->m_pchild;
  425. while(TempNode2!=NULL)
  426. {
  427. hPC=pCtrl->InsertItem(TVIF_TEXT,
  428. _T(TempNode2->m_Pinyin),0,0,0,0,0,hPB,NULL);
  429. CTreeNode*TempNode3=TempNode2->m_pchild;
  430. while(TempNode3!=NULL)
  431. {
  432. pCtrl->InsertItem(TVIF_TEXT,
  433. _T(TempNode3->m_Pinyin),0,0,0,0,0,hPC,NULL);
  434. TempNode3=TempNode3->m_pneighbour;
  435. }
  436. TempNode2=TempNode2->m_pneighbour;
  437. }
  438. TempNode1=TempNode1->m_pneighbour;
  439. }
  440. Temp=Temp->m_pneighbour;
  441. }
  442. }
  443. voidCYuyinTreeDlg::OnTongyinQuery()//查询拼音的同音字,放入Combox中
  444. {
  445. //TODO:Addyourcontrolnotificationhandlercodehere
  446. UpdateData(TRUE);
  447. CStringStringWilqury=m_inputTongyin;
  448. CStringTempci;
  449. BOOLFExit=FALSE;//该拼音在树中是否存在标志
  450. intTempNum;
  451. CComboBox*tongyinc=(CComboBox*)GetDlgItem(IDC_PINYIN_RESULT);
  452. ASSERT(tongyinc!=NULL);
  453. tongyinc->ResetContent();
  454. ASSERT(tongyinc->GetCount()==0);
  455. for(inttemp=0;temp<30000;temp++)
  456. {
  457. if(m_storedPinyin[temp]!=NULL&&m_storedPinyin[temp]->m_StoredPinyin==StringWilqury)
  458. {
  459. TempNum=m_storedPinyin[temp]->m_pcurPosition->m_CurNum;
  460. //for(inti=0;i<TEMPNUM;I++)Tempci="m_storedPinyin[temp]-"{>m_pcurPosition->m_pchar[i];
  461. //}
  462. CTongyinci*temp1=m_storedPinyin[temp]->m_pcurPosition->m_pchar;
  463. while(temp1!=NULL)
  464. {
  465. Tempci=temp1->m_data;
  466. temp1=temp1->next;
  467. tongyinc->AddString(Tempci);
  468. }
  469. tongyinc->SetWindowText(m_storedPinyin[temp]->m_pcurPosition->m_pchar->m_data);
  470. FExit=TRUE;
  471. }
  472. }
  473. if(!FExit)
  474. tongyinc->SetWindowText("该拼音在树中不存在!");
  475. }
  476. voidCYuyinTreeDlg::OnSelchangedYuyinTree(NMHDR*pNMHDR,LRESULT*pResult)//当单击鼠标时响应函数
  477. {
  478. NM_TREEVIEW*pNMTreeView=(NM_TREEVIEW*)pNMHDR;
  479. //TODO:Addyourcontrolnotificationhandlercodehere
  480. TV_ITEMitem=pNMTreeView->itemNew;
  481. HTREEITEMhItem=item.hItem;
  482. CTreeCtrl*pCtrl=(CTreeCtrl*)GetDlgItem(IDC_YUYIN_TREE);
  483. ASSERT(pCtrl!=NULL);
  484. CStringTempci=pCtrl->GetItemText(hItem);
  485. if(Tempci=="词拼音")
  486. return;
  487. BOOLFExit=FALSE;//该拼音在树中是否存在标志
  488. intTempNum;
  489. CComboBox*tongyinc=(CComboBox*)GetDlgItem(IDC_PINYIN_RESULT);
  490. ASSERT(tongyinc!=NULL);
  491. tongyinc->ResetContent();
  492. ASSERT(tongyinc->GetCount()==0);
  493. for(inttemp=0;temp<30000;temp++)
  494. {
  495. if(m_storedPinyin[temp]!=NULL&&m_storedPinyin[temp]->m_StoredPinyin==Tempci)
  496. {
  497. TempNum=m_storedPinyin[temp]->m_pcurPosition->m_CurNum;
  498. /*for(inti=0;i<TEMPNUM;I++)Tempci="m_storedPinyin[temp]-"{>m_pcurPosition->m_pchar[i];
  499. tongyinc->AddString(Tempci);
  500. }
  501. */
  502. CTongyinci*temp1=m_storedPinyin[temp]->m_pcurPosition->m_pchar;
  503. while(temp1!=NULL)
  504. {
  505. Tempci=temp1->m_data;
  506. temp1=temp1->next;
  507. tongyinc->AddString(Tempci);
  508. }
  509. tongyinc->SetWindowText(m_storedPinyin[temp]->m_pcurPosition->m_pchar->m_data);
  510. FExit=TRUE;
  511. }
  512. }
  513. if(!FExit)
  514. tongyinc->SetWindowText("该拼音在树中不存在!");
  515. *pResult=0;
  516. }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics