Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2128 lines
71 KiB

  1. /*++
  2. Copyright (c) 1995-1999 Microsoft Corporation, All Rights Reserved
  3. Module Name:
  4. STATUSUI.c
  5. ++*/
  6. #include <windows.h>
  7. #include <htmlhelp.h>
  8. #include <immdev.h>
  9. #include <string.h>
  10. #include <regstr.h>
  11. #include <imedefs.h>
  12. #include <resource.h>
  13. extern HWND hCrtDlg;
  14. HWND hChildDlg;
  15. /**********************************************************************/
  16. /* GetStatusWnd */
  17. /* Return Value : */
  18. /* window handle of status window */
  19. /**********************************************************************/
  20. HWND PASCAL GetStatusWnd(
  21. HWND hUIWnd) // UI window
  22. {
  23. HGLOBAL hUIPrivate;
  24. LPUIPRIV lpUIPrivate;
  25. HWND hStatusWnd;
  26. hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE);
  27. if (!hUIPrivate) { // can not darw status window
  28. return (HWND)NULL;
  29. }
  30. lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
  31. if (!lpUIPrivate) { // can not draw status window
  32. return (HWND)NULL;
  33. }
  34. hStatusWnd = lpUIPrivate->hStatusWnd;
  35. GlobalUnlock(hUIPrivate);
  36. return (hStatusWnd);
  37. }
  38. /**********************************************************************/
  39. /* AdjustStatusBoundary() */
  40. /**********************************************************************/
  41. void PASCAL AdjustStatusBoundary(
  42. LPPOINTS lppt,
  43. HWND hUIWnd)
  44. {
  45. RECT rcWorkArea;
  46. #if 1 // MultiMonitor support
  47. {
  48. RECT rcStatusWnd;
  49. rcStatusWnd.left = lppt->x;
  50. rcStatusWnd.top = lppt->y;
  51. rcStatusWnd.right = rcStatusWnd.left + sImeG.xStatusWi;
  52. rcStatusWnd.bottom = rcStatusWnd.top + sImeG.yStatusHi;
  53. rcWorkArea = ImeMonitorWorkAreaFromRect(&rcStatusWnd);
  54. }
  55. #else
  56. rcWorkArea = sImeG.rcWorkArea;
  57. #endif
  58. // display boundary check
  59. if (lppt->x < rcWorkArea.left) {
  60. lppt->x = (short)rcWorkArea.left;
  61. } else if (lppt->x + sImeG.xStatusWi > rcWorkArea.right) {
  62. lppt->x = (short)(rcWorkArea.right - sImeG.xStatusWi);
  63. }
  64. if (lppt->y < rcWorkArea.top) {
  65. lppt->y = (short)rcWorkArea.top;
  66. } else if (lppt->y + sImeG.yStatusHi > rcWorkArea.bottom) {
  67. lppt->y = (short)(rcWorkArea.bottom - sImeG.yStatusHi);
  68. }
  69. if(MBIndex.IMEChara[0].IC_Trace) {
  70. } else {
  71. int Comp_CandWndLen;
  72. Comp_CandWndLen = 0;
  73. if(uStartComp) {
  74. Comp_CandWndLen += lpImeL->xCompWi + UI_MARGIN;
  75. }
  76. if(uOpenCand) {
  77. Comp_CandWndLen += sImeG.xCandWi + UI_MARGIN;
  78. }
  79. if(lppt->x + sImeG.xStatusWi + Comp_CandWndLen > rcWorkArea.right) {
  80. lppt->x=(SHORT)(rcWorkArea.right-sImeG.xStatusWi-Comp_CandWndLen);
  81. }
  82. }
  83. return;
  84. }
  85. /**********************************************************************/
  86. /* SetStatusWindowPos() */
  87. /**********************************************************************/
  88. LRESULT PASCAL SetStatusWindowPos(
  89. HWND hStatusWnd)
  90. {
  91. HWND hUIWnd;
  92. HIMC hIMC;
  93. LPINPUTCONTEXT lpIMC;
  94. //RECT rcStatusWnd;
  95. POINTS ptPos;
  96. hUIWnd = GetWindow(hStatusWnd, GW_OWNER);
  97. if (!hUIWnd) {
  98. return (1L);
  99. }
  100. hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC);
  101. if (!hIMC) {
  102. return (1L);
  103. }
  104. lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
  105. if (!lpIMC) { // Oh! Oh!
  106. return (1L);
  107. }
  108. ptPos.x = (short)lpIMC->ptStatusWndPos.x;
  109. ptPos.y = (short)lpIMC->ptStatusWndPos.y;
  110. // display boundary adjust
  111. AdjustStatusBoundary(&ptPos, hUIWnd);
  112. SetWindowPos(hStatusWnd, NULL,
  113. ptPos.x, ptPos.y,
  114. 0, 0, SWP_NOACTIVATE|SWP_NOCOPYBITS|SWP_NOSIZE|SWP_NOZORDER);
  115. ImmUnlockIMC(hIMC);
  116. return (0L);
  117. }
  118. /**********************************************************************/
  119. /* ShowStatus() */
  120. /**********************************************************************/
  121. void PASCAL ShowStatus( // Show the status window - shape / soft KBD
  122. // alphanumeric ...
  123. HWND hUIWnd,
  124. int nShowStatusCmd)
  125. {
  126. HGLOBAL hUIPrivate;
  127. LPUIPRIV lpUIPrivate;
  128. hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE);
  129. if (!hUIPrivate) { // can not darw status window
  130. return;
  131. }
  132. lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
  133. if (!lpUIPrivate) { // can not draw status window
  134. return;
  135. }
  136. if (!lpUIPrivate->hStatusWnd) {
  137. // not in show status window mode
  138. } else if (lpUIPrivate->nShowStatusCmd != nShowStatusCmd) {
  139. SystemParametersInfo(SPI_GETWORKAREA, 0, &sImeG.rcWorkArea, 0);
  140. SetStatusWindowPos(lpUIPrivate->hStatusWnd);
  141. ShowWindow(lpUIPrivate->hStatusWnd, nShowStatusCmd);
  142. lpUIPrivate->nShowStatusCmd = nShowStatusCmd;
  143. } else {
  144. }
  145. GlobalUnlock(hUIPrivate);
  146. return;
  147. }
  148. /**********************************************************************/
  149. /* OpenStatus() */
  150. /**********************************************************************/
  151. void PASCAL OpenStatus( // open status window
  152. HWND hUIWnd)
  153. {
  154. HGLOBAL hUIPrivate;
  155. LPUIPRIV lpUIPrivate;
  156. HIMC hIMC;
  157. LPINPUTCONTEXT lpIMC;
  158. POINT ptPos;
  159. int nShowStatusCmd;
  160. RECT rcWorkArea;
  161. rcWorkArea = sImeG.rcWorkArea;
  162. hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE);
  163. if (!hUIPrivate) { // can not darw status window
  164. return;
  165. }
  166. lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
  167. if (!lpUIPrivate) { // can not draw status window
  168. return;
  169. }
  170. hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC);
  171. if (!hIMC) {
  172. ptPos.x = rcWorkArea.left;
  173. ptPos.y = rcWorkArea.bottom - sImeG.yStatusHi;
  174. nShowStatusCmd = SW_HIDE;
  175. } else if (lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC)) {
  176. POINTS TempPoints;
  177. // for MUL_MONITOR
  178. rcWorkArea = ImeMonitorWorkAreaFromWindow(lpIMC->hWnd);
  179. TempPoints.x = (short) lpIMC->ptStatusWndPos.x;
  180. TempPoints.y = (short) lpIMC->ptStatusWndPos.y;
  181. AdjustStatusBoundary(&TempPoints, hUIWnd);
  182. lpIMC->ptStatusWndPos.x = TempPoints.x;
  183. lpIMC->ptStatusWndPos.y = TempPoints.y;
  184. if (MBIndex.IMEChara[0].IC_Trace) {
  185. ptPos = lpIMC->ptStatusWndPos;
  186. }
  187. else {
  188. ptPos.x = sImeG.rcWorkArea.left;
  189. ptPos.y = sImeG.rcWorkArea.bottom - sImeG.yStatusHi;
  190. }
  191. ImmUnlockIMC(hIMC);
  192. nShowStatusCmd = SW_SHOWNOACTIVATE;
  193. } else {
  194. ptPos.x = rcWorkArea.left;
  195. ptPos.y = rcWorkArea.bottom - sImeG.yStatusHi;
  196. nShowStatusCmd = SW_HIDE;
  197. }
  198. if (lpUIPrivate->hStatusWnd) {
  199. SetWindowPos(lpUIPrivate->hStatusWnd, NULL,
  200. ptPos.x, ptPos.y,
  201. 0, 0,
  202. SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER);
  203. } else { // create status window
  204. lpUIPrivate->hStatusWnd = CreateWindowEx(
  205. WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME,
  206. szStatusClassName, NULL,
  207. WS_POPUP|WS_DISABLED,
  208. ptPos.x, ptPos.y,
  209. sImeG.xStatusWi, sImeG.yStatusHi,
  210. hUIWnd, (HMENU)NULL, hInst, NULL);
  211. SetWindowLong(lpUIPrivate->hStatusWnd, UI_MOVE_OFFSET,
  212. WINDOW_NOT_DRAG);
  213. SetWindowLong(lpUIPrivate->hStatusWnd, UI_MOVE_XY, 0L);
  214. }
  215. lpUIPrivate->fdwSetContext |= ISC_OPEN_STATUS_WINDOW;
  216. if (hIMC) {
  217. ShowStatus(
  218. hUIWnd, SW_SHOWNOACTIVATE);
  219. }
  220. GlobalUnlock(hUIPrivate);
  221. return;
  222. }
  223. /**********************************************************************/
  224. /* DestroyStatusWindow() */
  225. /**********************************************************************/
  226. void PASCAL DestroyStatusWindow(
  227. HWND hStatusWnd)
  228. {
  229. HWND hUIWnd;
  230. HGLOBAL hUIPrivate;
  231. LPUIPRIV lpUIPrivate;
  232. if (GetWindowLong(hStatusWnd, UI_MOVE_OFFSET) != WINDOW_NOT_DRAG) {
  233. // undo the drag border
  234. DrawDragBorder(hStatusWnd,
  235. GetWindowLong(hStatusWnd, UI_MOVE_XY),
  236. GetWindowLong(hStatusWnd, UI_MOVE_OFFSET));
  237. }
  238. hUIWnd = GetWindow(hStatusWnd, GW_OWNER);
  239. if (!hUIWnd) {
  240. return;
  241. }
  242. hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE);
  243. if (!hUIPrivate) { // can not darw status window
  244. return;
  245. }
  246. lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
  247. if (!lpUIPrivate) { // can not draw status window
  248. return;
  249. }
  250. lpUIPrivate->nShowStatusCmd = SW_HIDE;
  251. lpUIPrivate->hStatusWnd = (HWND)NULL;
  252. GlobalUnlock(hUIPrivate);
  253. return;
  254. }
  255. /**********************************************************************/
  256. /* SetStatus */
  257. /**********************************************************************/
  258. void PASCAL SetStatus(
  259. HWND hStatusWnd,
  260. LPPOINT lpptCursor)
  261. {
  262. HWND hUIWnd;
  263. HIMC hIMC;
  264. LPINPUTCONTEXT lpIMC;
  265. hUIWnd = GetWindow(hStatusWnd, GW_OWNER);
  266. if (!hUIWnd) {
  267. return;
  268. }
  269. hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC);
  270. if (!hIMC) {
  271. return;
  272. }
  273. lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
  274. if (!lpIMC) {
  275. return;
  276. }
  277. if (!lpIMC->fOpen) {
  278. ImmSetOpenStatus(hIMC, TRUE);
  279. } else if (PtInRect(&sImeG.rcImeIcon, *lpptCursor)) {
  280. DWORD fdwConversion;
  281. if (lpIMC->fdwConversion & (IME_CMODE_CHARCODE|IME_CMODE_EUDC)) {
  282. // change to native mode
  283. fdwConversion = (lpIMC->fdwConversion | IME_CMODE_NATIVE) &
  284. ~(IME_CMODE_CHARCODE | IME_CMODE_EUDC);
  285. } else if (lpIMC->fdwConversion & IME_CMODE_NATIVE) {
  286. // change to alphanumeric mode
  287. fdwConversion = lpIMC->fdwConversion & ~(IME_CMODE_CHARCODE |
  288. IME_CMODE_NATIVE | IME_CMODE_EUDC);
  289. } else {
  290. BYTE lpbKeyState[256];
  291. if (!GetKeyboardState(lpbKeyState))
  292. {
  293. ImmUnlockIMC(hIMC);
  294. return;
  295. }
  296. if (lpbKeyState[VK_CAPITAL] & 1)
  297. {
  298. // Simulate a key press
  299. keybd_event( VK_CAPITAL,
  300. 0x3A,
  301. KEYEVENTF_EXTENDEDKEY | 0,
  302. 0 );
  303. // Simulate a key release
  304. keybd_event( VK_CAPITAL,
  305. 0x3A,
  306. KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
  307. 0);
  308. }
  309. fdwConversion = (lpIMC->fdwConversion | IME_CMODE_NATIVE) &
  310. ~(IME_CMODE_CHARCODE | IME_CMODE_EUDC);
  311. uCaps = 0;
  312. }
  313. // init ime Private status
  314. {
  315. LPPRIVCONTEXT lpImcP;
  316. lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
  317. if(lpImcP) {
  318. lpImcP->PrivateArea.Comp_Status.dwSTLX = 0;
  319. lpImcP->PrivateArea.Comp_Status.dwSTMULCODE = 0;
  320. lpImcP->PrivateArea.Comp_Status.dwInvalid = 0;
  321. ImmUnlockIMCC(lpIMC->hPrivate);
  322. }
  323. }
  324. ImmSetConversionStatus(hIMC, fdwConversion, lpIMC->fdwSentence);
  325. } else if (PtInRect(&sImeG.rcImeName, *lpptCursor)) {
  326. } else if (PtInRect(&sImeG.rcShapeText, *lpptCursor)) {
  327. DWORD dwConvMode;
  328. if (lpIMC->fdwConversion & IME_CMODE_CHARCODE) {
  329. MessageBeep((UINT)-1);
  330. } else if (lpIMC->fdwConversion & IME_CMODE_EUDC) {
  331. MessageBeep((UINT)-1);
  332. } else {
  333. dwConvMode = lpIMC->fdwConversion ^ IME_CMODE_FULLSHAPE;
  334. ImmSetConversionStatus(hIMC, dwConvMode, lpIMC->fdwSentence);
  335. }
  336. } else if (PtInRect(&sImeG.rcSymbol, *lpptCursor)) {
  337. DWORD fdwConversion;
  338. if (lpIMC->fdwConversion & IME_CMODE_CHARCODE) {
  339. MessageBeep((UINT)-1);
  340. } else {
  341. fdwConversion = lpIMC->fdwConversion ^ IME_CMODE_SYMBOL;
  342. ImmSetConversionStatus(hIMC, fdwConversion, lpIMC->fdwSentence);
  343. }
  344. } else if (PtInRect(&sImeG.rcSKText, *lpptCursor)) {
  345. DWORD fdwConversion;
  346. LPPRIVCONTEXT lpImcP;
  347. lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
  348. if(lpImcP) {
  349. if(!(lpImeL->hSKMenu)) {
  350. lpImeL->hSKMenu = LoadMenu (hInst, TEXT("SKMENU"));
  351. }
  352. lpImeL->dwSKState[lpImeL->dwSKWant] =
  353. lpImeL->dwSKState[lpImeL->dwSKWant]^1;
  354. fdwConversion = lpIMC->fdwConversion ^ IME_CMODE_SOFTKBD;
  355. ImmSetConversionStatus(hIMC, fdwConversion, lpIMC->fdwSentence);
  356. ImmUnlockIMCC(lpIMC->hPrivate);
  357. } else {
  358. MessageBeep((UINT)-1);
  359. }
  360. } else {
  361. MessageBeep((UINT)-1);
  362. }
  363. ImmUnlockIMC(hIMC);
  364. return;
  365. }
  366. /**********************************************************************/
  367. /* StatusSetCursor() */
  368. /**********************************************************************/
  369. void PASCAL StatusSetCursor(
  370. HWND hStatusWnd,
  371. LPARAM lParam)
  372. {
  373. POINT ptCursor, ptSavCursor;
  374. RECT rcWnd;
  375. if (GetWindowLong(hStatusWnd, UI_MOVE_OFFSET) != WINDOW_NOT_DRAG) {
  376. SetCursor(LoadCursor(NULL, IDC_SIZEALL));
  377. return;
  378. }
  379. GetCursorPos(&ptCursor);
  380. ptSavCursor = ptCursor;
  381. ScreenToClient(hStatusWnd, &ptCursor);
  382. if (PtInRect(&sImeG.rcStatusText, ptCursor)) {
  383. SetCursor(LoadCursor(hInst, szHandCursor));
  384. if (HIWORD(lParam) == WM_LBUTTONDOWN) {
  385. SetStatus(hStatusWnd, &ptCursor);
  386. } else if (HIWORD(lParam) == WM_RBUTTONUP) {
  387. if (PtInRect(&sImeG.rcSKText, ptCursor)) {
  388. static BOOL fSoftkey= FALSE;
  389. // prevent recursive
  390. if (fSoftkey) {
  391. // configuration already bring up
  392. return;
  393. }
  394. fSoftkey = TRUE;
  395. SoftkeyMenu(hStatusWnd, ptSavCursor.x, ptSavCursor.y);
  396. fSoftkey = FALSE;
  397. }else{
  398. static BOOL fCmenu=FALSE;
  399. // prevent recursive
  400. if (fCmenu) {
  401. // configuration already bring up
  402. return;
  403. }
  404. fCmenu = TRUE;
  405. ContextMenu(hStatusWnd, ptSavCursor.x, ptSavCursor.y);
  406. fCmenu = FALSE;
  407. }
  408. }
  409. return;
  410. } else {
  411. SetCursor(LoadCursor(NULL, IDC_SIZEALL));
  412. if (HIWORD(lParam) == WM_LBUTTONDOWN) {
  413. // start drag
  414. SystemParametersInfo(SPI_GETWORKAREA, 0, &sImeG.rcWorkArea, 0);
  415. } else {
  416. return;
  417. }
  418. }
  419. SetCapture(hStatusWnd);
  420. SetWindowLong(hStatusWnd, UI_MOVE_XY,
  421. MAKELONG(ptSavCursor.x, ptSavCursor.y));
  422. GetWindowRect(hStatusWnd, &rcWnd);
  423. SetWindowLong(hStatusWnd, UI_MOVE_OFFSET,
  424. MAKELONG(ptSavCursor.x - rcWnd.left, ptSavCursor.y - rcWnd.top));
  425. DrawDragBorder(hStatusWnd, MAKELONG(ptSavCursor.x, ptSavCursor.y),
  426. GetWindowLong(hStatusWnd, UI_MOVE_OFFSET));
  427. return;
  428. }
  429. /**********************************************************************/
  430. /* PaintStatusWindow() */
  431. /**********************************************************************/
  432. void PASCAL PaintStatusWindow(
  433. HDC hDC,
  434. HWND hStatusWnd)
  435. {
  436. HWND hUIWnd;
  437. HIMC hIMC;
  438. LPINPUTCONTEXT lpIMC;
  439. LPPRIVCONTEXT lpImcP;
  440. HGDIOBJ hOldFont;
  441. HBITMAP hImeIconBmp, hShapeBmp, hSymbolBmp, hSKBmp;
  442. HBITMAP hOldBmp;
  443. HDC hMemDC;
  444. hUIWnd = GetWindow(hStatusWnd, GW_OWNER);
  445. if (!hUIWnd) {
  446. MessageBeep((UINT)-1);
  447. return;
  448. }
  449. hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC);
  450. if (!hIMC) {
  451. MessageBeep((UINT)-1);
  452. return;
  453. }
  454. if (!(lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC))) {
  455. MessageBeep((UINT)-1);
  456. return;
  457. }
  458. // get lpImcP
  459. if(!(lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate))) {
  460. MessageBeep((UINT)-1);
  461. return;
  462. }
  463. // set font
  464. if (sImeG.fDiffSysCharSet) {
  465. LOGFONT lfFont;
  466. ZeroMemory(&lfFont, sizeof(lfFont));
  467. hOldFont = GetCurrentObject(hDC, OBJ_FONT);
  468. lfFont.lfHeight = -MulDiv(12, GetDeviceCaps(hDC, LOGPIXELSY), 72);
  469. lfFont.lfCharSet = NATIVE_CHARSET;
  470. lstrcpy(lfFont.lfFaceName, TEXT("Simsun"));
  471. SelectObject(hDC, CreateFontIndirect(&lfFont));
  472. }
  473. // draw Ime Name
  474. {
  475. if (lpIMC->fOpen) {
  476. SetTextColor(hDC, RGB(0x00, 0x00, 0x00));
  477. } else {
  478. SetTextColor(hDC, RGB(0x80, 0x80, 0x80));
  479. }
  480. SetBkColor(hDC, RGB(0xC0, 0xC0, 0xC0));
  481. DrawText(hDC, MBIndex.MBDesc[0].szName, lstrlen(MBIndex.MBDesc[0].szName),
  482. &sImeG.rcImeName, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  483. }
  484. DrawConvexRect(hDC,
  485. sImeG.rcImeName.left,
  486. sImeG.rcImeName.top,
  487. sImeG.rcImeName.right - 1,
  488. sImeG.rcImeName.bottom - 1);
  489. DrawConvexRectP(hDC,
  490. sImeG.rcImeName.left,
  491. sImeG.rcImeName.top,
  492. sImeG.rcImeName.right,
  493. sImeG.rcImeName.bottom);
  494. // load all bitmap
  495. hSymbolBmp = (HBITMAP)NULL;
  496. hShapeBmp = (HBITMAP)NULL;
  497. hSKBmp = (HBITMAP)NULL;
  498. if (!lpIMC->fOpen) {
  499. hSymbolBmp = LoadBitmap(hInst, szNone);
  500. hShapeBmp = LoadBitmap(hInst, szNone);
  501. hSKBmp = LoadBitmap(hInst, szNone);
  502. hImeIconBmp = LoadBitmap(hInst, szChinese);
  503. } else if (lpIMC->fdwConversion & IME_CMODE_NATIVE) {
  504. if(!lpImcP->PrivateArea.Comp_Status.OnLineCreWord){
  505. hImeIconBmp = LoadBitmap(hInst, szChinese);
  506. } else {
  507. hImeIconBmp = LoadBitmap(hInst, szCZ);
  508. }
  509. } else {
  510. hImeIconBmp = LoadBitmap(hInst, szEnglish);
  511. }
  512. if (!hShapeBmp) {
  513. if (lpIMC->fdwConversion & IME_CMODE_FULLSHAPE) {
  514. hShapeBmp = LoadBitmap(hInst, szFullShape);
  515. } else {
  516. hShapeBmp = LoadBitmap(hInst, szHalfShape);
  517. }
  518. }
  519. if (!hSymbolBmp) {
  520. if (lpIMC->fdwConversion & IME_CMODE_SYMBOL) {
  521. hSymbolBmp = LoadBitmap(hInst, szSymbol);
  522. } else {
  523. hSymbolBmp = LoadBitmap(hInst, szNoSymbol);
  524. }
  525. }
  526. if (!hSKBmp) {
  527. if (lpIMC->fdwConversion & IME_CMODE_SOFTKBD) {
  528. hSKBmp = LoadBitmap(hInst, szSoftKBD);
  529. } else {
  530. hSKBmp = LoadBitmap(hInst, szNoSoftKBD);
  531. }
  532. }
  533. ImmUnlockIMC(hIMC);
  534. ImmUnlockIMCC(lpIMC->hPrivate);
  535. hMemDC = CreateCompatibleDC(hDC);
  536. hOldBmp = SelectObject(hMemDC, hImeIconBmp);
  537. BitBlt(hDC, sImeG.rcImeIcon.left, sImeG.rcImeIcon.top,
  538. sImeG.rcImeIcon.right - sImeG.rcImeIcon.left,
  539. STATUS_DIM_Y,
  540. hMemDC, 0, 0, SRCCOPY);
  541. SelectObject(hMemDC, hShapeBmp);
  542. BitBlt(hDC, sImeG.rcShapeText.left, sImeG.rcShapeText.top,
  543. sImeG.rcShapeText.right - sImeG.rcShapeText.left,
  544. STATUS_DIM_Y,
  545. hMemDC, 0, 0, SRCCOPY);
  546. SelectObject(hMemDC, hSymbolBmp);
  547. BitBlt(hDC, sImeG.rcSymbol.left, sImeG.rcSymbol.top,
  548. sImeG.rcSymbol.right - sImeG.rcSymbol.left,
  549. STATUS_DIM_Y,
  550. hMemDC, 0, 0, SRCCOPY);
  551. SelectObject(hMemDC, hSKBmp);
  552. BitBlt(hDC, sImeG.rcSKText.left, sImeG.rcSKText.top,
  553. sImeG.xStatusWi - sImeG.rcSKText.left,
  554. STATUS_DIM_Y,
  555. hMemDC, 0, 0, SRCCOPY);
  556. SelectObject(hMemDC, hOldBmp);
  557. DeleteDC(hMemDC);
  558. DeleteObject(hImeIconBmp);
  559. DeleteObject(hSymbolBmp);
  560. DeleteObject(hShapeBmp);
  561. DeleteObject(hSKBmp);
  562. if (sImeG.fDiffSysCharSet) {
  563. DeleteObject(SelectObject(hDC, hOldFont));
  564. }
  565. return;
  566. }
  567. /**********************************************************************/
  568. /* StatusWndProc() */
  569. /**********************************************************************/
  570. LRESULT CALLBACK StatusWndProc(
  571. HWND hStatusWnd,
  572. UINT uMsg,
  573. WPARAM wParam,
  574. LPARAM lParam)
  575. {
  576. switch (uMsg) {
  577. case WM_DESTROY:
  578. DestroyStatusWindow(hStatusWnd);
  579. break;
  580. case WM_SETCURSOR:
  581. StatusSetCursor(hStatusWnd, lParam);
  582. break;
  583. case WM_MOUSEMOVE:
  584. if (GetWindowLong(hStatusWnd, UI_MOVE_OFFSET) != WINDOW_NOT_DRAG) {
  585. POINT ptCursor;
  586. DrawDragBorder(hStatusWnd,
  587. GetWindowLong(hStatusWnd, UI_MOVE_XY),
  588. GetWindowLong(hStatusWnd, UI_MOVE_OFFSET));
  589. GetCursorPos(&ptCursor);
  590. SetWindowLong(hStatusWnd, UI_MOVE_XY,
  591. MAKELONG(ptCursor.x, ptCursor.y));
  592. DrawDragBorder(hStatusWnd, MAKELONG(ptCursor.x, ptCursor.y),
  593. GetWindowLong(hStatusWnd, UI_MOVE_OFFSET));
  594. } else {
  595. return DefWindowProc(hStatusWnd, uMsg, wParam, lParam);
  596. }
  597. break;
  598. case WM_LBUTTONUP:
  599. if (GetWindowLong(hStatusWnd, UI_MOVE_OFFSET) != WINDOW_NOT_DRAG) {
  600. LONG lTmpCursor, lTmpOffset;
  601. lTmpCursor = GetWindowLong(hStatusWnd, UI_MOVE_XY);
  602. // calculate the org by the offset
  603. lTmpOffset = GetWindowLong(hStatusWnd, UI_MOVE_OFFSET);
  604. DrawDragBorder(hStatusWnd, lTmpCursor, lTmpOffset);
  605. (*(LPPOINTS)&lTmpCursor).x -= (*(LPPOINTS)&lTmpOffset).x;
  606. (*(LPPOINTS)&lTmpCursor).y -= (*(LPPOINTS)&lTmpOffset).y;
  607. SetWindowLong(hStatusWnd, UI_MOVE_OFFSET, WINDOW_NOT_DRAG);
  608. ReleaseCapture();
  609. AdjustStatusBoundary((LPPOINTS)&lTmpCursor,
  610. GetWindow(hStatusWnd, GW_OWNER));
  611. SendMessage(GetWindow(hStatusWnd, GW_OWNER), WM_IME_CONTROL,
  612. IMC_SETSTATUSWINDOWPOS, lTmpCursor);
  613. } else {
  614. return DefWindowProc(hStatusWnd, uMsg, wParam, lParam);
  615. }
  616. break;
  617. case WM_IME_NOTIFY:
  618. // get work area for changing
  619. SystemParametersInfo(SPI_GETWORKAREA, 0, &sImeG.rcWorkArea, 0);
  620. if (wParam == IMN_SETSTATUSWINDOWPOS) {
  621. SetStatusWindowPos(hStatusWnd);
  622. }
  623. break;
  624. case WM_PAINT:
  625. {
  626. HDC hDC;
  627. PAINTSTRUCT ps;
  628. hDC = BeginPaint(hStatusWnd, &ps);
  629. PaintStatusWindow(hDC, hStatusWnd);
  630. EndPaint(hStatusWnd, &ps);
  631. }
  632. break;
  633. case WM_MOUSEACTIVATE:
  634. return (MA_NOACTIVATE);
  635. default:
  636. return DefWindowProc(hStatusWnd, uMsg, wParam, lParam);
  637. }
  638. return (0L);
  639. }
  640. ///////
  641. int CheckCodeKey (TCHAR szInputCode[]);
  642. BOOL CrtIsUsedCode(TCHAR wCharCode);
  643. int CheckKey (TCHAR szInputWord[]);
  644. void BreakString (LPTSTR, LPTSTR, LPTSTR);
  645. int DelItem (HIMCC, LPTSTR, LPTSTR);
  646. void AddStringTolist ( LPINPUTCONTEXT lpIMC, HWND hDlg);
  647. BOOL GetUDCItem(HIMCC, UINT, LPTSTR, LPTSTR);
  648. void DelSelCU (HIMCC, int);
  649. int GetUDCIndex(HIMCC, LPTSTR, LPTSTR);
  650. INT_PTR CALLBACK ListWordProc(HWND, UINT, WPARAM, LPARAM);
  651. INT_PTR CALLBACK ModiWordDlgProc(HWND, UINT, WPARAM, LPARAM);
  652. FARPROC lpListWordOld;
  653. #define LBN_DELETE 6
  654. static TCHAR szModiWord [MAXINPUTWORD + 1];
  655. static TCHAR szModiCode [MAXCODE + 1];
  656. /**********************************************************************/
  657. /* CrtWordDlgProc() */
  658. /* Return Value: */
  659. /* TRUE - successful, FALSE - failure */
  660. /**********************************************************************/
  661. INT_PTR CALLBACK CrtWordDlgProc(
  662. HWND hDlg,
  663. UINT uMessage,
  664. WPARAM wParam,
  665. LPARAM lParam)
  666. {
  667. RECT rc;
  668. LONG DlgWidth, DlgHeight;
  669. static TCHAR szInputWord [MAXINPUTWORD + 1];
  670. static TCHAR szInputCode [MAXCODE + 1];
  671. static TCHAR szInputWordOld [MAXINPUTWORD + 1] ;
  672. static TCHAR szInputCodeOld [MAXCODE + 1] ;
  673. switch (uMessage) {
  674. case WM_PAINT:
  675. {
  676. GetClientRect(hDlg, &rc);
  677. DrawConvexRect(GetDC(hDlg),
  678. rc.left + 10,
  679. rc.top + 10,
  680. rc.right - 10 - 1,
  681. rc.bottom - 20 - 1);
  682. DrawConvexRectP(GetDC(hDlg),
  683. rc.left + 10,
  684. rc.top + 10,
  685. rc.right - 10,
  686. rc.bottom - 20);
  687. }
  688. return (FALSE);
  689. case WM_INITDIALOG:
  690. {
  691. TCHAR szStr[54];
  692. HDC hDC;
  693. DWORD nStrLenth;
  694. RECT rcWorkArea;
  695. hCrtDlg = hDlg;
  696. #ifdef UNICODE
  697. {
  698. TCHAR UniTmp1[] = {0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x0000};
  699. TCHAR UniTmp2[] = {0x96F6, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D, 0x96F6, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D, 0x0000};
  700. MyStrFormat (szStr, sizeof(szStr)/sizeof(szStr[0]), UniTmp1, UniTmp2);
  701. }
  702. #else
  703. MyStrFormat (szStr, sizeof(szStr)/sizeof(szStr[0]), TEXT("mmmmmmmmmmmm"), TEXT("��һ�����������߰˾���һ�����������߰˾�"));
  704. #endif //UNICODE
  705. // reset position
  706. GetWindowRect(hDlg, &rc);
  707. DlgWidth = rc.right - rc.left;
  708. DlgHeight = rc.bottom - rc.top;
  709. rcWorkArea = ImeMonitorWorkAreaFromWindow(hDlg);
  710. SetWindowPos(hDlg, HWND_TOP,
  711. (int)(rcWorkArea.right - DlgWidth)/2,
  712. (int)(rcWorkArea.bottom - DlgHeight)/2,
  713. (int)0, (int)0, SWP_NOSIZE);
  714. CheckRadioButton (hDlg, IDC_RADIOADD, IDC_RADIOMOD, IDC_RADIOADD);
  715. lpListWordOld = (FARPROC)GetWindowLongPtr(GetDlgItem (hDlg,IDC_LIST_WORD),
  716. GWLP_WNDPROC);
  717. SetWindowLongPtr(GetDlgItem (hDlg,IDC_LIST_WORD), GWLP_WNDPROC,
  718. (LONG_PTR)ListWordProc);
  719. EnableWindow (GetDlgItem (hDlg,IDC_BT_MODIFY), FALSE);
  720. EnableWindow (GetDlgItem (hDlg,IDC_BT_DEL), FALSE);
  721. EnableWindow (GetDlgItem (hDlg,IDC_INPUTWORD), TRUE);
  722. EnableWindow (GetDlgItem (hDlg,IDC_INPUTCODE), TRUE);
  723. EnableWindow (GetDlgItem (hDlg,IDC_BT_INS), TRUE);
  724. SendDlgItemMessage (hDlg, IDC_INPUTWORD, EM_LIMITTEXT, MAXINPUTWORD, 0);
  725. SendDlgItemMessage (hDlg, IDC_INPUTCODE, EM_LIMITTEXT, MBIndex.MBDesc[0].wMaxCodes, 0);
  726. hDC = GetDC (hDlg);
  727. nStrLenth = GetTabbedTextExtent (hDC, szStr, lstrlen(szStr), 0, (LPINT)NULL);
  728. ReleaseDC (hDlg, hDC);
  729. SendDlgItemMessage (hDlg, IDC_LIST_WORD, LB_SETHORIZONTALEXTENT, nStrLenth, 0);
  730. return (TRUE); // don't want to set focus to special control
  731. }
  732. case WM_COMMAND:
  733. switch (LOWORD(wParam)) {
  734. case IDC_RADIOADD:
  735. EnableWindow (GetDlgItem (hDlg,IDC_BT_MODIFY), FALSE);
  736. EnableWindow (GetDlgItem (hDlg,IDC_BT_DEL), FALSE);
  737. EnableWindow (GetDlgItem (hDlg,IDC_INPUTWORD), TRUE);
  738. EnableWindow (GetDlgItem (hDlg,IDC_INPUTCODE), TRUE);
  739. EnableWindow (GetDlgItem (hDlg,IDC_STATIC), TRUE);
  740. EnableWindow (GetDlgItem (hDlg,IDC_BT_INS), TRUE);
  741. SendDlgItemMessage (hDlg, IDC_BT_INS, BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE);
  742. SendDlgItemMessage (hDlg, IDC_CLOSE, BM_SETSTYLE, BS_PUSHBUTTON, TRUE);
  743. SendDlgItemMessage (hDlg, IDC_LIST_WORD, LB_RESETCONTENT, 0, 0L);
  744. SetFocus (GetDlgItem (hDlg, IDC_INPUTWORD));
  745. break;
  746. case IDC_RADIOMOD:
  747. EnableWindow (GetDlgItem (hDlg,IDC_BT_MODIFY), TRUE);
  748. EnableWindow (GetDlgItem (hDlg,IDC_BT_DEL), TRUE);
  749. EnableWindow (GetDlgItem (hDlg,IDC_INPUTWORD), FALSE);
  750. EnableWindow (GetDlgItem (hDlg,IDC_INPUTCODE), FALSE);
  751. EnableWindow (GetDlgItem (hDlg,IDC_STATIC), FALSE);
  752. EnableWindow (GetDlgItem (hDlg,IDC_BT_INS), FALSE);
  753. SendDlgItemMessage (hDlg, IDC_CLOSE, BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE);
  754. SendDlgItemMessage (hDlg, IDC_BT_INS, BM_SETSTYLE, BS_PUSHBUTTON, TRUE);
  755. SendDlgItemMessage (hDlg, IDC_LIST_WORD, LB_RESETCONTENT, 0, 0L);
  756. SetDlgItemText (hDlg,IDC_INPUTCODE, TEXT(""));
  757. SetDlgItemText (hDlg,IDC_INPUTWORD, TEXT(""));
  758. lstrcpy (szInputWordOld, TEXT(""));
  759. lstrcpy (szInputCodeOld, TEXT(""));
  760. {
  761. HIMC hIMC;
  762. LPINPUTCONTEXT lpIMC;
  763. HCURSOR hOldCursor;
  764. WORD wTabStops [1];
  765. wTabStops[0] = 80;
  766. hIMC = (HIMC)ImmGetContext(GetParent(hDlg));
  767. if (!hIMC) {
  768. return (0L);
  769. }
  770. lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
  771. if (!lpIMC) { // Oh! Oh!
  772. return (0L);
  773. }
  774. hOldCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
  775. SendDlgItemMessage (hDlg, IDC_LIST_WORD, LB_SETTABSTOPS, 1, (LPARAM)&wTabStops[0]);
  776. AddStringTolist (lpIMC, hDlg);
  777. SetCursor(hOldCursor);
  778. ImmUnlockIMC(hIMC);
  779. ImmReleaseContext (GetParent(hDlg), hIMC);
  780. }
  781. SetFocus (GetDlgItem (hDlg,IDC_LIST_WORD));
  782. break;
  783. case IDC_INPUTCODE:
  784. {
  785. HIMC hIMC;
  786. hIMC = (HIMC)ImmGetContext(hDlg);
  787. if (!hIMC) {
  788. return FALSE;
  789. }
  790. switch(HIWORD(wParam)) {
  791. case EN_SETFOCUS:
  792. if(hIMC) {
  793. ImmSetOpenStatus(hIMC, FALSE);
  794. ImmUnlockIMC(hIMC);
  795. }
  796. break;
  797. case EN_KILLFOCUS:
  798. if(hIMC) {
  799. ImmSetOpenStatus(hIMC, TRUE);
  800. ImmUnlockIMC(hIMC);
  801. }
  802. break;
  803. default:
  804. break;
  805. }
  806. }
  807. GetDlgItemText (hDlg, IDC_INPUTCODE, szInputCode, MAXCODE);
  808. if (SendDlgItemMessage(hDlg,IDC_INPUTCODE,EM_GETMODIFY,0,0)){
  809. int i, CaretPos;
  810. GetDlgItemText (hDlg, IDC_INPUTCODE, szInputCode, MAXCODE);
  811. if (((CaretPos = CheckCodeKey (szInputCode)) != (-1))) {
  812. StringCbCopy(szInputCode, sizeof(szInputCode), szInputCodeOld);
  813. SetDlgItemText (hDlg,IDC_INPUTCODE, szInputCode);
  814. for (i = 0; i < 1; i++){
  815. MessageBeep (0xFFFFFFFF);
  816. }
  817. }
  818. StringCbCopy (szInputCodeOld, sizeof(szInputCodeOld), szInputCode);
  819. }
  820. break;
  821. case IDC_INPUTWORD:
  822. GetDlgItemText (hDlg, IDC_INPUTWORD, szInputWord, MAXINPUTWORD);
  823. if (SendDlgItemMessage(hDlg,IDC_INPUTWORD,EM_GETMODIFY,0,0)){
  824. int i, CaretPos;
  825. GetDlgItemText(hDlg,IDC_INPUTWORD,szInputWord,MAXINPUTWORD);
  826. if (((CaretPos = CheckKey (szInputWord)) != (-1))) {
  827. StringCbCopy(szInputWord, sizeof(szInputWord), szInputWordOld);
  828. SetDlgItemText (hDlg,IDC_INPUTWORD, szInputWord);
  829. SendDlgItemMessage(hDlg,
  830. IDC_INPUTWORD,
  831. EM_SETSEL,
  832. CaretPos,
  833. CaretPos);
  834. for (i = 0; i < 1; i++){
  835. MessageBeep (0xFFFFFFFF);
  836. }
  837. }
  838. if (MBIndex.MBDesc[0].wNumRulers != 0){
  839. TCHAR MBName[MAXSTRLEN];
  840. static TCHAR szAutoCode [MAXCODE + 1];
  841. HIMC hIMC;
  842. LPINPUTCONTEXT lpIMC;
  843. LPPRIVCONTEXT lpImcP;
  844. hIMC = (HIMC)ImmGetContext(GetParent(hDlg));
  845. if (!hIMC) {
  846. return (0L);
  847. }
  848. lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
  849. if (!lpIMC) { // Oh! Oh!
  850. return (0L);
  851. }
  852. lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
  853. if (!lpImcP) { // Oh! Oh!
  854. return (0L);
  855. }
  856. // auto coding
  857. StringCbCopy(MBName, sizeof(MBName), sImeG.szIMESystemPath);
  858. StringCbCat(MBName,sizeof(MBName), TEXT("\\"));
  859. StringCbCat(MBName, sizeof(MBName), (LPCTSTR)lpImcP->MB_Name);
  860. ConvCreateWord(lpIMC->hWnd,
  861. (LPCTSTR)MBName,
  862. (LPTSTR)szInputWord,
  863. (LPTSTR)szAutoCode);
  864. ImmUnlockIMC(hIMC);
  865. ImmUnlockIMCC(lpIMC->hPrivate);
  866. ImmReleaseContext (GetParent(hDlg), hIMC);
  867. SetDlgItemText (hDlg,IDC_INPUTCODE, szAutoCode);
  868. SendDlgItemMessage(hDlg,IDC_INPUTCODE,EM_SETSEL, 0, -1);
  869. StringCbCopy (szInputCodeOld, sizeof(szInputCodeOld), szAutoCode);
  870. }
  871. StringCbCopy (szInputWordOld, sizeof(szInputWordOld), szInputWord);
  872. }
  873. break;
  874. case IDC_LIST_WORD:
  875. if (SendDlgItemMessage(hDlg,IDC_RADIOADD,BM_GETCHECK,0,0))
  876. break;
  877. if (HIWORD(wParam) == LBN_DBLCLK) {
  878. SendMessage(hDlg,WM_COMMAND,MAKELONG(IDC_BT_MODIFY,0),0);
  879. break;
  880. }
  881. if (!(HIWORD(wParam) == LBN_DELETE)) {
  882. break;
  883. }
  884. MessageBeep (0xFFFFFFFF);
  885. case IDC_BT_DEL:
  886. {
  887. HIMC hIMC;
  888. LPINPUTCONTEXT lpIMC;
  889. TCHAR szList [80];
  890. TCHAR szCode [MAXCODE + 1];
  891. TCHAR szWord [MAXINPUTWORD + 1];
  892. WORD nLenth;
  893. int SelFlag;
  894. int SelIndex [MAXNUMBER_EMB], NewIndex;
  895. WORD SelCount, i;
  896. if ((SelCount=(WORD)SendDlgItemMessage(hDlg,
  897. IDC_LIST_WORD,
  898. LB_GETSELITEMS,
  899. (WPARAM)MAXNUMBER_EMB,
  900. (LPARAM)SelIndex)) == LB_ERR)
  901. break;
  902. if(SelCount) {
  903. TCHAR szDelMessageString [40];
  904. wsprintf (szDelMessageString, TEXT("%d"), SelCount);
  905. #ifdef UNICODE
  906. {
  907. TCHAR UniTmp[] = {0x0020, 0x4E2A, 0x8BCD, 0x6761,
  908. 0x5C06, 0x88AB, 0x5220, 0x9664,
  909. 0x0021, 0x0020, 0x0020, 0x0020,
  910. 0x0020, 0x0020, 0x0020, 0x0020,
  911. 0x0020, 0x0000};
  912. lstrcat (szDelMessageString, UniTmp);
  913. }
  914. #else
  915. lstrcat(szDelMessageString,
  916. TEXT(" ����������ɾ��! "));
  917. #endif
  918. if (IDNO == MessageBox (hDlg,
  919. szDelMessageString,
  920. szWarnTitle,
  921. MB_YESNO|MB_ICONINFORMATION))
  922. break;
  923. } else {
  924. break;
  925. }
  926. hIMC = (HIMC)ImmGetContext(GetParent(hDlg));
  927. if (!hIMC) {
  928. return 0L;
  929. }
  930. lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
  931. if (!lpIMC) { // Oh! Oh!
  932. return (0L);
  933. }
  934. for (i = 0; i < SelCount; i++){
  935. nLenth = (WORD)SendDlgItemMessage(hDlg,
  936. IDC_LIST_WORD,
  937. LB_GETTEXT,
  938. (WPARAM)SelIndex[SelCount-i-1],
  939. (LPARAM)(LPTSTR)szList);
  940. if ( nLenth == LB_ERR) break;
  941. BreakString((LPTSTR)szList,(LPTSTR)szCode,(LPTSTR)szWord);
  942. NewIndex=GetUDCIndex(lpIMC->hPrivate,
  943. (LPTSTR)szCode,
  944. (LPTSTR)szWord);
  945. DelSelCU (lpIMC->hPrivate, NewIndex);
  946. #ifdef EUDC
  947. if(strlen((const char *)szWord) == sizeof(WORD)){
  948. ImeUnregisterWord(szCode,IME_REGWORD_STYLE_EUDC,szWord);
  949. }
  950. #endif
  951. //For modify
  952. SendDlgItemMessage (hDlg,IDC_LIST_WORD,
  953. LB_DELETESTRING, SelIndex [SelCount - i - 1], 0L);
  954. SelFlag = SelIndex [SelCount - i - 1];
  955. }
  956. if (SelFlag>=SendDlgItemMessage(hDlg,IDC_LIST_WORD,
  957. LB_GETCOUNT, 0,0)){
  958. SelFlag = (int) SendDlgItemMessage(hDlg,
  959. IDC_LIST_WORD,
  960. LB_GETCOUNT,
  961. (WPARAM)0,
  962. (LPARAM)0) -1;
  963. } // Keep current item
  964. SendDlgItemMessage (hDlg,IDC_LIST_WORD,
  965. LB_SELITEMRANGE, 1, MAKELONG(SelFlag, SelFlag));
  966. SendDlgItemMessage (hDlg,IDC_LIST_WORD,
  967. LB_SETCARETINDEX, SelFlag, 0L);
  968. ImmUnlockIMC(hIMC);
  969. ImmReleaseContext (GetParent(hDlg), hIMC);
  970. SetFocus (GetDlgItem (hDlg, IDC_LIST_WORD));
  971. break;
  972. }
  973. case IDC_BT_MODIFY:
  974. {
  975. // get string in listbox
  976. TCHAR szList [80];
  977. WORD nLenth;
  978. int SelIndex [50];
  979. WORD SelCount;
  980. SelCount=(WORD)SendDlgItemMessage(hDlg,
  981. IDC_LIST_WORD,
  982. LB_GETSELITEMS,
  983. (WPARAM)50,
  984. (LPARAM)SelIndex);
  985. if ((SelCount == LB_ERR)||(SelCount != 1)) break;
  986. nLenth=(WORD)SendDlgItemMessage(hDlg,
  987. IDC_LIST_WORD,
  988. LB_GETTEXT,
  989. (WPARAM)SelIndex[0],
  990. (LPARAM)(LPTSTR)szList);
  991. if (nLenth == LB_ERR) break;
  992. BreakString((LPTSTR)szList,
  993. (LPTSTR)szModiCode,
  994. (LPTSTR)szModiWord);
  995. SendDlgItemMessage (hDlg,IDC_LIST_WORD,
  996. LB_DELETESTRING, SelIndex [0], 0L);
  997. }
  998. DialogBox(hInst, TEXT("MODIWORD"), hDlg, ModiWordDlgProc);
  999. SetFocus(GetDlgItem (hDlg, IDC_BT_MODIFY));
  1000. SendDlgItemMessage (hDlg,
  1001. IDC_BT_MODIFY,
  1002. BM_SETSTYLE,
  1003. BS_DEFPUSHBUTTON,
  1004. TRUE);
  1005. {
  1006. TCHAR WCodeStr[MAXCODE + 1];
  1007. TCHAR DBCSStr [MAXINPUTWORD + 1];
  1008. TCHAR szOutList[80];
  1009. int ModiIndex;
  1010. StringCbCopy (WCodeStr, sizeof(WCodeStr), szModiCode);
  1011. StringCbCopy(DBCSStr , sizeof(DBCSStr), szModiWord);
  1012. MyStrFormat (szOutList, sizeof(szOutList)/sizeof(szOutList[0]), WCodeStr, DBCSStr);
  1013. SendDlgItemMessage (hDlg,
  1014. IDC_LIST_WORD,
  1015. LB_ADDSTRING,
  1016. (WPARAM)0,
  1017. (LPARAM)(LPTSTR)szOutList);
  1018. ModiIndex =(int)SendDlgItemMessage(hDlg,
  1019. IDC_LIST_WORD,
  1020. LB_FINDSTRING,
  1021. (WPARAM) -1,
  1022. (LPARAM)(LPTSTR)szOutList);
  1023. SendDlgItemMessage (hDlg,IDC_LIST_WORD,
  1024. LB_SELITEMRANGE,
  1025. 1,
  1026. MAKELONG(ModiIndex, ModiIndex));
  1027. SendDlgItemMessage (hDlg,IDC_LIST_WORD,
  1028. LB_SETCARETINDEX,
  1029. ModiIndex,
  1030. 0L);
  1031. SetFocus (GetDlgItem (hDlg, IDC_BT_MODIFY));
  1032. }
  1033. break;
  1034. case IDC_BT_INS:
  1035. {
  1036. HIMC hIMC;
  1037. LPINPUTCONTEXT lpIMC;
  1038. int fAddWordFlag;
  1039. HWND hControl;
  1040. TCHAR szListWord [80];
  1041. {
  1042. TCHAR szWord [MAXINPUTWORD + 1];
  1043. TCHAR szCode1 [MAXCODE + 1] ;
  1044. GetDlgItemText(hDlg,IDC_INPUTWORD,szWord,MAXINPUTWORD);
  1045. GetDlgItemText (hDlg, IDC_INPUTCODE, szCode1, MAXCODE);
  1046. if (lstrlen(szWord) == 0){
  1047. SetFocus (GetDlgItem (hDlg,IDC_INPUTWORD));
  1048. break;
  1049. } else if (lstrlen(szCode1) == 0){
  1050. SetFocus (GetDlgItem (hDlg,IDC_INPUTCODE));
  1051. break;
  1052. }
  1053. }
  1054. GetDlgItemText(hDlg,IDC_INPUTWORD,szInputWord,MAXINPUTWORD);
  1055. GetDlgItemText (hDlg, IDC_INPUTCODE, szInputCode, MAXCODE);
  1056. MyStrFormat (szListWord, sizeof(szListWord)/sizeof(szListWord[0]), szInputCode, szInputWord);
  1057. if(lstrlen(szInputWord) && lstrlen(szInputCode)) {
  1058. hIMC = (HIMC)ImmGetContext(GetParent (hDlg));
  1059. if (!hIMC) {
  1060. return 0L;
  1061. }
  1062. lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
  1063. if (!lpIMC) { // Oh! Oh!
  1064. return (0L);
  1065. }
  1066. CharLowerBuff(szInputCode, lstrlen(szInputCode));
  1067. {
  1068. UINT i;
  1069. for(i=0;i<strlen((const char *)szInputCode);i++){
  1070. if(!IsUsedCode(szInputCode[i], NULL)){
  1071. InfoMessage(NULL, IDS_WARN_INVALIDCODE);
  1072. ImmUnlockIMC(hIMC);
  1073. ImmReleaseContext(GetParent(GetParent(hDlg)),
  1074. hIMC);
  1075. return(0L);
  1076. }
  1077. }
  1078. }
  1079. fAddWordFlag = AddZCItem(lpIMC->hPrivate,
  1080. szInputCode,
  1081. szInputWord);
  1082. ImmUnlockIMC(hIMC);
  1083. ImmReleaseContext (GetParent(hDlg), hIMC);
  1084. if (fAddWordFlag == ADD_REP){
  1085. InfoMessage(NULL, IDS_WARN_DUPPRASE);
  1086. break;
  1087. } else if (fAddWordFlag == ADD_FULL){
  1088. InfoMessage(NULL, IDS_WARN_OVEREMB);
  1089. break;
  1090. }
  1091. hControl = GetDlgItem (hDlg,IDC_LIST_WORD);
  1092. SendMessage (hControl, LB_ADDSTRING, (WPARAM) 0,
  1093. (LPARAM)(LPTSTR)szListWord);
  1094. } else {
  1095. szInputWord[0] = 0;
  1096. szInputCode[0] = 0;
  1097. }
  1098. }
  1099. SetDlgItemText (hDlg,IDC_INPUTWORD, TEXT(""));
  1100. SetDlgItemText (hDlg,IDC_INPUTCODE, TEXT(""));
  1101. lstrcpy (szInputWordOld, TEXT(""));
  1102. lstrcpy (szInputCodeOld, TEXT(""));
  1103. SetFocus (GetDlgItem (hDlg,IDC_INPUTWORD));
  1104. break;
  1105. case IDC_CLOSE:
  1106. hCrtDlg = NULL;
  1107. lstrcpy (szInputWordOld, TEXT(""));
  1108. lstrcpy (szInputCodeOld, TEXT(""));
  1109. EndDialog (hDlg, FALSE);
  1110. break;
  1111. case IDCANCEL:
  1112. hCrtDlg = NULL;
  1113. lstrcpy (szInputWordOld, TEXT(""));
  1114. lstrcpy (szInputCodeOld, TEXT(""));
  1115. EndDialog(hDlg, FALSE);
  1116. break;
  1117. default:
  1118. return (FALSE);
  1119. break;
  1120. }
  1121. return (TRUE);
  1122. case WM_CLOSE:
  1123. if (hChildDlg) SendMessage(hChildDlg, WM_CLOSE, 0, 0);
  1124. hCrtDlg = NULL;
  1125. lstrcpy (szInputWordOld, TEXT(""));
  1126. lstrcpy (szInputCodeOld, TEXT(""));
  1127. EndDialog(hDlg, FALSE);
  1128. return (TRUE);
  1129. default:
  1130. return (FALSE);
  1131. }
  1132. return (TRUE);
  1133. }
  1134. /*********************************************************************/
  1135. /* void AddStringTolist ( LPINPUTCONTEXT lpIMC) */
  1136. /*********************************************************************/
  1137. void AddStringTolist ( LPINPUTCONTEXT lpIMC,
  1138. HWND hDlg)
  1139. {
  1140. TCHAR WCodeStr[MAXCODE + 1];
  1141. TCHAR DBCSStr [MAXINPUTWORD + 1];
  1142. TCHAR szOutList[80];
  1143. int i = 0, n = 0;
  1144. while (GetUDCItem(lpIMC->hPrivate, i, (LPTSTR)WCodeStr, (LPTSTR)DBCSStr)){
  1145. MyStrFormat(szOutList, sizeof(szOutList)/sizeof(szOutList[0]), WCodeStr, DBCSStr);
  1146. SendDlgItemMessage (hDlg, IDC_LIST_WORD, LB_ADDSTRING, (WPARAM)0,
  1147. (LPARAM)(LPTSTR)szOutList);
  1148. i ++;
  1149. }
  1150. }
  1151. /*********************************************************************/
  1152. /* int CheckKey (char szInputWord[]) */
  1153. /* */
  1154. /*********************************************************************/
  1155. int CheckKey (TCHAR szInputWord[])
  1156. {
  1157. int i;
  1158. #ifdef UNICODE
  1159. for (i = 0; i < lstrlen (szInputWord); i++ ){
  1160. if ((WORD)szInputWord [i] < 0x100) return i;
  1161. }
  1162. #else
  1163. for (i = 0; i < lstrlen (szInputWord); i += 2 ){
  1164. if ((BYTE)szInputWord [i] < 128) return i;
  1165. }
  1166. #endif
  1167. return (-1);
  1168. }
  1169. /************************************************************************/
  1170. /*BOOL CrtIsUsedCode(TCHAR wCharCode) */
  1171. /************************************************************************/
  1172. BOOL CrtIsUsedCode(TCHAR wCharCode)
  1173. {
  1174. WORD wFlg;
  1175. for(wFlg=0; wFlg<MBIndex.MBDesc[0].wNumCodes; wFlg++){
  1176. if (wCharCode == MBIndex.MBDesc[0].szUsedCode[wFlg])
  1177. break;
  1178. }
  1179. if(wFlg < MBIndex.MBDesc[0].wNumCodes)
  1180. return (TRUE);
  1181. return (FALSE);
  1182. }
  1183. /*********************************************************************/
  1184. /* int CheckCodeKey (TCHAR szInputCode[]) */
  1185. /* */
  1186. /*********************************************************************/
  1187. int CheckCodeKey (TCHAR szInputCode[])
  1188. {
  1189. int i;
  1190. for (i = 0; i < lstrlen (szInputCode); i++){
  1191. #ifdef UNICODE
  1192. if (szInputCode[i] > 0x100) return i;
  1193. #else
  1194. if ((BYTE)szInputCode [i] > 128) return i;
  1195. #endif
  1196. if(IsCharUpper(szInputCode [i])) {
  1197. szInputCode [i] |= 0x20;
  1198. }
  1199. if (!CrtIsUsedCode (szInputCode [i])) return i;
  1200. }
  1201. return (-1);
  1202. }
  1203. /********************************************************************/
  1204. /*INT_PTR CALLBACK ListWordProc( HWND hwnd, */
  1205. /* UINT uMessage, */
  1206. /* WPARAM wParam, */
  1207. /* LPARAM lParam) */
  1208. /********************************************************************/
  1209. INT_PTR CALLBACK ListWordProc(
  1210. HWND hwnd,
  1211. UINT uMessage,
  1212. WPARAM wParam,
  1213. LPARAM lParam)
  1214. {
  1215. switch (uMessage){
  1216. case WM_KEYDOWN:
  1217. if (wParam == VK_DELETE){
  1218. SendMessage (GetParent (hwnd), WM_COMMAND,
  1219. MAKELONG(IDC_LIST_WORD, (WORD)LBN_DELETE), (LPARAM)hwnd);
  1220. return TRUE;
  1221. }
  1222. break;
  1223. default :
  1224. break;
  1225. }
  1226. return (BOOL) CallWindowProc ((WNDPROC)lpListWordOld, hwnd, uMessage, wParam, lParam);
  1227. }
  1228. /**********************************************************************/
  1229. /* ModiWordDlgProc() */
  1230. /* Return Value: */
  1231. /* TRUE - successful, FALSE - failure */
  1232. /**********************************************************************/
  1233. INT_PTR CALLBACK ModiWordDlgProc(
  1234. HWND hDlg,
  1235. UINT uMessage,
  1236. WPARAM wParam,
  1237. LPARAM lParam)
  1238. {
  1239. RECT rc;
  1240. LONG DlgWidth, DlgHeight;
  1241. RECT rcWorkArea;
  1242. static TCHAR szInputWord [MAXINPUTWORD + 1];
  1243. static TCHAR szInputCode [MAXCODE + 1];
  1244. static TCHAR szInputWordOld [MAXINPUTWORD + 1] ;
  1245. static TCHAR szInputCodeOld [MAXCODE + 1] ;
  1246. switch (uMessage) {
  1247. case WM_INITDIALOG:
  1248. // reset position
  1249. hChildDlg = hDlg;
  1250. GetWindowRect(hDlg, &rc);
  1251. DlgWidth = rc.right - rc.left;
  1252. DlgHeight = rc.bottom - rc.top;
  1253. rcWorkArea = ImeMonitorWorkAreaFromWindow(hDlg);
  1254. SetWindowPos(hDlg, HWND_TOP,
  1255. (int)(rcWorkArea.right - DlgWidth)/2,
  1256. (int)(rcWorkArea.bottom - DlgHeight)/2,
  1257. (int) 0, (int) 0, SWP_NOSIZE);
  1258. SendDlgItemMessage (hDlg, IDC_MODI_WORD, EM_LIMITTEXT, MAXINPUTWORD, 0);
  1259. SendDlgItemMessage (hDlg, IDC_MODI_CODE, EM_LIMITTEXT, MBIndex.MBDesc[0].wMaxCodes, 0);
  1260. SetDlgItemText (hDlg,IDC_MODI_CODE, szModiCode);
  1261. SetDlgItemText (hDlg,IDC_MODI_WORD, szModiWord);
  1262. SetFocus (GetDlgItem (hDlg,IDC_MODI_WORD));
  1263. StringCbCopy (szInputWordOld, sizeof(szInputWordOld), szModiWord);
  1264. StringCbCopy (szInputCodeOld, sizeof(szInputCodeOld), szModiCode);
  1265. return (TRUE); // don't want to set focus to special control
  1266. case WM_PAINT:
  1267. {
  1268. GetClientRect(hDlg, &rc);
  1269. DrawConvexRect(GetDC(hDlg),
  1270. rc.left + 5,
  1271. rc.top + 5,
  1272. rc.right - 5 - 1,
  1273. rc.bottom - 10 - 1);
  1274. DrawConvexRectP(GetDC(hDlg),
  1275. rc.left + 5,
  1276. rc.top + 5,
  1277. rc.right - 5,
  1278. rc.bottom - 10);
  1279. }
  1280. return (FALSE);
  1281. case WM_COMMAND:
  1282. switch (LOWORD(wParam)) {
  1283. case IDC_MODI_CODE:
  1284. {
  1285. HIMC hIMC;
  1286. hIMC = (HIMC)ImmGetContext(hDlg);
  1287. if (!hIMC) {
  1288. return 0L;
  1289. }
  1290. switch(HIWORD(wParam)) {
  1291. case EN_SETFOCUS:
  1292. if(hIMC) {
  1293. ImmSetOpenStatus(hIMC, FALSE);
  1294. ImmUnlockIMC(hIMC);
  1295. }
  1296. break;
  1297. case EN_KILLFOCUS:
  1298. if(hIMC) {
  1299. ImmSetOpenStatus(hIMC, TRUE);
  1300. ImmUnlockIMC(hIMC);
  1301. }
  1302. break;
  1303. default:
  1304. break;
  1305. }
  1306. }
  1307. GetDlgItemText (hDlg, IDC_MODI_CODE, szInputCode, MAXCODE);
  1308. if (SendDlgItemMessage (hDlg,IDC_MODI_CODE, EM_GETMODIFY, 0, 0)){
  1309. int i, CaretPos;
  1310. GetDlgItemText (hDlg, IDC_MODI_CODE, szInputCode, MAXCODE);
  1311. if ( ((CaretPos = CheckCodeKey (szInputCode)) != (-1))) {
  1312. StringCbCopy (szInputCode, sizeof(szInputCode), szInputCodeOld);
  1313. SetDlgItemText (hDlg,IDC_MODI_CODE, szInputCode);
  1314. for (i = 0; i < 1; i++){
  1315. MessageBeep (0XFFFFFFFF);
  1316. }
  1317. }
  1318. StringCbCopy (szInputCodeOld, sizeof(szInputCodeOld), szInputCode);
  1319. }
  1320. break;
  1321. case IDC_MODI_WORD:
  1322. GetDlgItemText (hDlg, IDC_MODI_WORD, szInputWord, MAXINPUTWORD);
  1323. if (SendDlgItemMessage (hDlg,IDC_MODI_WORD, EM_GETMODIFY, 0, 0)){
  1324. int i, CaretPos;
  1325. GetDlgItemText (hDlg, IDC_MODI_WORD, szInputWord, MAXINPUTWORD);
  1326. if (((CaretPos = CheckKey (szInputWord)) != (-1))) {
  1327. StringCbCopy (szInputWord, sizeof(szInputWord), szInputWordOld);
  1328. SetDlgItemText (hDlg,IDC_MODI_WORD, szInputWord);
  1329. SendDlgItemMessage (hDlg,
  1330. IDC_MODI_WORD,
  1331. EM_SETSEL,
  1332. CaretPos,
  1333. CaretPos);
  1334. for (i = 0; i < 1; i++){
  1335. MessageBeep (0xFFFFFFFF);
  1336. }
  1337. }
  1338. if (MBIndex.MBDesc[0].wNumRulers != 0){
  1339. TCHAR MBName[MAXSTRLEN];
  1340. TCHAR szAutoCode [MAXCODE + 1];
  1341. HIMC hIMC;
  1342. LPINPUTCONTEXT lpIMC;
  1343. LPPRIVCONTEXT lpImcP;
  1344. hIMC = (HIMC)ImmGetContext(GetParent(GetParent(hDlg)));
  1345. if (!hIMC) {
  1346. return 0L;
  1347. }
  1348. lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
  1349. if (!lpIMC) { // Oh! Oh!
  1350. return (0L);
  1351. }
  1352. lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
  1353. if (!lpImcP) { // Oh! Oh!
  1354. return (0L);
  1355. }
  1356. // auto coding
  1357. StringCbCopy(MBName, sizeof(MBName), sImeG.szIMESystemPath);
  1358. StringCbCat((LPTSTR)MBName, sizeof(MBName), TEXT("\\"));
  1359. StringCbCat((LPTSTR)MBName, sizeof(MBName), (LPCTSTR)lpImcP->MB_Name);
  1360. ConvCreateWord( lpIMC->hWnd,
  1361. (LPCTSTR)MBName,
  1362. (LPTSTR)szInputWord,
  1363. (LPTSTR)szAutoCode);
  1364. ImmUnlockIMC(hIMC);
  1365. ImmUnlockIMCC(lpIMC->hPrivate);
  1366. ImmReleaseContext(GetParent(GetParent (hDlg)), hIMC);
  1367. SetDlgItemText (hDlg,IDC_MODI_CODE, szAutoCode);
  1368. SendDlgItemMessage (hDlg,IDC_MODI_CODE, EM_SETSEL, 0, -1);
  1369. StringCbCopy (szInputCodeOld, sizeof(szInputCodeOld), szAutoCode);
  1370. }
  1371. StringCbCopy (szInputWordOld, sizeof(szInputWordOld), szInputWord);
  1372. }
  1373. break;
  1374. case IDOK:
  1375. {
  1376. int iIndexFind;
  1377. TCHAR szFinalCode [MAXCODE + 1];
  1378. TCHAR szFinalWord [MAXINPUTWORD + 1];
  1379. GetDlgItemText (hDlg, IDC_MODI_WORD, szFinalWord, MAXINPUTWORD);
  1380. GetDlgItemText (hDlg, IDC_MODI_CODE, szFinalCode, MAXCODE);
  1381. CharLowerBuff (szFinalWord, lstrlen(szFinalWord));
  1382. CharLowerBuff (szFinalCode, lstrlen(szFinalCode));
  1383. if (lstrlen(szFinalWord) == 0){
  1384. SetFocus (GetDlgItem (hDlg,IDC_MODI_WORD));
  1385. break;
  1386. } else if (lstrlen(szFinalCode) == 0){
  1387. SetFocus (GetDlgItem (hDlg,IDC_MODI_CODE));
  1388. break;
  1389. }
  1390. if ((!lstrcmpi (szFinalCode, szModiCode)) && (!lstrcmpi (szFinalWord, szModiWord))){
  1391. //hadn't modify
  1392. hCrtDlg = NULL;
  1393. EndDialog(hDlg, FALSE);
  1394. break;
  1395. }else {
  1396. HIMC hIMC;
  1397. LPINPUTCONTEXT lpIMC;
  1398. hIMC = (HIMC)ImmGetContext(GetParent(GetParent (hDlg)));
  1399. if (!hIMC) {
  1400. return 0L;
  1401. }
  1402. lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
  1403. if (!lpIMC) { // Oh! Oh!
  1404. return (0L);
  1405. }
  1406. {
  1407. UINT i;
  1408. for(i=0;i<strlen((const char *)szFinalCode);i++){
  1409. if(!IsUsedCode(szFinalCode[i], NULL)){
  1410. InfoMessage(NULL, IDS_WARN_INVALIDCODE);
  1411. ImmUnlockIMC(hIMC);
  1412. ImmReleaseContext (GetParent(GetParent (hDlg)), hIMC);
  1413. return(0L);
  1414. }
  1415. }
  1416. }
  1417. iIndexFind = GetUDCIndex(lpIMC->hPrivate, szFinalCode, szFinalWord);
  1418. if (iIndexFind == -1 || iIndexFind >= MAXNUMBER_EMB){
  1419. //hadn't found
  1420. DelItem (lpIMC->hPrivate, szModiCode, szModiWord);
  1421. AddZCItem(lpIMC->hPrivate, szFinalCode, szFinalWord);
  1422. StringCbCopy (szModiWord,sizeof(szModiWord), szFinalWord);
  1423. StringCbCopy (szModiCode, sizeof(szModiCode), szFinalCode);
  1424. ImmUnlockIMC(hIMC);
  1425. ImmReleaseContext (GetParent(GetParent (hDlg)), hIMC);
  1426. hCrtDlg = NULL;
  1427. EndDialog(hDlg, FALSE);
  1428. break;
  1429. }else{
  1430. InfoMessage(NULL, IDS_WARN_DUPPRASE);
  1431. break;
  1432. }
  1433. ImmUnlockIMC(hIMC);
  1434. ImmReleaseContext (GetParent(GetParent (hDlg)), hIMC);
  1435. }
  1436. }
  1437. hCrtDlg = NULL;
  1438. EndDialog(hDlg, FALSE);
  1439. break;
  1440. case IDCANCEL:
  1441. hCrtDlg = NULL;
  1442. EndDialog(hDlg, FALSE);
  1443. break;
  1444. default:
  1445. return (FALSE);
  1446. break;
  1447. }
  1448. return (TRUE);
  1449. case WM_CLOSE:
  1450. hChildDlg = NULL;
  1451. EndDialog(hDlg, FALSE);
  1452. return (TRUE);
  1453. default:
  1454. return (FALSE);
  1455. }
  1456. return (TRUE);
  1457. }
  1458. /*************************************************************************/
  1459. /* int DelItem (HIMCC, LPTSTR, LPTSTR) */
  1460. /*************************************************************************/
  1461. int DelItem (HIMCC hPrivate, LPTSTR szCode, LPTSTR szWord)
  1462. {
  1463. int iStringIndex;
  1464. iStringIndex = GetUDCIndex(hPrivate, szCode, szWord);
  1465. if (iStringIndex == -1 || iStringIndex >= MAXNUMBER_EMB){
  1466. return -1;
  1467. }else{
  1468. DelSelCU (hPrivate, iStringIndex);
  1469. }
  1470. return iStringIndex;
  1471. }
  1472. /*************************************************************************/
  1473. /* void BreakString (LPTSTR szList, LPTSTR szCode, LPTSTR szWord) */
  1474. /*************************************************************************/
  1475. void BreakString (LPTSTR szList,
  1476. LPTSTR szCode,
  1477. LPTSTR szWord)
  1478. {
  1479. int i = 0, j = 0;
  1480. while (szList[i] != TEXT(' ')){
  1481. szCode[j] = szList[i];
  1482. i ++;
  1483. j ++;
  1484. }
  1485. szCode[j] = TEXT('\0');
  1486. lstrcpy(szWord, &szList[20]);
  1487. }
  1488. /**********************************************************************/
  1489. /* ImeVerDlgProc() */
  1490. /* Return Value: */
  1491. /* TRUE - successful, FALSE - failure */
  1492. /**********************************************************************/
  1493. INT_PTR CALLBACK ImeVerDlgProc( // dialog procedure of configuration
  1494. HWND hDlg,
  1495. UINT uMessage,
  1496. WPARAM wParam,
  1497. LPARAM lParam)
  1498. {
  1499. RECT rc;
  1500. LONG DlgWidth, DlgHeight;
  1501. RECT rcWorkArea;
  1502. rcWorkArea = ImeMonitorWorkAreaFromWindow(hDlg);
  1503. switch (uMessage) {
  1504. case WM_INITDIALOG:
  1505. hCrtDlg = hDlg;
  1506. // reset position
  1507. GetWindowRect(hDlg, &rc);
  1508. DlgWidth = rc.right - rc.left;
  1509. DlgHeight = rc.bottom - rc.top;
  1510. SetWindowPos(hDlg, HWND_TOP,
  1511. (int)(rcWorkArea.right - DlgWidth)/2,
  1512. (int)(rcWorkArea.bottom - DlgHeight)/2,
  1513. (int) 0, (int) 0, SWP_NOSIZE);
  1514. return (TRUE); // don't want to set focus to special control
  1515. case WM_COMMAND:
  1516. switch (wParam) {
  1517. case IDOK:
  1518. EndDialog(hDlg, FALSE);
  1519. break;
  1520. case IDCANCEL:
  1521. EndDialog(hDlg, FALSE);
  1522. break;
  1523. default:
  1524. return (FALSE);
  1525. break;
  1526. }
  1527. return (TRUE);
  1528. case WM_CLOSE:
  1529. EndDialog(hDlg, FALSE);
  1530. return FALSE;
  1531. case WM_PAINT:
  1532. {
  1533. HDC hDC;
  1534. PAINTSTRUCT ps;
  1535. RECT rcVerInfo, rcOrgAuthorName;
  1536. HGDIOBJ hOldFont=NULL;
  1537. LOGFONT lfFont;
  1538. HFONT hNewFont=NULL;
  1539. hDC = BeginPaint(hDlg, &ps);
  1540. GetClientRect(hDlg, &rc);
  1541. DrawConvexRect(hDC,
  1542. rc.left + 10,
  1543. rc.top + 10,
  1544. rc.right - 10 - 1,
  1545. rc.bottom - 43 - 1);
  1546. DrawConvexRectP(hDC,
  1547. rc.left + 10,
  1548. rc.top + 10,
  1549. rc.right - 10,
  1550. rc.bottom - 43);
  1551. // draw ver info and org&auther name
  1552. rcVerInfo.left = rc.left+10;
  1553. rcVerInfo.right = rc.right;
  1554. rcVerInfo.top = rc.top + 30;
  1555. rcVerInfo.bottom = rcVerInfo.top + 19;
  1556. rcOrgAuthorName.left = rc.left;
  1557. rcOrgAuthorName.right = rc.right;
  1558. //rcOrgAuthorName.top = rcVerInfo.bottom + 12;
  1559. rcOrgAuthorName.top = rcVerInfo.bottom + 4;
  1560. rcOrgAuthorName.bottom = rcOrgAuthorName.top + 19;
  1561. SetTextColor(hDC, RGB(0x00, 0x00, 0x00));
  1562. SetBkColor(hDC, RGB(0xC0, 0xC0, 0xC0));
  1563. // set font
  1564. if (sImeG.fDiffSysCharSet) {
  1565. hOldFont = GetCurrentObject(hDC, OBJ_FONT);
  1566. GetObject(hOldFont, sizeof(lfFont), &lfFont);
  1567. lfFont.lfCharSet = NATIVE_CHARSET;
  1568. lstrcpy(lfFont.lfFaceName, TEXT("Simsun"));
  1569. hNewFont = CreateFontIndirect(&lfFont);
  1570. if ( hNewFont )
  1571. SelectObject(hDC, (HGDIOBJ)hNewFont);
  1572. }
  1573. DrawText(hDC, szVerInfo, lstrlen(szVerInfo),
  1574. &rcVerInfo, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  1575. if (sImeG.fDiffSysCharSet){
  1576. SelectObject(hDC, hOldFont);
  1577. if ( hNewFont )
  1578. DeleteObject( (HGDIOBJ) hNewFont );
  1579. }
  1580. EndPaint(hDlg, &ps);
  1581. }
  1582. return (FALSE);
  1583. default:
  1584. return (FALSE);
  1585. }
  1586. return (TRUE);
  1587. }
  1588. /**********************************************************************/
  1589. /* InitImeCharac() */
  1590. /**********************************************************************/
  1591. void InitImeCharac(
  1592. DWORD ObjImeIndex)
  1593. {
  1594. HKEY hKeyCurrVersion;
  1595. DWORD retCode;
  1596. DWORD retValue;
  1597. HKEY hKey;
  1598. #ifdef UNICODE
  1599. TCHAR ValueName[][9] = {
  1600. {0x8BCD, 0x8BED, 0x8054, 0x60F3, 0x0000},
  1601. {0x8BCD, 0x8BED, 0x8F93, 0x5165, 0x0000},
  1602. {0x9010, 0x6E10, 0x63D0, 0x793A, 0x0000},
  1603. {0x5916, 0x7801, 0x63D0, 0x793A, 0x0000},
  1604. {0x63D2, 0x7A7A, 0x683C, 0x0000},
  1605. {0x5149, 0x6807, 0x8DDF, 0x968F, 0x0000},
  1606. #else
  1607. TCHAR ValueName[][9] = { TEXT("��������"),
  1608. TEXT("��������"),
  1609. TEXT("������ʾ"),
  1610. TEXT("������ʾ"),
  1611. TEXT("���ո�"),
  1612. TEXT("��������"),
  1613. #endif
  1614. TEXT("<SPACE>"),
  1615. TEXT("<ENTER>"),
  1616. //CHP
  1617. TEXT("FC input"),
  1618. TEXT("FC aid")
  1619. };
  1620. DWORD dwcValueName = MAXSTRLEN;
  1621. BYTE bData[MAXSTRLEN];
  1622. LONG bcData = MAXSTRLEN;
  1623. UINT i;
  1624. retCode = OpenReg_PathSetup(&hKeyCurrVersion);
  1625. if (retCode) {
  1626. RegCreateKey(HKEY_CURRENT_USER, REGSTR_PATH_SETUP, &hKeyCurrVersion);
  1627. }
  1628. if ( hKeyCurrVersion )
  1629. retCode = OpenReg_User (hKeyCurrVersion,
  1630. MBIndex.MBDesc[ObjImeIndex].szName,
  1631. &hKey);
  1632. else
  1633. return;
  1634. if ( hKey == NULL )
  1635. {
  1636. RegCloseKey(hKeyCurrVersion);
  1637. return;
  1638. }
  1639. //CHP
  1640. for(i=0; i<10; i++) {
  1641. bData[0] = 0;
  1642. bcData = MAXSTRLEN;
  1643. retValue = RegQueryValueEx (hKey, ValueName[i],
  1644. NULL,
  1645. NULL, //&dwType,
  1646. bData, //&bData,
  1647. &bcData); //&bcData);
  1648. switch (i)
  1649. {
  1650. case 0:
  1651. MBIndex.IMEChara[ObjImeIndex].IC_LX = *((LPDWORD)bData);
  1652. break;
  1653. case 1:
  1654. MBIndex.IMEChara[ObjImeIndex].IC_CZ = *((LPDWORD)bData);
  1655. break;
  1656. case 2:
  1657. MBIndex.IMEChara[ObjImeIndex].IC_TS = *((LPDWORD)bData);
  1658. break;
  1659. case 3:
  1660. MBIndex.IMEChara[ObjImeIndex].IC_CTC = *((LPDWORD)bData);
  1661. break;
  1662. case 4:
  1663. MBIndex.IMEChara[ObjImeIndex].IC_INSSPC = *((LPDWORD)bData);
  1664. break;
  1665. case 5:
  1666. MBIndex.IMEChara[ObjImeIndex].IC_Trace = *((LPDWORD)bData);
  1667. break;
  1668. case 6:
  1669. MBIndex.IMEChara[ObjImeIndex].IC_Space = *((LPDWORD)bData);
  1670. break;
  1671. case 7:
  1672. MBIndex.IMEChara[ObjImeIndex].IC_Enter = *((LPDWORD)bData);
  1673. break;
  1674. case 8:
  1675. MBIndex.IMEChara[ObjImeIndex].IC_FCSR = *((LPDWORD)bData);
  1676. break;
  1677. case 9:
  1678. MBIndex.IMEChara[ObjImeIndex].IC_FCTS = *((LPDWORD)bData);
  1679. break;
  1680. default:
  1681. break;
  1682. }
  1683. }
  1684. #ifdef EUDC
  1685. //just query the value, do not set any value here
  1686. bcData = sizeof(TCHAR) * MAX_PATH;
  1687. RegQueryValueEx (hKey, szRegEudcDictName,
  1688. NULL,
  1689. NULL, //null-terminate string
  1690. (unsigned char *)MBIndex.EUDCData.szEudcDictName, //&bData,
  1691. &bcData); //&bcData);
  1692. bcData = sizeof(TCHAR) * MAX_PATH;
  1693. RegQueryValueEx (hKey, szRegEudcMapFileName,
  1694. NULL,
  1695. NULL, //null-terminate string
  1696. (unsigned char *)MBIndex.EUDCData.szEudcMapFileName, //&bData,
  1697. &bcData); //&bcData);
  1698. #endif //EUDC
  1699. #ifdef CROSSREF
  1700. bcData = sizeof(HKL);
  1701. if(RegQueryValueEx (hKey, szRegRevKL,
  1702. NULL,
  1703. NULL, //null-terminate string
  1704. (LPBYTE)&MBIndex.hRevKL, //&bData,
  1705. &bcData) != ERROR_SUCCESS)
  1706. MBIndex.hRevKL = NULL;
  1707. bcData = sizeof(DWORD);
  1708. if(RegQueryValueEx (hKey, szRegRevMaxKey,
  1709. NULL,
  1710. NULL, //null-terminate string
  1711. (LPBYTE)&MBIndex.nRevMaxKey, //&bData,
  1712. &bcData) != ERROR_SUCCESS)
  1713. MBIndex.hRevKL = NULL;
  1714. #endif
  1715. RegCloseKey(hKey);
  1716. RegCloseKey(hKeyCurrVersion);
  1717. return;
  1718. }
  1719. // Combine 's1' and 's2' and fill space chars in between, result str stored in 'dest'.
  1720. void MyStrFormat(LPTSTR dest, int cch, LPTSTR s1, LPTSTR s2)
  1721. {
  1722. int i;
  1723. int len = lstrlen(s1);
  1724. if (len >= cch)
  1725. {
  1726. return; // can't do anything further
  1727. }
  1728. StringCchCopy(dest, cch, s1);
  1729. if (cch < STR_FORMAT_POS)
  1730. return;
  1731. for (i = 0; i < STR_FORMAT_POS-len && len+i < cch; i++)
  1732. dest[len+i] = STR_FORMAT_CHAR;
  1733. StringCchCopy(&dest[STR_FORMAT_POS],cch-STR_FORMAT_POS, s2);
  1734. return;
  1735. }