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

输入法编程

开发平台:

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