mytool.cpp
上传用户:hyb6888
上传日期:2016-01-24
资源大小:5186k
文件大小:10k
源码类别:

输入法编程

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "windows.h"
  3. #include "stdio.h"
  4. #include "string.h"
  5. #include "time.h"
  6. #include "mytool.h"
  7. #include "formula.h"
  8. #include "../DllManager.h"
  9. extern DllManager ChLib;//定义在主DLL中
  10. mytool::mytool()
  11. {
  12.  strcpy(DaNum, "零壹贰叁肆伍陆柒捌玖");
  13.  strcpy(DaDanwei , "元拾佰仟万拾佰仟亿拾佰仟特拾佰仟吉拾佰仟伯拾佰仟令拾佰仟阿拾佰仟库拾佰仟依拾佰仟斯拾佰仟舌拾佰仟扣拾佰仟磊拾佰仟比拾佰仟吕拾佰仟加拾佰仟须拾佰仟辰拾佰仟奔拾佰仟左拾佰仟马拾佰仟肥拾佰仟夺拾佰仟扔拾佰仟盍拾佰仟厚拾佰仟度拾佰仟磁拾佰仟顺拾佰仟");
  14.  strcpy(DaNumE, "○一二三四五六七八九十");
  15. }
  16. mytool::~mytool()
  17. {
  18.   
  19. }
  20. /////////////////////////////////////////////////////////////
  21. //分析字符串确定串格式
  22. //0表示不正确,1数字型,2日期型,3表达式
  23. int mytool::analysisStr(char *ssp)
  24. {
  25. int i,len,pt=0,ret=0,flage=0;
  26. len=strlen(ssp);
  27. //查看是否有非公式字符
  28. for(i=0;i<len;i++)
  29. {
  30. if('0'<=ssp[i] && ssp[i]<='9')
  31. continue;
  32. if(ssp[i]=='+'||ssp[i]=='-'||ssp[i]=='*'||ssp[i]=='/'||ssp[i]=='^')
  33. continue;
  34. if(ssp[i]=='.'||ssp[i]=='('||ssp[i]==')'||ssp[i]==' ')
  35. continue;
  36. if((ssp[i]==-93 && ssp[i+1]==-85)||(ssp[i]==-93 && ssp[i+1]==-83))
  37. {
  38. i++;
  39. continue;
  40. }
  41. if((ssp[i]==-95 && ssp[i+1]==-63)||(ssp[i]==-95 && ssp[i+1]==-62))
  42. {
  43. i++;
  44. continue;
  45. }
  46. break;
  47. }
  48. if(i==len) //
  49. {
  50. for(i=0;i<len;i++)
  51. {
  52. if('0'<=ssp[i] && ssp[i]<='9')
  53. flage=1;
  54. if('.'==ssp[i])
  55. pt++;
  56. if(ssp[i]=='+'||ssp[i]=='-'||ssp[i]=='*'||ssp[i]=='/'||ssp[i]=='^')
  57. {
  58. ret=3;
  59. break;
  60. }
  61. if((ssp[i]==-93 && ssp[i+1]==-85)||(ssp[i]==-93 && ssp[i+1]==-83))
  62. {
  63. ret=3;
  64. break;
  65. }
  66. if((ssp[i]==-95 && ssp[i+1]==-63)||(ssp[i]==-95 && ssp[i+1]==-62))
  67. {
  68. ret=3;
  69. break;
  70. }
  71. }
  72. if(ret==0)
  73. {
  74. if(pt==2)
  75. ret=2;
  76. if(pt<2 && flage==1)
  77. ret=1;
  78. }
  79. }
  80. // MessageBox (0,ss,0,0);
  81. return ret;
  82. }
  83. mytool::TranDaxieDollor(char *source,char *Daxie)
  84. {
  85. int i,point,len;
  86. char tem[1000]="",tem2[1000]="",ss1[10],ss2[10];
  87. char pss[20]="";
  88. ss1[2]=ss2[2]=0;
  89. //确定小数点
  90. strcpy(pss,"整");
  91. len=strlen(source);
  92. point=len-1;
  93. for(i=0;i<len;i++)
  94. {
  95. if('.'==source[i])
  96. {
  97. point=i;
  98. pss[0]=0;
  99. if(i+1<len)
  100. {
  101. ss1[0]=DaNum[(source[i+1]-0x30)*2];
  102. ss1[1]=DaNum[(source[i+1]-0x30)*2+1];
  103. strcat(ss1,"角");
  104. strcat(pss,ss1);
  105. }
  106. if(i+2<len)
  107. {
  108. ss1[0]=DaNum[(source[i+2]-0x30)*2];
  109. ss1[1]=DaNum[(source[i+2]-0x30)*2+1];
  110. ss1[2]=0;
  111. strcat(ss1,"分");
  112. strcat(pss,ss1);
  113. }
  114. break;
  115. }
  116. }
  117. //
  118. for(i=0;i<point;i++)
  119. {
  120. ss1[0]=DaNum[(source[point-i-1]-0x30)*2];
  121. ss1[1]=DaNum[(source[point-i-1]-0x30)*2+1];
  122. ss1[2]=0;
  123. ss2[0]=DaDanwei[i*2];
  124. ss2[1]=DaDanwei[i*2+1];
  125. ss2[2]=0;
  126. sprintf(tem2,"%s%s%s",ss1,ss2,tem);
  127. strcpy(tem,tem2);
  128. }
  129. strcat(tem,pss);
  130. strcpy(Daxie,tem);
  131. }
  132. mytool::TranDaxieNum(char *source,char *Daxie)
  133. {
  134. int i,len;
  135. char tem[1000]="",tem2[1000]="",ss1[3];
  136. ss1[2]=0;
  137. //
  138. len=strlen(source);
  139. for(i=0;i<len;i++)
  140. {
  141. if(source[i]!='.')
  142. {
  143. ss1[0]=DaNum[(source[i]-0x30)*2];
  144. ss1[1]=DaNum[(source[i]-0x30)*2+1];
  145. sprintf(tem2,"%s%s",tem,ss1);
  146. strcat(tem,ss1);
  147. }
  148. else
  149. {
  150. strcat(tem,"点");
  151. }
  152. }
  153. strcpy(Daxie,tem);
  154. }
  155. ////////////////////////////////////////////////////////////
  156. //日期处理
  157. mytool::GetDate(char *ss)
  158. {
  159.     SYSTEMTIME  systime;
  160. GetSystemTime (&systime);
  161. sprintf(ss,"%d年%d月%d日", systime.wYear,systime.wMonth,systime.wDay); 
  162. }
  163. mytool::GetDateChina(char *ss)
  164. {
  165. SYSTEMTIME systime;
  166. GetSystemTime (&systime);
  167. sprintf(ss,"%d年%d月%d日", systime.wYear,systime.wMonth,systime.wDay); 
  168. TranDateChina(ss,systime);
  169. }
  170. mytool::TranDate(char *ss,SYSTEMTIME  systime)
  171. {
  172. GetSystemTime (&systime);
  173. sprintf(ss,"%d年%d月%d日", systime.wYear,systime.wMonth,systime.wDay); 
  174. }
  175. mytool::TranDateChina(char *ss,SYSTEMTIME systime)
  176. {
  177. int i,tt,tt2;
  178. char nn[10]="",yy[10]="",rr[10]="";
  179. char tem1[1000]="",ss1[3];
  180. ss1[2]=0;
  181. tt=systime.wYear;
  182. for(i=0;i<4;i++)
  183. {
  184. tt2=tt%10;
  185. ss1[0]=DaNumE[tt2*2];
  186. ss1[1]=DaNumE[tt2*2+1];
  187. sprintf(tem1,"%s%s",ss1,nn);
  188. strcpy(nn,tem1);
  189. tt=tt/10;
  190. }
  191.     //////////////////////////////////////////////////////////
  192. tt=systime.wMonth%10;
  193. tem1[0]=0;
  194. if(tt>0)
  195. {
  196. ss1[0]=DaNumE[tt*2];
  197. ss1[1]=DaNumE[tt*2+1];
  198. ss1[2]=0;
  199. sprintf(tem1,"%s",ss1);
  200. }
  201. tt=systime.wMonth/10;
  202. if(tt>0)
  203. {
  204. ss1[0]=0;
  205. if(tt>1)
  206. {
  207. ss1[0]=DaNumE[tt*2];
  208. ss1[1]=DaNumE[tt*2+1];
  209. ss1[2]=0;
  210. }
  211. sprintf(yy,"%s十%s",ss1,tem1);
  212. }
  213. else
  214. sprintf(yy,"%s",tem1);
  215.     //////////////////////////////////////////////////////////
  216. tt=systime.wDay%10;
  217. tem1[0]=0;
  218. if(tt>0)
  219. {
  220. ss1[0]=DaNumE[tt*2];
  221. ss1[1]=DaNumE[tt*2+1];
  222. ss1[2]=0;
  223. sprintf(tem1,"%s",ss1);
  224. }
  225. tt=systime.wDay/10;
  226. if(tt>0)
  227. {
  228. ss1[0]=0;
  229. if(tt>1)
  230. {
  231. ss1[0]=DaNumE[tt*2];
  232. ss1[1]=DaNumE[tt*2+1];
  233. ss1[2]=0;
  234. }
  235. sprintf(rr,"%s十%s",ss1,tem1);
  236. }
  237. else
  238. sprintf(rr,"%s",tem1);
  239. sprintf(ss,"%s年%s月%s日",nn,yy,rr);
  240. }
  241. //返回非零说明有错误发生
  242. int mytool::formcaculate(char *formss,double *retvar)
  243. {
  244. formula ff;
  245. ff.caculate(formss);
  246. return ff.getformulaVar(retvar);
  247. }
  248. //97版的mdb
  249. BOOL mytool::mypassmdb (char * FileName,char *Pass)
  250. {
  251. char cWord[13];
  252. FILE *fp;
  253. fp = fopen(FileName,"rb"); //打开文字文件只读
  254. if (fp == 0)
  255. {
  256. MessageBox (0,"文件不能打开!",0,0);
  257. return 0;
  258. }
  259. if (GetFileSize(fp,0) <= 80)
  260. {
  261. MessageBox (0,"这不是Mdb文件!",0,0);
  262. return 0;
  263. }
  264.     fseek(fp, 66,SEEK_SET);//寻至密码处
  265. fread (cWord,13,1,fp);   //读出加密器
  266. fclose (fp);
  267. if ((BYTE)(cWord[0] ^ 0x86) == 0)//判断有无密码
  268. strcpy(Pass,"No Password");
  269. else
  270. {   //对加密串进行逐位解密
  271. cWord[0] ^= 0x86;
  272. cWord[1] ^= 0xFB;
  273. cWord[2] ^= 0xEC;
  274. cWord[3] ^= 0x37;
  275. cWord[4] ^= 0x5D;
  276. cWord[5] ^= 0x44;
  277. cWord[6] ^= 0x9C;
  278. cWord[7] ^= 0xFA;
  279. cWord[8] ^= 0xC6;
  280. cWord[9] ^= 0x5E;
  281. cWord[10] ^= 0x28;
  282. cWord[11] ^= 0xE6;
  283. cWord[12] ^= 0x13;
  284. strcpy(Pass,cWord);//返回解明码
  285. }
  286. // MessageBox (0,Pass,0,0);
  287. return 0;
  288. }
  289. //
  290. int mytool::myfind_chss(char *str,char *substr)
  291. {
  292. char *p;
  293. p = strtok(str,";"); 
  294. do{
  295.     if(p!=NULL){
  296.   //MessageBox(0,p,substr,0);
  297.   if(strcmp(p,substr)==0){
  298.   return 1;
  299.   }
  300. }
  301.     p = strtok(NULL, ";"); 
  302. }
  303. while(p);
  304. return 0;
  305. }
  306. void mytool::TranComStr(int selet ,char *retss)
  307. {
  308. int len,ret,i,pt;
  309.     double tem;
  310. char ss[1001];  
  311. char buffer[2000]="";
  312. if(selet==2)
  313. {
  314.    GetAsyncKeyState(16);
  315. if(GetAsyncKeyState(16)==0)
  316. GetDate(retss);
  317. else
  318. GetDateChina(retss);
  319.   }
  320. if(selet==1) //万能转换
  321. {
  322. SendMessage(GetFocus(), WM_COPY, 1, 0);
  323. {
  324. OpenClipboard(GetFocus());
  325. if(IsClipboardFormatAvailable (CF_TEXT)!=0)
  326. {
  327. HANDLE hmem = GetClipboardData(CF_TEXT);
  328. if(hmem!=0)
  329. {
  330. char *pp=(char*)GlobalLock(hmem);
  331. strcpy(buffer,pp);
  332. if(buffer[strlen(buffer)-2]==13||buffer[strlen(buffer)-2]==10)
  333. buffer[strlen(buffer)-2]=0;//清除回车
  334. GlobalUnlock(hmem);
  335. }
  336. }
  337. CloseClipboard();
  338. }
  339. if(strlen(buffer)>0) //得到数据
  340. {
  341. sprintf(ss,"%s",buffer);
  342. ret=analysisStr(ss);
  343. //sprintf(ss,"%d",ret);
  344. //MessageBox(0,"dd",ss,0);
  345. if(ret==0){
  346. if(strlen(buffer)>0) //得到数据
  347. {
  348. char tem_encd[20]="",temsscn[1001]="";
  349. char showss[100]="",cur_dic_lib[256]="",pathfile[1000]="";
  350. int t;
  351. RegReadString("cur_dic_lib",cur_dic_lib);
  352. if(strlen(cur_dic_lib)>0)
  353. sprintf(pathfile,"c:\jsime\lib\%s",cur_dic_lib);
  354. //MessageBox(0,pathfile,"得到新词",1 );
  355. ChLib.ChissToCodeC("c:\jsime\MainCode.txt", ss, tem_encd);
  356. if(strlen(tem_encd)>0 && FileExists(pathfile)){
  357. ChLib.TestLibExt(pathfile,tem_encd,temsscn);//
  358.     //在指定的串中查找串,各串以;结束。
  359. if(myfind_chss(temsscn,ss)==0){
  360. sprintf(showss,"   在编码库中没有这个词,你是否要加为新词,nnn新词:%snn编码:%s",ss,tem_encd);
  361. t=MessageBox(0,showss,"得到新词",1 );
  362. if(t==1){
  363. ChLib.insertNewWord(tem_encd,ss);
  364. //sprintf(showss,"%d",t);MessageBox(0,showss,"得到新词",1 );
  365. }
  366. }else{
  367. //MessageBox(0,temsscn,tem_encd,0);
  368. strcpy(retss,tem_encd);
  369. }
  370. }
  371. }
  372. }
  373. if(ret==1)
  374. TranDaxieNum(ss,retss);
  375. if(ret==2)
  376. TranDaxieNum(ss,retss);
  377. if(ret==3)
  378. {
  379. ret=formcaculate(ss,&tem);
  380. if(ret!=-1)
  381. {
  382. //sprintf(retss,"%d  %lf",ret,tem);
  383. sprintf(retss,"%lf",tem);
  384. //结果去尾0处理
  385. pt=-1;
  386. len=strlen(retss);
  387. for(i=0;i<len;i++){
  388. if('.'==retss[i]){
  389. pt=i;
  390. break;
  391. }
  392. }
  393. if(pt!=-1)
  394. {
  395. for(i=len-1;i>=0;i--)
  396. {
  397. if(retss[i]=='0')
  398. retss[i]=0;
  399. else 
  400. {
  401. if(retss[i]=='.')
  402. retss[i]=0;
  403. break;
  404. }
  405. }
  406. }
  407. //结果去尾0处理END
  408. }
  409. else
  410. {
  411. retss[0]=0;
  412. }
  413. }//3
  414. }
  415. }
  416. }
  417. //本段程序为附加程序,用于获取指定窗口的内容
  418. void getAppss(int wparam)
  419. {
  420. if(wparam==32)
  421.     {
  422. long t;
  423.         t=GetWindowTextLength(GetFocus());
  424. if(t>200000)
  425. { MessageBox(0,"被复制对象不大于20万字节",0,0);
  426. t=200000;
  427. }
  428. HANDLE hGlobalMemory = GlobalAlloc(GHND, t + 1); // 分配内存
  429. LPBYTE lpGlobalMemory = (LPBYTE)GlobalLock(hGlobalMemory),lpgmem; // 锁定内存
  430. lpgmem=lpGlobalMemory;
  431.        /*lstr=(char*)malloc(t+1);
  432. if(lstr==0 || hGlobalMemory==0)
  433. { MessageBox(0,"分配内存失败",0,0);
  434. sprintf(ss,"%ld",hGlobalMemory);
  435. }*/
  436. // free(lstr); 
  437. if(t>4000)
  438. {
  439. char ss[200001];
  440. SendMessage(GetFocus(), WM_GETTEXT, t, (LPARAM)ss);
  441. ss[t]=0;
  442. for(int i=0;i<t;i++)
  443. *(lpgmem++)=ss[i];
  444. *(lpgmem)=0;
  445. }
  446. else
  447. {
  448. char ss[4001];
  449. SendMessage(GetFocus(), WM_GETTEXT, t, (LPARAM)ss);
  450. ss[t]=0;
  451. for(int i=0;i<t;i++)
  452. *(lpgmem++)=ss[i];
  453. *(lpgmem)=0;
  454. }
  455. GlobalUnlock(hGlobalMemory); // 锁定内存块解锁
  456. OpenClipboard(GetFocus());
  457. GetClipboardFormatName(0,0,0);
  458. EmptyClipboard();
  459. //GetClipboardData(CF_TEXT)
  460. SetClipboardData(CF_TEXT,hGlobalMemory);
  461. GlobalFree(hGlobalMemory);
  462. // strcat(tems,"进入剪切板");
  463. CloseClipboard();
  464. }
  465. }