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

输入法编程

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "stdio.h"
  3. #include "windows.h"
  4. #include "windef.h"
  5. #include "math.h"
  6. #include "CmyFC.h"
  7. #include "myHDC.h" 
  8. #include "COMMDLG.H" 
  9. #include "SHLOBJ.H" 
  10. extern BYTE VirtKey48Map[48];
  11. CmyFC::CmyFC()
  12. {
  13. OSVERSIONINFO osvi;
  14. osvi.dwOSVersionInfoSize = 148;
  15. GetVersionEx(&osvi);
  16. if(osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
  17. ValIsWinNT=1;
  18. else
  19. ValIsWinNT=0;
  20. }
  21. //浏览文件夹函数
  22. //browseDirectory("极速五笔",gg, m_hWnd);
  23. int CALLBACK CmyFC::browseCallbackProc(HWND hwnd, UINT uMsg, LPARAM /*lp*/, LPARAM pData) {
  24. switch(uMsg) {
  25. case BFFM_INITIALIZED: 
  26. SendMessage(hwnd, BFFM_SETSELECTION, TRUE, pData);
  27. break;
  28. }
  29. return 0;
  30. }
  31. //browseFile(gg, m_hWnd,true,"",NULL);
  32. bool CmyFC::browseDirectory(char *Title,char * target, HWND owner /* = NULL */) {
  33. char buf[MAX_PATH];
  34. BROWSEINFO bi;
  35. LPMALLOC ma;
  36. int lon;
  37. ZeroMemory(&bi, sizeof(bi));
  38. bi.hwndOwner = owner;
  39. bi.pszDisplayName = buf;
  40. bi.lpszTitle = Title;
  41. bi.ulFlags = BIF_RETURNONLYFSDIRS ;
  42. bi.lParam = (LPARAM)target;
  43. //bi.lpfn = &browseCallbackProc;
  44. LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
  45. if(pidl != NULL) 
  46. {
  47. SHGetPathFromIDList(pidl, buf);
  48. strcpy(target, buf);
  49. lon=strlen(target);
  50. if(lon > 0 && (target)[lon-1] != '\')
  51. {
  52. target[lon]='\';
  53. target[lon+1]=0;
  54. }
  55. if(SHGetMalloc(&ma) != E_FAIL) 
  56. {
  57. ma->Free(pidl);
  58. ma->Release();
  59. }
  60. }
  61. return 1;
  62. }
  63. //save为0表示打开,为真表示保存
  64. UINT APIENTRY openhook (HWND, UINT, WPARAM, LPARAM)
  65. {
  66. return 0;
  67. }
  68. bool CmyFC::browseFile(char * target,int buflen, HWND owner /* = NULL */, bool save /* = true */, char* initialDir /* = Util::emptyString */, char* types /* = NULL */)
  69. {
  70. char buf[MAX_PATH];
  71. OPENFILENAME ofn; // common dialog box structure
  72. try{
  73. memcpy(buf, target, buflen);
  74. // Initialize OPENFILENAME
  75. ZeroMemory(&ofn, sizeof(OPENFILENAME));
  76. ofn.lStructSize = sizeof(OPENFILENAME);
  77. ofn.hwndOwner = owner;
  78. ofn.lpstrFile = buf;
  79. ofn.lpstrFilter = types;
  80. ofn.nFilterIndex = 1;
  81. ofn.lpfnHook=openhook;
  82. ofn.lpstrInitialDir = initialDir;
  83. ofn.nMaxFile = sizeof(buf);
  84. ofn.Flags = (save ? 0: OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST);
  85. // Display the Open dialog box. 
  86. if ( (save ? GetSaveFileName(&ofn) : GetOpenFileName(&ofn) ) ==TRUE) {
  87. //MessageBox(0,ofn.lpstrFile,"dd",0);
  88. memcpy(target,ofn.lpstrFile,buflen);
  89. return true;
  90. }
  91. }
  92. catch(...)
  93. {
  94. MessageBox(0,"图片选择有错误发生","dd",0);
  95. }
  96. return false;
  97. }
  98. //判断系统是否NT
  99. BOOL CmyFC::MyIsWinNT() 
  100. {
  101. OSVERSIONINFO osvi;
  102. osvi.dwOSVersionInfoSize = 148;
  103. GetVersionEx(&osvi);
  104. if(osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
  105. return 1;
  106. else
  107. return 0;
  108. }
  109. int CmyFC::myGetPath(char *filefullname)
  110. {
  111. int  i,lon;
  112. lon=strlen(filefullname);
  113. for(i=lon;i>0;i--)
  114. if(filefullname[i]=='\')
  115. {
  116. filefullname[i+1]=0;
  117. break;
  118. }
  119. return 0;
  120. }
  121. int CmyFC::myfileExtname(char *filefullname,char *extname)
  122. {
  123. int  i,lon;
  124. extname[0]=0;
  125. lon=strlen(filefullname);
  126. for(i=lon;i>0;i--)
  127. if(filefullname[i]=='.')
  128. {
  129. strcpy(extname,&filefullname[i+1]);
  130. break;
  131. }
  132. return 0;
  133. }
  134. //输出文本图片
  135. CmyFC::OutTextPic(char *ss,long x,long y,HDC hDC1,HDC hDC2, long dw , long dh,double a, double zoom,HDC backhdc)
  136. {
  137. int i,index;
  138. myHDC tt,temtt,pp;
  139. char temss[100];
  140. long r,outdw;
  141. strcpy(temss,ss);
  142. r=(long)sqrt(dw*dw+dh*dh);
  143. outdw=dw*2*strlen(temss)+r*2;
  144. tt.StartHDC(hDC2,outdw,500);
  145. temtt.StartHDC(hDC1,outdw,500);
  146. pp.StartHDC(hDC1,outdw,500);
  147. strupr(temss);
  148. for(i=0;i<(int)strlen(temss);i++)
  149. {
  150. index=temss[i]-65;
  151. OutPicture(r,r,tt.hdc,dw*2*index,0,hDC2,dw,dh,a);
  152. TransparentBlt2(temtt.hdc,dw*2*i,0,dw*2+r,r*2,tt.hdc,0,0,dw*2+r,r*2,RGB(255,255,255));
  153. //BitBlt(temtt.hdc,dw*2*i,0,dw*2+r,r*2,tt.hdc,0,0,SRCAND);//
  154. }
  155. BitBlt(pp.hdc,0,0,outdw,r*2,backhdc,x,y,SRCCOPY);
  156. TransparentBlt2(pp.hdc,0,0,(int)(outdw*zoom),(int)(r*2*zoom),temtt.hdc,0,0,outdw,r*2,RGB(255,255,255));
  157. BitBlt(hDC1,x,y,(int)(outdw*zoom),r*2,pp.hdc,0,0,SRCCOPY);
  158. }
  159. //在hDC1中输出hDC2的指定位置和大小和角度的图片
  160. CmyFC::OutPicture(long x,long y,HDC hDC1,long startx,long starty,HDC hDC2, long dw , long dh,double a)
  161. {
  162. POINT pt[3];
  163. double sidas,sidac ;
  164. HBRUSH hBrush;
  165. HRGN hRgn;
  166. if(ValIsWinNT==TRUE)
  167. {
  168. sidac =cos(a * 0.0174533);
  169. sidas =sin(a * 0.0174533);
  170. pt[0].y = (long)(-dh * sidac -dw * sidas + y);
  171. pt[0].x = (long)( dh * sidas -dw * sidac + x);
  172. pt[1].y = (long)(-dh * sidac +dw * sidas + y);
  173. pt[1].x = (long)( dh * sidas +dw * sidac + x);
  174. pt[2].y = (long)( dh * sidac -dw * sidas + y);
  175. pt[2].x = (long)(-dh * sidas -dw * sidac + x);
  176. //BitBlt(hDC1,0,0,2000,500,0,0,0,WHITENESS);//由于WHITENESS并不是白色
  177. hBrush=(HBRUSH)GetStockObject(WHITE_BRUSH);
  178. hRgn=CreateRectRgn(0,0,300,300);
  179. FillRgn(hDC1,hRgn, hBrush);
  180. DeleteObject (hRgn);
  181. PlgBlt(hDC1,pt,hDC2,startx,starty, dw*2,dh*2,0,0,0);
  182. }
  183. else
  184. BitBlt(hDC1,10,10,dw*2,dh*2,hDC2,startx,starty,SRCCOPY);
  185. }
  186. void CmyFC::TransparentBlt2(HDC hdc0,
  187. int nX0,int nY0,int nW0,int nH0,
  188. HDC hdc1,
  189. int nX1,int nY1,int nW1,int nH1,
  190. UINT Tcol)
  191.  
  192. {
  193. HBITMAP hBMP   =CreateCompatibleBitmap(hdc0,nW0, nH0);
  194. // HBITMAP mBMP   =CreateCompatibleBitmap(hdc0,nW0, nH0);
  195. HBITMAP mBMP   =CreateBitmap(nW0,nH0,1,1,NULL); //建单色位图
  196. HDC hDC    =CreateCompatibleDC(hdc0);
  197. HDC mDC    =CreateCompatibleDC(hdc0);
  198. HBITMAP oldBMP =(HBITMAP)SelectObject(hDC, hBMP);
  199. HBITMAP oldmBMP=(HBITMAP)SelectObject(mDC, mBMP);
  200. //拷备位图到hDC中
  201. if (nW0==nW1&&nH0==nH1)
  202. BitBlt(hDC,0,0,nW0,nH0,hdc1,nX1,nY1,SRCCOPY);
  203. else
  204. StretchBlt(hDC,0,0,nW0,nH0,hdc1,nX1,nY1,nW1,nH1,SRCCOPY);
  205. SetBkColor(hDC, Tcol);//除去背景色的其他色形成轮括
  206. BitBlt(mDC,0,0,nW0,nH0,hDC,0,0,SRCCOPY);    
  207. //在单色的mDC设备中形成位图的黑色轮括。
  208. SetBkColor(hDC, RGB(0,0,0));            //设置形成图形与后的0值色
  209. SetTextColor(hDC, RGB(255,255,255));    //设置需要处理颜色的范围
  210. BitBlt(hDC,0,0,nW0,nH0,mDC,0,0,SRCAND); //取出实际以黑色为背景的图形。
  211. SetBkColor(hdc0,RGB(255,255,255));
  212. SetTextColor(hdc0,RGB(0,0,0));
  213. //在背景图上形成轮括
  214. BitBlt(hdc0,nX0,nY0,nW0,nH0,mDC,0,0,SRCAND); // SRCAND   dest=source AND dest
  215. BitBlt(hdc0,nX0,nY0,nW0,nH0,hDC,0,0,SRCPAINT);//SRCPAINT dest=source OR  dest  
  216. SelectObject(hDC,oldBMP);
  217. SelectObject(mDC,oldmBMP);
  218. DeleteDC(hDC);
  219. DeleteDC(mDC);
  220. DeleteObject(hBMP);
  221. DeleteObject(mBMP);
  222. }
  223. //////////////////////////////////////////////////////////////////////////////
  224. //读取注册表中的一个变量
  225. DWORD CmyFC::ReadReg(char *valname)
  226. {
  227. HKEY hKey;
  228. DWORD myupdate=0, myupdate1=0;
  229. unsigned long lon;
  230. if ( RegCreateKey(HKEY_CURRENT_USER,"Software\jsime", &hKey) == ERROR_SUCCESS )
  231. {
  232. //如果没有键值就建立一个
  233. if( RegQueryValueEx( hKey,valname,NULL,NULL,(LPBYTE)&myupdate1,&lon) != ERROR_SUCCESS )
  234.   RegSetValueEx(hKey, valname,0,REG_DWORD,(LPBYTE)&myupdate,sizeof(DWORD));
  235. RegCloseKey(hKey);
  236. }
  237. return myupdate1;
  238. }
  239. int CmyFC::WriteReg(char *valname,DWORD keyVal)
  240. {
  241. HKEY hKey;
  242. if ( RegCreateKey(HKEY_CURRENT_USER,"Software\jsime", &hKey) == ERROR_SUCCESS )
  243. {
  244.  //   MessageBox(0,valname,keyVal,0);
  245.   RegSetValueEx(hKey, valname,0,REG_DWORD,(LPBYTE)&keyVal,sizeof(DWORD));
  246. RegCloseKey(hKey);
  247. }
  248. return 0;
  249. }
  250. /////////////////////////////////////////////////////////////////////////
  251. // read string  
  252. int CmyFC::RegReadString(char *valname, char *keyVal)
  253. {
  254. HKEY hKey;
  255. unsigned long lon;
  256. char dd[100]="";
  257. keyVal[0]=0;
  258. if ( RegCreateKey(HKEY_CURRENT_USER,"Software\jsime", &hKey) == ERROR_SUCCESS )
  259. {
  260. //如果没有键值就建立一个
  261. if( RegQueryValueEx( hKey,valname,NULL,NULL,(LPBYTE)keyVal,&lon) != ERROR_SUCCESS ){
  262.   //RegSetValueEx(hKey, valname,0,REG_SZ,(LPBYTE)dd,0);
  263. }
  264. RegCloseKey(hKey);
  265. }
  266. return 0;
  267. }
  268. int CmyFC:: RegSaveString(char *valname, char *keyVal)
  269. {
  270. HKEY hKey;
  271. if ( RegCreateKey(HKEY_CURRENT_USER,"Software\jsime", &hKey) == ERROR_SUCCESS )
  272. {
  273.  //   MessageBox(0,valname,keyVal,0);
  274.   RegSetValueEx(hKey, valname,0,REG_SZ,(LPBYTE)keyVal,strlen(keyVal)+1);
  275. RegCloseKey(hKey);
  276. }
  277. return 0;
  278. }
  279. //////////////////////////////////////////////////////////////////
  280. POINT  CmyFC:: ReadRegPos(char *PathName)
  281. {
  282. HKEY hKey;
  283. DWORD myupdate=0, myupdate1=0;
  284. unsigned long lon=4;
  285. POINT GetPos;
  286. char ss[100];
  287. GetPos.x=0;
  288. GetPos.y=0;
  289. sprintf(ss,"Software\jsime\%s",PathName);
  290. if ( RegCreateKey(HKEY_CURRENT_USER,ss, &hKey) == ERROR_SUCCESS )
  291. {
  292. RegQueryValueEx( hKey,"x",NULL,NULL,(LPBYTE)&GetPos.x,(LPDWORD)&lon);
  293. RegQueryValueEx( hKey,"y",NULL,NULL,(LPBYTE)&GetPos.y,(LPDWORD)&lon);
  294. RegCloseKey(hKey);
  295. }
  296. //sprintf(ss,"%d  %d",GetPos.x,GetPos.y);
  297. //MessageBox(0,ss,ss,0);
  298. return GetPos;
  299. }
  300. int CmyFC::WriteRegPos(char *PathName,POINT SavePos)
  301. {
  302. HKEY hKey;
  303. char ss[100];
  304. sprintf(ss,"Software\jsime\%s",PathName);
  305. if ( RegCreateKey(HKEY_CURRENT_USER,ss, &hKey) == ERROR_SUCCESS )
  306. {
  307.  //   MessageBox(0,valname,keyVal,0);
  308.   RegSetValueEx(hKey, "x",0,REG_DWORD,(LPBYTE)&SavePos.x,sizeof(DWORD));
  309.   RegSetValueEx(hKey, "y",0,REG_DWORD,(LPBYTE)&SavePos.y,sizeof(DWORD));
  310. RegCloseKey(hKey);
  311. }
  312. return 0;
  313. }
  314. ///////////////////////////////////////////////////////////
  315. //
  316. //////////////////////////////////////////////////////////////////////////////
  317. //读取注册表中的一个变量
  318. DWORD CmyFC::ReadReg(char *pathname, char *valname)
  319. {
  320. HKEY hKey;
  321. DWORD myupdate=0, myupdate1=0;
  322. unsigned long lon;
  323. if ( RegCreateKey(HKEY_CURRENT_USER,pathname, &hKey) == ERROR_SUCCESS )
  324. {
  325. //如果没有键值
  326. if( RegQueryValueEx( hKey,valname,NULL,NULL,(LPBYTE)&myupdate1,&lon) != ERROR_SUCCESS )
  327.   MessageBox(0,valname,"没有键值",0);
  328. RegCloseKey(hKey);
  329. }
  330. return myupdate1;
  331. }
  332. int CmyFC::WriteReg(char *pathname,char *valname,DWORD keyVal)
  333. {
  334. HKEY hKey;
  335. int ret =0;
  336. if ( RegCreateKey(HKEY_CURRENT_USER,pathname, &hKey) == ERROR_SUCCESS )
  337. {
  338.  //   MessageBox(0,valname,keyVal,0);
  339.   RegSetValueEx(hKey, valname,0,REG_DWORD,(LPBYTE)&keyVal,sizeof(DWORD));
  340. RegCloseKey(hKey);
  341. }
  342. else 
  343. ret =1;
  344. return 0;
  345. }
  346. int CmyFC::WriteReg(HKEY mainhkey,char *pathname,char *valname,DWORD keyVal)
  347. {
  348. HKEY hKey;
  349. int ret =0;
  350. if ( RegCreateKey(mainhkey,pathname, &hKey) == ERROR_SUCCESS )
  351. {
  352.  //   MessageBox(0,valname,keyVal,0);
  353.   RegSetValueEx(hKey, valname,0,REG_DWORD,(LPBYTE)&keyVal,sizeof(DWORD));
  354. RegCloseKey(hKey);
  355. }
  356. else
  357. ret =1;
  358. return 0;
  359. }
  360. /////////////////////////////////////////////////////////////////////////
  361. // read string  
  362. int CmyFC::RegReadString(char *pathname,char *valname, char *keyVal)
  363. {
  364. HKEY hKey;
  365. unsigned long lon;
  366. char dd[10]="";
  367. keyVal[0]=0;
  368. if ( RegCreateKey(HKEY_CURRENT_USER,pathname, &hKey) == ERROR_SUCCESS )
  369. {
  370. //如果没有键值
  371. if( RegQueryValueEx( hKey,valname,NULL,NULL,(LPBYTE)keyVal,&lon) != ERROR_SUCCESS )
  372.   MessageBox(0,valname,"没有键值",0);
  373. RegCloseKey(hKey);
  374. }
  375. return 0;
  376. }
  377. int CmyFC::RegSaveString(char *pathname,char *valname, char *keyVal)
  378. {
  379. HKEY hKey;
  380. if ( RegCreateKey(HKEY_CURRENT_USER,pathname, &hKey) == ERROR_SUCCESS )
  381. {
  382.  //   MessageBox(0,valname,keyVal,0);
  383.   RegSetValueEx(hKey, valname,0,REG_SZ,(LPBYTE)keyVal,strlen(keyVal)+1);
  384. RegCloseKey(hKey);
  385. }
  386. return 0;
  387. }
  388. int CmyFC::RegSaveString(HKEY mainhkey ,char *pathname,char *valname, char *keyVal)
  389. {
  390. HKEY hKey;
  391. if ( RegCreateKey(mainhkey,pathname, &hKey) == ERROR_SUCCESS )
  392. {
  393.  //   MessageBox(0,valname,keyVal,0);
  394.   RegSetValueEx(hKey, valname,0,REG_SZ,(LPBYTE)keyVal,strlen(keyVal)+1);
  395. RegCloseKey(hKey);
  396. }
  397. return 0;
  398. }
  399. //得到所有的文件名,各文件名之间以;隔开
  400. int CmyFC::getallfile(char *path1,char **filelist){
  401. BOOL bFound;
  402. WIN32_FIND_DATA fd; 
  403.   char copy1[1000] ;
  404.     HANDLE hFind ; 
  405. int firstf=1,ret=0;
  406. sprintf(copy1,"%s\*",path1);
  407. //MessageBox(0,copy1,"",0);
  408.     hFind = FindFirstFile(copy1, &fd); 
  409.     if (hFind !=INVALID_HANDLE_VALUE) {
  410. bFound = FindNextFile(hFind,&fd);
  411. while(bFound)
  412. {
  413. if(strcmp(fd.cFileName,".")!=0 &&  strcmp(fd.cFileName,"..")!=0){
  414. if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
  415. ;
  416. }else{
  417. strcpy(filelist[ret],"");
  418. /*if(firstf==1){
  419. firstf=0;
  420. }else{
  421. strcat(filelist[ret],";");
  422. }*/
  423. strcat(filelist[ret],fd.cFileName);
  424. //MessageBox(0,fd.cFileName,"",0);
  425. ret++;
  426. }
  427. }
  428. bFound = FindNextFile(hFind,&fd);
  429. }
  430. }
  431. return ret;
  432. }
  433. bool CmyFC:: DirExists(const char *dir)
  434. {
  435. bool tf;
  436. WIN32_FIND_DATA fd; 
  437.     HANDLE hFind = FindFirstFile(dir, &fd); 
  438.     if ((hFind != INVALID_HANDLE_VALUE) && (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) 
  439.     { 
  440. tf = true;
  441.     } 
  442. else
  443. {
  444. tf = false;
  445. }
  446.     FindClose(hFind); 
  447. return tf;
  448. }
  449. //判断文件是否存在
  450. BOOL CmyFC:: FileExists(const char *dir)
  451. {
  452. BOOL tf;
  453. WIN32_FIND_DATA fd; 
  454.     HANDLE hFind = FindFirstFile(dir, &fd); 
  455.     if (hFind !=INVALID_HANDLE_VALUE) 
  456.     { 
  457. tf = TRUE;
  458.     } 
  459. else
  460. {
  461. tf = FALSE;
  462. }
  463.     FindClose(hFind); 
  464. return tf;
  465. }
  466. ///////////////////////////////////////////////////////////////
  467. //读注册表判断是否需要重新装载库
  468. //返回为0表示不需要,1为需要重新装载
  469. long CmyFC::GetIsUpdate()
  470. {
  471. HKEY hKey;
  472. DWORD myupdate1;
  473. unsigned long lon;
  474. long ret=0;
  475. if ( RegCreateKey(HKEY_CURRENT_USER,"Software\jsime", &hKey) == ERROR_SUCCESS )
  476. {
  477. if( RegQueryValueEx( hKey,"jsime",NULL,NULL,(LPBYTE)&myupdate1,&lon) == ERROR_SUCCESS )
  478. {
  479. if(myupdate1==1)
  480. {
  481. //char ss[100];
  482. //sprintf(ss,"需要更新字库%d",myupdate1);
  483. //MessageBox(0,ss,"ddd",0);
  484. myupdate1=0;
  485.      RegSetValueEx(hKey, "jsime",0,REG_DWORD,(LPBYTE)&myupdate1,sizeof(DWORD));
  486. ret=1;
  487. }
  488. }
  489. RegCloseKey(hKey);
  490. }
  491. else
  492. MessageBox(0,"Software\jsime","主键打开失败",0);
  493. return ret;
  494. }
  495. ////////////////////////////////////////////////////////////////
  496. //取得键盘字符
  497. //需要得到VirtKey48Map支持
  498. ///////////////////////////////////////////////////////////////
  499. BOOL CmyFC::SoftKbdProcess(char *chss,int mykey,char*retSendCH)
  500. {
  501. unsigned char temss[3];
  502. char temchss[3];
  503. int i,bas=0,ret=0;
  504. BYTE bb;
  505. bb=mykey;
  506. for(i=0;i<49;i++)
  507. {
  508. if(VirtKey48Map[i]==bb)
  509.    break;
  510. }
  511. if(i<49)
  512. {
  513. GetAsyncKeyState(16);
  514. if(GetAsyncKeyState(16)!=0)
  515. bas=48;
  516. temchss[0] = chss[(bas+i)*2] ;
  517. temchss[1] = chss[(bas+i)*2 + 1] ;
  518. temchss[2] =0;
  519. temss[0] = chss[(bas+i)*2] & 0x00ff;
  520. temss[1] = chss[(bas+i)*2 + 1] & 0x00ff;
  521. if(temss[1]==' ')
  522. temss[1]=0;
  523. if(strcmp(temchss," ")==0)
  524. temss[0]=0;
  525. temss[2]=0;
  526. strcpy(retSendCH,(char*)temss);
  527. ret=1;
  528. }
  529. return ret;
  530. }
  531. /////////////////////////////////////////////////////////////
  532. //下面为函数部分
  533. //用于向系统发送消息
  534. BOOL CmyFC::GenerateMessage(HIMC hIMC, LPDWORD lpdwTransKey,LPGENEMSG lpGeneMsg)
  535. {
  536.     LPINPUTCONTEXT lpIMC;
  537. if( (lpIMC = ImmLockIMC(hIMC)) == NULL ) 
  538. return FALSE;
  539. if (IsWindow(lpIMC->hWnd))
  540. {
  541. LPDWORD lpdw;
  542. if (!(lpIMC->hMsgBuf = ImmReSizeIMCC(lpIMC->hMsgBuf,
  543. sizeof(DWORD) * (lpIMC->dwNumMsgBuf +1) * 3)))
  544. return FALSE;
  545. if (!(lpdw = (LPDWORD)ImmLockIMCC(lpIMC->hMsgBuf)))
  546. return FALSE;
  547. lpdw += (lpIMC->dwNumMsgBuf) * 3;
  548. *((LPGENEMSG)lpdw) = *lpGeneMsg;
  549. ImmUnlockIMCC(lpIMC->hMsgBuf);
  550. lpIMC->dwNumMsgBuf++;
  551. ImmGenerateMessage(hIMC);
  552. }
  553. ImmUnlockIMC(hIMC);
  554. return TRUE;
  555. }
  556. //把转换后的汉字发到接收程序中使用内部机制.
  557. BOOL CmyFC::IMESenChiApp(HIMC hIMC, char *ss)
  558. {
  559. //内部发送在首次发送时可能失效,因此暂时不用
  560. if(strlen(ss)<2)
  561. {
  562. GENEMSG GnMsg;
  563. LPCOMPOSITIONSTRING lpCompStr;
  564. LPINPUTCONTEXT lpIMC;
  565. lpIMC = ImmLockIMC(hIMC);
  566. lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr);
  567. if(strlen(ss))
  568. {
  569. strcpy(GETLPRESULTSTR(lpCompStr),ss);
  570. //_tcscpy(GETLPRESULTSTR(lpCompStr),"高点");
  571. lpCompStr->dwResultStrLen =strlen(ss);
  572. //{
  573. // char sss[100];
  574. // sprintf(sss,"%d",strlen(ss));
  575. // MessageBox(0,sss,0,0);
  576. //}
  577. GnMsg.msg = WM_IME_COMPOSITION;//
  578. GnMsg.wParam = 0;
  579. GnMsg.lParam = GCS_RESULTSTR;
  580. GenerateMessage(hIMC, 0,(LPGENEMSG)&GnMsg);
  581. }
  582. }
  583. else
  584. {
  585. //向获得焦点的窗口发送字符串
  586. //发送过多的字符有可能失去挂钩
  587. int i;
  588. for(i=0;i<(int)strlen(ss);)
  589. {
  590. if(ss[i]<0)
  591. {
  592. SendMessage(GetFocus(), WM_IME_CHAR, MAKEWORD(ss[i+1],ss[i]), 0);
  593.     i+=2;
  594. }
  595. else
  596. {
  597. SendMessage(GetFocus(), WM_IME_CHAR, MAKEWORD(ss[i],0), 1);
  598. if(ss[i]==13&&ss[i+1]==10)
  599. i++;
  600. i++;
  601. }
  602. }
  603. }
  604. return TRUE; 
  605. }