Source code of Windows XP (NT5)
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.

2119 lines
68 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. GetKeyboardState(lpbKeyState);
  292. if (lpbKeyState[VK_CAPITAL] & 1)
  293. {
  294. // Simulate a key press
  295. keybd_event( VK_CAPITAL,
  296. 0x3A,
  297. KEYEVENTF_EXTENDEDKEY | 0,
  298. 0 );
  299. // Simulate a key release
  300. keybd_event( VK_CAPITAL,
  301. 0x3A,
  302. KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
  303. 0);
  304. }
  305. fdwConversion = (lpIMC->fdwConversion | IME_CMODE_NATIVE) &
  306. ~(IME_CMODE_CHARCODE | IME_CMODE_EUDC);
  307. uCaps = 0;
  308. }
  309. // init ime Private status
  310. {
  311. LPPRIVCONTEXT lpImcP;
  312. lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
  313. if(lpImcP) {
  314. lpImcP->PrivateArea.Comp_Status.dwSTLX = 0;
  315. lpImcP->PrivateArea.Comp_Status.dwSTMULCODE = 0;
  316. lpImcP->PrivateArea.Comp_Status.dwInvalid = 0;
  317. ImmUnlockIMCC(lpIMC->hPrivate);
  318. }
  319. }
  320. ImmSetConversionStatus(hIMC, fdwConversion, lpIMC->fdwSentence);
  321. } else if (PtInRect(&sImeG.rcImeName, *lpptCursor)) {
  322. } else if (PtInRect(&sImeG.rcShapeText, *lpptCursor)) {
  323. DWORD dwConvMode;
  324. if (lpIMC->fdwConversion & IME_CMODE_CHARCODE) {
  325. MessageBeep((UINT)-1);
  326. } else if (lpIMC->fdwConversion & IME_CMODE_EUDC) {
  327. MessageBeep((UINT)-1);
  328. } else {
  329. dwConvMode = lpIMC->fdwConversion ^ IME_CMODE_FULLSHAPE;
  330. ImmSetConversionStatus(hIMC, dwConvMode, lpIMC->fdwSentence);
  331. }
  332. } else if (PtInRect(&sImeG.rcSymbol, *lpptCursor)) {
  333. DWORD fdwConversion;
  334. if (lpIMC->fdwConversion & IME_CMODE_CHARCODE) {
  335. MessageBeep((UINT)-1);
  336. } else {
  337. fdwConversion = lpIMC->fdwConversion ^ IME_CMODE_SYMBOL;
  338. ImmSetConversionStatus(hIMC, fdwConversion, lpIMC->fdwSentence);
  339. }
  340. } else if (PtInRect(&sImeG.rcSKText, *lpptCursor)) {
  341. DWORD fdwConversion;
  342. LPPRIVCONTEXT lpImcP;
  343. lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
  344. if(lpImcP) {
  345. if(!(lpImeL->hSKMenu)) {
  346. lpImeL->hSKMenu = LoadMenu (hInst, TEXT("SKMENU"));
  347. }
  348. lpImeL->dwSKState[lpImeL->dwSKWant] =
  349. lpImeL->dwSKState[lpImeL->dwSKWant]^1;
  350. fdwConversion = lpIMC->fdwConversion ^ IME_CMODE_SOFTKBD;
  351. ImmSetConversionStatus(hIMC, fdwConversion, lpIMC->fdwSentence);
  352. ImmUnlockIMCC(lpIMC->hPrivate);
  353. } else {
  354. MessageBeep((UINT)-1);
  355. }
  356. } else {
  357. MessageBeep((UINT)-1);
  358. }
  359. ImmUnlockIMC(hIMC);
  360. return;
  361. }
  362. /**********************************************************************/
  363. /* StatusSetCursor() */
  364. /**********************************************************************/
  365. void PASCAL StatusSetCursor(
  366. HWND hStatusWnd,
  367. LPARAM lParam)
  368. {
  369. POINT ptCursor, ptSavCursor;
  370. RECT rcWnd;
  371. if (GetWindowLong(hStatusWnd, UI_MOVE_OFFSET) != WINDOW_NOT_DRAG) {
  372. SetCursor(LoadCursor(NULL, IDC_SIZEALL));
  373. return;
  374. }
  375. GetCursorPos(&ptCursor);
  376. ptSavCursor = ptCursor;
  377. ScreenToClient(hStatusWnd, &ptCursor);
  378. if (PtInRect(&sImeG.rcStatusText, ptCursor)) {
  379. SetCursor(LoadCursor(hInst, szHandCursor));
  380. if (HIWORD(lParam) == WM_LBUTTONDOWN) {
  381. SetStatus(hStatusWnd, &ptCursor);
  382. } else if (HIWORD(lParam) == WM_RBUTTONUP) {
  383. if (PtInRect(&sImeG.rcSKText, ptCursor)) {
  384. static BOOL fSoftkey= FALSE;
  385. // prevent recursive
  386. if (fSoftkey) {
  387. // configuration already bring up
  388. return;
  389. }
  390. fSoftkey = TRUE;
  391. SoftkeyMenu(hStatusWnd, ptSavCursor.x, ptSavCursor.y);
  392. fSoftkey = FALSE;
  393. }else{
  394. static BOOL fCmenu=FALSE;
  395. // prevent recursive
  396. if (fCmenu) {
  397. // configuration already bring up
  398. return;
  399. }
  400. fCmenu = TRUE;
  401. ContextMenu(hStatusWnd, ptSavCursor.x, ptSavCursor.y);
  402. fCmenu = FALSE;
  403. }
  404. }
  405. return;
  406. } else {
  407. SetCursor(LoadCursor(NULL, IDC_SIZEALL));
  408. if (HIWORD(lParam) == WM_LBUTTONDOWN) {
  409. // start drag
  410. SystemParametersInfo(SPI_GETWORKAREA, 0, &sImeG.rcWorkArea, 0);
  411. } else {
  412. return;
  413. }
  414. }
  415. SetCapture(hStatusWnd);
  416. SetWindowLong(hStatusWnd, UI_MOVE_XY,
  417. MAKELONG(ptSavCursor.x, ptSavCursor.y));
  418. GetWindowRect(hStatusWnd, &rcWnd);
  419. SetWindowLong(hStatusWnd, UI_MOVE_OFFSET,
  420. MAKELONG(ptSavCursor.x - rcWnd.left, ptSavCursor.y - rcWnd.top));
  421. DrawDragBorder(hStatusWnd, MAKELONG(ptSavCursor.x, ptSavCursor.y),
  422. GetWindowLong(hStatusWnd, UI_MOVE_OFFSET));
  423. return;
  424. }
  425. /**********************************************************************/
  426. /* PaintStatusWindow() */
  427. /**********************************************************************/
  428. void PASCAL PaintStatusWindow(
  429. HDC hDC,
  430. HWND hStatusWnd)
  431. {
  432. HWND hUIWnd;
  433. HIMC hIMC;
  434. LPINPUTCONTEXT lpIMC;
  435. LPPRIVCONTEXT lpImcP;
  436. HGDIOBJ hOldFont;
  437. HBITMAP hImeIconBmp, hShapeBmp, hSymbolBmp, hSKBmp;
  438. HBITMAP hOldBmp;
  439. HDC hMemDC;
  440. hUIWnd = GetWindow(hStatusWnd, GW_OWNER);
  441. if (!hUIWnd) {
  442. MessageBeep((UINT)-1);
  443. return;
  444. }
  445. hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC);
  446. if (!hIMC) {
  447. MessageBeep((UINT)-1);
  448. return;
  449. }
  450. if (!(lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC))) {
  451. MessageBeep((UINT)-1);
  452. return;
  453. }
  454. // get lpImcP
  455. if(!(lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate))) {
  456. MessageBeep((UINT)-1);
  457. return;
  458. }
  459. // set font
  460. if (sImeG.fDiffSysCharSet) {
  461. LOGFONT lfFont;
  462. ZeroMemory(&lfFont, sizeof(lfFont));
  463. hOldFont = GetCurrentObject(hDC, OBJ_FONT);
  464. lfFont.lfHeight = -MulDiv(12, GetDeviceCaps(hDC, LOGPIXELSY), 72);
  465. lfFont.lfCharSet = NATIVE_CHARSET;
  466. lstrcpy(lfFont.lfFaceName, TEXT("Simsun"));
  467. SelectObject(hDC, CreateFontIndirect(&lfFont));
  468. }
  469. // draw Ime Name
  470. {
  471. if (lpIMC->fOpen) {
  472. SetTextColor(hDC, RGB(0x00, 0x00, 0x00));
  473. } else {
  474. SetTextColor(hDC, RGB(0x80, 0x80, 0x80));
  475. }
  476. SetBkColor(hDC, RGB(0xC0, 0xC0, 0xC0));
  477. DrawText(hDC, MBIndex.MBDesc[0].szName, lstrlen(MBIndex.MBDesc[0].szName),
  478. &sImeG.rcImeName, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  479. }
  480. DrawConvexRect(hDC,
  481. sImeG.rcImeName.left,
  482. sImeG.rcImeName.top,
  483. sImeG.rcImeName.right - 1,
  484. sImeG.rcImeName.bottom - 1);
  485. DrawConvexRectP(hDC,
  486. sImeG.rcImeName.left,
  487. sImeG.rcImeName.top,
  488. sImeG.rcImeName.right,
  489. sImeG.rcImeName.bottom);
  490. // load all bitmap
  491. hSymbolBmp = (HBITMAP)NULL;
  492. hShapeBmp = (HBITMAP)NULL;
  493. hSKBmp = (HBITMAP)NULL;
  494. if (!lpIMC->fOpen) {
  495. hSymbolBmp = LoadBitmap(hInst, szNone);
  496. hShapeBmp = LoadBitmap(hInst, szNone);
  497. hSKBmp = LoadBitmap(hInst, szNone);
  498. hImeIconBmp = LoadBitmap(hInst, szChinese);
  499. } else if (lpIMC->fdwConversion & IME_CMODE_NATIVE) {
  500. if(!lpImcP->PrivateArea.Comp_Status.OnLineCreWord){
  501. hImeIconBmp = LoadBitmap(hInst, szChinese);
  502. } else {
  503. hImeIconBmp = LoadBitmap(hInst, szCZ);
  504. }
  505. } else {
  506. hImeIconBmp = LoadBitmap(hInst, szEnglish);
  507. }
  508. if (!hShapeBmp) {
  509. if (lpIMC->fdwConversion & IME_CMODE_FULLSHAPE) {
  510. hShapeBmp = LoadBitmap(hInst, szFullShape);
  511. } else {
  512. hShapeBmp = LoadBitmap(hInst, szHalfShape);
  513. }
  514. }
  515. if (!hSymbolBmp) {
  516. if (lpIMC->fdwConversion & IME_CMODE_SYMBOL) {
  517. hSymbolBmp = LoadBitmap(hInst, szSymbol);
  518. } else {
  519. hSymbolBmp = LoadBitmap(hInst, szNoSymbol);
  520. }
  521. }
  522. if (!hSKBmp) {
  523. if (lpIMC->fdwConversion & IME_CMODE_SOFTKBD) {
  524. hSKBmp = LoadBitmap(hInst, szSoftKBD);
  525. } else {
  526. hSKBmp = LoadBitmap(hInst, szNoSoftKBD);
  527. }
  528. }
  529. ImmUnlockIMC(hIMC);
  530. ImmUnlockIMCC(lpIMC->hPrivate);
  531. hMemDC = CreateCompatibleDC(hDC);
  532. hOldBmp = SelectObject(hMemDC, hImeIconBmp);
  533. BitBlt(hDC, sImeG.rcImeIcon.left, sImeG.rcImeIcon.top,
  534. sImeG.rcImeIcon.right - sImeG.rcImeIcon.left,
  535. STATUS_DIM_Y,
  536. hMemDC, 0, 0, SRCCOPY);
  537. SelectObject(hMemDC, hShapeBmp);
  538. BitBlt(hDC, sImeG.rcShapeText.left, sImeG.rcShapeText.top,
  539. sImeG.rcShapeText.right - sImeG.rcShapeText.left,
  540. STATUS_DIM_Y,
  541. hMemDC, 0, 0, SRCCOPY);
  542. SelectObject(hMemDC, hSymbolBmp);
  543. BitBlt(hDC, sImeG.rcSymbol.left, sImeG.rcSymbol.top,
  544. sImeG.rcSymbol.right - sImeG.rcSymbol.left,
  545. STATUS_DIM_Y,
  546. hMemDC, 0, 0, SRCCOPY);
  547. SelectObject(hMemDC, hSKBmp);
  548. BitBlt(hDC, sImeG.rcSKText.left, sImeG.rcSKText.top,
  549. sImeG.xStatusWi - sImeG.rcSKText.left,
  550. STATUS_DIM_Y,
  551. hMemDC, 0, 0, SRCCOPY);
  552. SelectObject(hMemDC, hOldBmp);
  553. DeleteDC(hMemDC);
  554. DeleteObject(hImeIconBmp);
  555. DeleteObject(hSymbolBmp);
  556. DeleteObject(hShapeBmp);
  557. DeleteObject(hSKBmp);
  558. if (sImeG.fDiffSysCharSet) {
  559. DeleteObject(SelectObject(hDC, hOldFont));
  560. }
  561. return;
  562. }
  563. /**********************************************************************/
  564. /* StatusWndProc() */
  565. /**********************************************************************/
  566. LRESULT CALLBACK StatusWndProc(
  567. HWND hStatusWnd,
  568. UINT uMsg,
  569. WPARAM wParam,
  570. LPARAM lParam)
  571. {
  572. switch (uMsg) {
  573. case WM_DESTROY:
  574. DestroyStatusWindow(hStatusWnd);
  575. break;
  576. case WM_SETCURSOR:
  577. StatusSetCursor(hStatusWnd, lParam);
  578. break;
  579. case WM_MOUSEMOVE:
  580. if (GetWindowLong(hStatusWnd, UI_MOVE_OFFSET) != WINDOW_NOT_DRAG) {
  581. POINT ptCursor;
  582. DrawDragBorder(hStatusWnd,
  583. GetWindowLong(hStatusWnd, UI_MOVE_XY),
  584. GetWindowLong(hStatusWnd, UI_MOVE_OFFSET));
  585. GetCursorPos(&ptCursor);
  586. SetWindowLong(hStatusWnd, UI_MOVE_XY,
  587. MAKELONG(ptCursor.x, ptCursor.y));
  588. DrawDragBorder(hStatusWnd, MAKELONG(ptCursor.x, ptCursor.y),
  589. GetWindowLong(hStatusWnd, UI_MOVE_OFFSET));
  590. } else {
  591. return DefWindowProc(hStatusWnd, uMsg, wParam, lParam);
  592. }
  593. break;
  594. case WM_LBUTTONUP:
  595. if (GetWindowLong(hStatusWnd, UI_MOVE_OFFSET) != WINDOW_NOT_DRAG) {
  596. LONG lTmpCursor, lTmpOffset;
  597. lTmpCursor = GetWindowLong(hStatusWnd, UI_MOVE_XY);
  598. // calculate the org by the offset
  599. lTmpOffset = GetWindowLong(hStatusWnd, UI_MOVE_OFFSET);
  600. DrawDragBorder(hStatusWnd, lTmpCursor, lTmpOffset);
  601. (*(LPPOINTS)&lTmpCursor).x -= (*(LPPOINTS)&lTmpOffset).x;
  602. (*(LPPOINTS)&lTmpCursor).y -= (*(LPPOINTS)&lTmpOffset).y;
  603. SetWindowLong(hStatusWnd, UI_MOVE_OFFSET, WINDOW_NOT_DRAG);
  604. ReleaseCapture();
  605. AdjustStatusBoundary((LPPOINTS)&lTmpCursor,
  606. GetWindow(hStatusWnd, GW_OWNER));
  607. SendMessage(GetWindow(hStatusWnd, GW_OWNER), WM_IME_CONTROL,
  608. IMC_SETSTATUSWINDOWPOS, lTmpCursor);
  609. } else {
  610. return DefWindowProc(hStatusWnd, uMsg, wParam, lParam);
  611. }
  612. break;
  613. case WM_IME_NOTIFY:
  614. // get work area for changing
  615. SystemParametersInfo(SPI_GETWORKAREA, 0, &sImeG.rcWorkArea, 0);
  616. if (wParam == IMN_SETSTATUSWINDOWPOS) {
  617. SetStatusWindowPos(hStatusWnd);
  618. }
  619. break;
  620. case WM_PAINT:
  621. {
  622. HDC hDC;
  623. PAINTSTRUCT ps;
  624. hDC = BeginPaint(hStatusWnd, &ps);
  625. PaintStatusWindow(hDC, hStatusWnd);
  626. EndPaint(hStatusWnd, &ps);
  627. }
  628. break;
  629. case WM_MOUSEACTIVATE:
  630. return (MA_NOACTIVATE);
  631. default:
  632. return DefWindowProc(hStatusWnd, uMsg, wParam, lParam);
  633. }
  634. return (0L);
  635. }
  636. ///////
  637. int CheckCodeKey (TCHAR szInputCode[]);
  638. BOOL CrtIsUsedCode(TCHAR wCharCode);
  639. int CheckKey (TCHAR szInputWord[]);
  640. void BreakString (LPTSTR, LPTSTR, LPTSTR);
  641. int DelItem (HIMCC, LPTSTR, LPTSTR);
  642. void AddStringTolist ( LPINPUTCONTEXT lpIMC, HWND hDlg);
  643. BOOL GetUDCItem(HIMCC, UINT, LPTSTR, LPTSTR);
  644. void DelSelCU (HIMCC, int);
  645. int GetUDCIndex(HIMCC, LPTSTR, LPTSTR);
  646. BOOL FAR PASCAL ListWordProc(HWND, UINT, WPARAM, LPARAM);
  647. BOOL FAR PASCAL ModiWordDlgProc(HWND, UINT, DWORD, LONG);
  648. FARPROC lpListWordOld;
  649. #define LBN_DELETE 6
  650. static TCHAR szModiWord [MAXINPUTWORD + 1];
  651. static TCHAR szModiCode [MAXCODE + 1];
  652. /**********************************************************************/
  653. /* CrtWordDlgProc() */
  654. /* Return Value: */
  655. /* TRUE - successful, FALSE - failure */
  656. /**********************************************************************/
  657. BOOL FAR PASCAL CrtWordDlgProc(
  658. HWND hDlg,
  659. UINT uMessage,
  660. DWORD wParam,
  661. LONG lParam)
  662. {
  663. RECT rc;
  664. LONG DlgWidth, DlgHeight;
  665. static TCHAR szInputWord [MAXINPUTWORD + 1];
  666. static TCHAR szInputCode [MAXCODE + 1];
  667. static TCHAR szInputWordOld [MAXINPUTWORD + 1] ;
  668. static TCHAR szInputCodeOld [MAXCODE + 1] ;
  669. switch (uMessage) {
  670. case WM_PAINT:
  671. {
  672. RECT rc;
  673. GetClientRect(hDlg, &rc);
  674. DrawConvexRect(GetDC(hDlg),
  675. rc.left + 10,
  676. rc.top + 10,
  677. rc.right - 10 - 1,
  678. rc.bottom - 20 - 1);
  679. DrawConvexRectP(GetDC(hDlg),
  680. rc.left + 10,
  681. rc.top + 10,
  682. rc.right - 10,
  683. rc.bottom - 20);
  684. }
  685. return (FALSE);
  686. case WM_INITDIALOG:
  687. {
  688. TCHAR szStr[54];
  689. HDC hDC;
  690. DWORD nStrLenth;
  691. RECT rcWorkArea;
  692. hCrtDlg = hDlg;
  693. #ifdef UNICODE
  694. {
  695. TCHAR UniTmp1[] = {0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x0000};
  696. TCHAR UniTmp2[] = {0x96F6, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D, 0x96F6, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D, 0x0000};
  697. MyStrFormat (szStr, UniTmp1, UniTmp2);
  698. }
  699. #else
  700. MyStrFormat (szStr, TEXT("mmmmmmmmmmmm"), TEXT("��һ�����������߰˾���һ�����������߰˾�"));
  701. #endif //UNICODE
  702. // reset position
  703. GetWindowRect(hDlg, &rc);
  704. DlgWidth = rc.right - rc.left;
  705. DlgHeight = rc.bottom - rc.top;
  706. rcWorkArea = ImeMonitorWorkAreaFromWindow(hDlg);
  707. SetWindowPos(hDlg, HWND_TOP,
  708. (int)(rcWorkArea.right - DlgWidth)/2,
  709. (int)(rcWorkArea.bottom - DlgHeight)/2,
  710. (int)0, (int)0, SWP_NOSIZE);
  711. CheckRadioButton (hDlg, IDC_RADIOADD, IDC_RADIOMOD, IDC_RADIOADD);
  712. lpListWordOld = (FARPROC)GetWindowLongPtr(GetDlgItem (hDlg,IDC_LIST_WORD),
  713. GWLP_WNDPROC);
  714. SetWindowLongPtr(GetDlgItem (hDlg,IDC_LIST_WORD), GWLP_WNDPROC,
  715. (LONG_PTR)ListWordProc);
  716. EnableWindow (GetDlgItem (hDlg,IDC_BT_MODIFY), FALSE);
  717. EnableWindow (GetDlgItem (hDlg,IDC_BT_DEL), FALSE);
  718. EnableWindow (GetDlgItem (hDlg,IDC_INPUTWORD), TRUE);
  719. EnableWindow (GetDlgItem (hDlg,IDC_INPUTCODE), TRUE);
  720. EnableWindow (GetDlgItem (hDlg,IDC_BT_INS), TRUE);
  721. SendDlgItemMessage (hDlg, IDC_INPUTWORD, EM_LIMITTEXT, MAXINPUTWORD, 0);
  722. SendDlgItemMessage (hDlg, IDC_INPUTCODE, EM_LIMITTEXT, MBIndex.MBDesc[0].wMaxCodes, 0);
  723. hDC = GetDC (hDlg);
  724. nStrLenth = GetTabbedTextExtent (hDC, szStr, lstrlen(szStr), 0, (LPINT)NULL);
  725. ReleaseDC (hDlg, hDC);
  726. SendDlgItemMessage (hDlg, IDC_LIST_WORD, LB_SETHORIZONTALEXTENT, nStrLenth, 0);
  727. return (TRUE); // don't want to set focus to special control
  728. }
  729. case WM_COMMAND:
  730. switch (LOWORD(wParam)) {
  731. case IDC_RADIOADD:
  732. EnableWindow (GetDlgItem (hDlg,IDC_BT_MODIFY), FALSE);
  733. EnableWindow (GetDlgItem (hDlg,IDC_BT_DEL), FALSE);
  734. EnableWindow (GetDlgItem (hDlg,IDC_INPUTWORD), TRUE);
  735. EnableWindow (GetDlgItem (hDlg,IDC_INPUTCODE), TRUE);
  736. EnableWindow (GetDlgItem (hDlg,IDC_STATIC), TRUE);
  737. EnableWindow (GetDlgItem (hDlg,IDC_BT_INS), TRUE);
  738. SendDlgItemMessage (hDlg, IDC_BT_INS, BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE);
  739. SendDlgItemMessage (hDlg, IDC_CLOSE, BM_SETSTYLE, BS_PUSHBUTTON, TRUE);
  740. SendDlgItemMessage (hDlg, IDC_LIST_WORD, LB_RESETCONTENT, 0, 0L);
  741. SetFocus (GetDlgItem (hDlg, IDC_INPUTWORD));
  742. break;
  743. case IDC_RADIOMOD:
  744. EnableWindow (GetDlgItem (hDlg,IDC_BT_MODIFY), TRUE);
  745. EnableWindow (GetDlgItem (hDlg,IDC_BT_DEL), TRUE);
  746. EnableWindow (GetDlgItem (hDlg,IDC_INPUTWORD), FALSE);
  747. EnableWindow (GetDlgItem (hDlg,IDC_INPUTCODE), FALSE);
  748. EnableWindow (GetDlgItem (hDlg,IDC_STATIC), FALSE);
  749. EnableWindow (GetDlgItem (hDlg,IDC_BT_INS), FALSE);
  750. SendDlgItemMessage (hDlg, IDC_CLOSE, BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE);
  751. SendDlgItemMessage (hDlg, IDC_BT_INS, BM_SETSTYLE, BS_PUSHBUTTON, TRUE);
  752. SendDlgItemMessage (hDlg, IDC_LIST_WORD, LB_RESETCONTENT, 0, 0L);
  753. SetDlgItemText (hDlg,IDC_INPUTCODE, TEXT(""));
  754. SetDlgItemText (hDlg,IDC_INPUTWORD, TEXT(""));
  755. lstrcpy (szInputWordOld, TEXT(""));
  756. lstrcpy (szInputCodeOld, TEXT(""));
  757. {
  758. HIMC hIMC;
  759. LPINPUTCONTEXT lpIMC;
  760. HCURSOR hOldCursor;
  761. WORD wTabStops [1];
  762. wTabStops[0] = 80;
  763. hIMC = (HIMC)ImmGetContext(GetParent(hDlg));
  764. if (!hIMC) {
  765. return (0L);
  766. }
  767. lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
  768. if (!lpIMC) { // Oh! Oh!
  769. return (0L);
  770. }
  771. hOldCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
  772. SendDlgItemMessage (hDlg, IDC_LIST_WORD, LB_SETTABSTOPS, 1, (LPARAM)&wTabStops[0]);
  773. AddStringTolist (lpIMC, hDlg);
  774. SetCursor(hOldCursor);
  775. ImmUnlockIMC(hIMC);
  776. ImmReleaseContext (GetParent(hDlg), hIMC);
  777. }
  778. SetFocus (GetDlgItem (hDlg,IDC_LIST_WORD));
  779. break;
  780. case IDC_INPUTCODE:
  781. {
  782. HIMC hIMC;
  783. hIMC = (HIMC)ImmGetContext(hDlg);
  784. if (!hIMC) {
  785. return FALSE;
  786. }
  787. switch(HIWORD(wParam)) {
  788. case EN_SETFOCUS:
  789. if(hIMC) {
  790. ImmSetOpenStatus(hIMC, FALSE);
  791. ImmUnlockIMC(hIMC);
  792. }
  793. break;
  794. case EN_KILLFOCUS:
  795. if(hIMC) {
  796. ImmSetOpenStatus(hIMC, TRUE);
  797. ImmUnlockIMC(hIMC);
  798. }
  799. break;
  800. default:
  801. break;
  802. }
  803. }
  804. GetDlgItemText (hDlg, IDC_INPUTCODE, szInputCode, MAXCODE);
  805. if (SendDlgItemMessage(hDlg,IDC_INPUTCODE,EM_GETMODIFY,0,0)){
  806. int i, CaretPos;
  807. GetDlgItemText (hDlg, IDC_INPUTCODE, szInputCode, MAXCODE);
  808. if (((CaretPos = CheckCodeKey (szInputCode)) != (-1))) {
  809. lstrcpy (szInputCode, szInputCodeOld);
  810. SetDlgItemText (hDlg,IDC_INPUTCODE, szInputCode);
  811. for (i = 0; i < 1; i++){
  812. MessageBeep (0xFFFFFFFF);
  813. }
  814. }
  815. lstrcpy (szInputCodeOld, szInputCode);
  816. }
  817. break;
  818. case IDC_INPUTWORD:
  819. GetDlgItemText (hDlg, IDC_INPUTWORD, szInputWord, MAXINPUTWORD);
  820. if (SendDlgItemMessage(hDlg,IDC_INPUTWORD,EM_GETMODIFY,0,0)){
  821. int i, CaretPos;
  822. GetDlgItemText(hDlg,IDC_INPUTWORD,szInputWord,MAXINPUTWORD);
  823. if (((CaretPos = CheckKey (szInputWord)) != (-1))) {
  824. lstrcpy (szInputWord, szInputWordOld);
  825. SetDlgItemText (hDlg,IDC_INPUTWORD, szInputWord);
  826. SendDlgItemMessage(hDlg,
  827. IDC_INPUTWORD,
  828. EM_SETSEL,
  829. CaretPos,
  830. CaretPos);
  831. for (i = 0; i < 1; i++){
  832. MessageBeep (0xFFFFFFFF);
  833. }
  834. }
  835. if (MBIndex.MBDesc[0].wNumRulers != 0){
  836. TCHAR MBName[MAXSTRLEN];
  837. static TCHAR szAutoCode [MAXCODE + 1];
  838. HIMC hIMC;
  839. LPINPUTCONTEXT lpIMC;
  840. LPPRIVCONTEXT lpImcP;
  841. hIMC = (HIMC)ImmGetContext(GetParent(hDlg));
  842. if (!hIMC) {
  843. return (0L);
  844. }
  845. lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
  846. if (!lpIMC) { // Oh! Oh!
  847. return (0L);
  848. }
  849. lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
  850. if (!lpImcP) { // Oh! Oh!
  851. return (0L);
  852. }
  853. // auto coding
  854. lstrcpy(MBName, sImeG.szIMESystemPath);
  855. lstrcat((LPTSTR)MBName, TEXT("\\"));
  856. lstrcat((LPTSTR)MBName, (LPCTSTR)lpImcP->MB_Name);
  857. ConvCreateWord(lpIMC->hWnd,
  858. (LPCTSTR)MBName,
  859. (LPTSTR)szInputWord,
  860. (LPTSTR)szAutoCode);
  861. ImmUnlockIMC(hIMC);
  862. ImmUnlockIMCC(lpIMC->hPrivate);
  863. ImmReleaseContext (GetParent(hDlg), hIMC);
  864. SetDlgItemText (hDlg,IDC_INPUTCODE, szAutoCode);
  865. SendDlgItemMessage(hDlg,IDC_INPUTCODE,EM_SETSEL, 0, -1);
  866. lstrcpy (szInputCodeOld, szAutoCode);
  867. }
  868. lstrcpy (szInputWordOld, szInputWord);
  869. }
  870. break;
  871. case IDC_LIST_WORD:
  872. if (SendDlgItemMessage(hDlg,IDC_RADIOADD,BM_GETCHECK,0,0))
  873. break;
  874. if (HIWORD(wParam) == LBN_DBLCLK) {
  875. SendMessage(hDlg,WM_COMMAND,MAKELONG(IDC_BT_MODIFY,0),0);
  876. break;
  877. }
  878. if (!(HIWORD(wParam) == LBN_DELETE)) {
  879. break;
  880. }
  881. MessageBeep (0xFFFFFFFF);
  882. case IDC_BT_DEL:
  883. {
  884. HIMC hIMC;
  885. LPINPUTCONTEXT lpIMC;
  886. TCHAR szList [80];
  887. TCHAR szCode [MAXCODE + 1];
  888. TCHAR szWord [MAXINPUTWORD + 1];
  889. WORD nLenth;
  890. int SelFlag;
  891. int SelIndex [MAXNUMBER_EMB], NewIndex;
  892. WORD SelCount, i;
  893. if ((SelCount=(WORD)SendDlgItemMessage(hDlg,
  894. IDC_LIST_WORD,
  895. LB_GETSELITEMS,
  896. (WPARAM)MAXNUMBER_EMB,
  897. (LPARAM)SelIndex)) == LB_ERR)
  898. break;
  899. if(SelCount) {
  900. TCHAR szDelMessageString [40];
  901. wsprintf (szDelMessageString, TEXT("%d"), SelCount);
  902. #ifdef UNICODE
  903. {
  904. TCHAR UniTmp[] = {0x0020, 0x4E2A, 0x8BCD, 0x6761,
  905. 0x5C06, 0x88AB, 0x5220, 0x9664,
  906. 0x0021, 0x0020, 0x0020, 0x0020,
  907. 0x0020, 0x0020, 0x0020, 0x0020,
  908. 0x0020, 0x0000};
  909. lstrcat (szDelMessageString, UniTmp);
  910. }
  911. #else
  912. lstrcat(szDelMessageString,
  913. TEXT(" ����������ɾ��! "));
  914. #endif
  915. if (IDNO == MessageBox (hDlg,
  916. szDelMessageString,
  917. szWarnTitle,
  918. MB_YESNO|MB_ICONINFORMATION))
  919. break;
  920. } else {
  921. break;
  922. }
  923. hIMC = (HIMC)ImmGetContext(GetParent(hDlg));
  924. if (!hIMC) {
  925. return 0L;
  926. }
  927. lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
  928. if (!lpIMC) { // Oh! Oh!
  929. return (0L);
  930. }
  931. for (i = 0; i < SelCount; i++){
  932. nLenth = (WORD)SendDlgItemMessage(hDlg,
  933. IDC_LIST_WORD,
  934. LB_GETTEXT,
  935. (WPARAM)SelIndex[SelCount-i-1],
  936. (LPARAM)(LPTSTR)szList);
  937. if ( nLenth == LB_ERR) break;
  938. BreakString((LPTSTR)szList,(LPTSTR)szCode,(LPTSTR)szWord);
  939. NewIndex=GetUDCIndex(lpIMC->hPrivate,
  940. (LPTSTR)szCode,
  941. (LPTSTR)szWord);
  942. DelSelCU (lpIMC->hPrivate, NewIndex);
  943. #ifdef EUDC
  944. if(strlen((const char *)szWord) == sizeof(WORD)){
  945. ImeUnregisterWord(szCode,IME_REGWORD_STYLE_EUDC,szWord);
  946. }
  947. #endif
  948. //For modify
  949. SendDlgItemMessage (hDlg,IDC_LIST_WORD,
  950. LB_DELETESTRING, SelIndex [SelCount - i - 1], 0L);
  951. SelFlag = SelIndex [SelCount - i - 1];
  952. }
  953. if (SelFlag>=SendDlgItemMessage(hDlg,IDC_LIST_WORD,
  954. LB_GETCOUNT, 0,0)){
  955. SelFlag = (int) SendDlgItemMessage(hDlg,
  956. IDC_LIST_WORD,
  957. LB_GETCOUNT,
  958. (WPARAM)0,
  959. (LPARAM)0) -1;
  960. } // Keep current item
  961. SendDlgItemMessage (hDlg,IDC_LIST_WORD,
  962. LB_SELITEMRANGE, 1, MAKELONG(SelFlag, SelFlag));
  963. SendDlgItemMessage (hDlg,IDC_LIST_WORD,
  964. LB_SETCARETINDEX, SelFlag, 0L);
  965. ImmUnlockIMC(hIMC);
  966. ImmReleaseContext (GetParent(hDlg), hIMC);
  967. SetFocus (GetDlgItem (hDlg, IDC_LIST_WORD));
  968. break;
  969. }
  970. case IDC_BT_MODIFY:
  971. {
  972. // get string in listbox
  973. TCHAR szList [80];
  974. WORD nLenth;
  975. int SelIndex [50];
  976. WORD SelCount;
  977. SelCount=(WORD)SendDlgItemMessage(hDlg,
  978. IDC_LIST_WORD,
  979. LB_GETSELITEMS,
  980. (WPARAM)50,
  981. (LPARAM)SelIndex);
  982. if ((SelCount == LB_ERR)||(SelCount != 1)) break;
  983. nLenth=(WORD)SendDlgItemMessage(hDlg,
  984. IDC_LIST_WORD,
  985. LB_GETTEXT,
  986. (WPARAM)SelIndex[0],
  987. (LPARAM)(LPTSTR)szList);
  988. if (nLenth == LB_ERR) break;
  989. BreakString((LPTSTR)szList,
  990. (LPTSTR)szModiCode,
  991. (LPTSTR)szModiWord);
  992. SendDlgItemMessage (hDlg,IDC_LIST_WORD,
  993. LB_DELETESTRING, SelIndex [0], 0L);
  994. }
  995. DialogBox(hInst,TEXT("MODIWORD"),hDlg,(DLGPROC)ModiWordDlgProc);
  996. SetFocus(GetDlgItem (hDlg, IDC_BT_MODIFY));
  997. SendDlgItemMessage (hDlg,
  998. IDC_BT_MODIFY,
  999. BM_SETSTYLE,
  1000. BS_DEFPUSHBUTTON,
  1001. TRUE);
  1002. {
  1003. TCHAR WCodeStr[MAXCODE + 1];
  1004. TCHAR DBCSStr [MAXINPUTWORD + 1];
  1005. TCHAR szOutList[80];
  1006. int ModiIndex;
  1007. lstrcpy (WCodeStr, szModiCode);
  1008. lstrcpy (DBCSStr , szModiWord);
  1009. MyStrFormat (szOutList, WCodeStr, DBCSStr);
  1010. SendDlgItemMessage (hDlg,
  1011. IDC_LIST_WORD,
  1012. LB_ADDSTRING,
  1013. (WPARAM)0,
  1014. (LPARAM)(LPTSTR)szOutList);
  1015. ModiIndex =(int)SendDlgItemMessage(hDlg,
  1016. IDC_LIST_WORD,
  1017. LB_FINDSTRING,
  1018. (WPARAM) -1,
  1019. (LPARAM)(LPTSTR)szOutList);
  1020. SendDlgItemMessage (hDlg,IDC_LIST_WORD,
  1021. LB_SELITEMRANGE,
  1022. 1,
  1023. MAKELONG(ModiIndex, ModiIndex));
  1024. SendDlgItemMessage (hDlg,IDC_LIST_WORD,
  1025. LB_SETCARETINDEX,
  1026. ModiIndex,
  1027. 0L);
  1028. SetFocus (GetDlgItem (hDlg, IDC_BT_MODIFY));
  1029. }
  1030. break;
  1031. case IDC_BT_INS:
  1032. {
  1033. HIMC hIMC;
  1034. LPINPUTCONTEXT lpIMC;
  1035. int fAddWordFlag;
  1036. HWND hControl;
  1037. TCHAR szListWord [80];
  1038. {
  1039. TCHAR szWord [MAXINPUTWORD + 1];
  1040. TCHAR szCode [MAXCODE + 1] ;
  1041. GetDlgItemText(hDlg,IDC_INPUTWORD,szWord,MAXINPUTWORD);
  1042. GetDlgItemText (hDlg, IDC_INPUTCODE, szCode, MAXCODE);
  1043. if (lstrlen(szWord) == 0){
  1044. SetFocus (GetDlgItem (hDlg,IDC_INPUTWORD));
  1045. break;
  1046. } else if (lstrlen(szCode) == 0){
  1047. SetFocus (GetDlgItem (hDlg,IDC_INPUTCODE));
  1048. break;
  1049. }
  1050. }
  1051. GetDlgItemText(hDlg,IDC_INPUTWORD,szInputWord,MAXINPUTWORD);
  1052. GetDlgItemText (hDlg, IDC_INPUTCODE, szInputCode, MAXCODE);
  1053. MyStrFormat (szListWord, szInputCode, szInputWord);
  1054. if(lstrlen(szInputWord) && lstrlen(szInputCode)) {
  1055. hIMC = (HIMC)ImmGetContext(GetParent (hDlg));
  1056. if (!hIMC) {
  1057. return 0L;
  1058. }
  1059. lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
  1060. if (!lpIMC) { // Oh! Oh!
  1061. return (0L);
  1062. }
  1063. CharLowerBuff(szInputCode, lstrlen(szInputCode));
  1064. {
  1065. UINT i;
  1066. for(i=0;i<strlen((const char *)szInputCode);i++){
  1067. if(!IsUsedCode(szInputCode[i], NULL)){
  1068. InfoMessage(NULL, IDS_WARN_INVALIDCODE);
  1069. ImmUnlockIMC(hIMC);
  1070. ImmReleaseContext(GetParent(GetParent(hDlg)),
  1071. hIMC);
  1072. return(0L);
  1073. }
  1074. }
  1075. }
  1076. fAddWordFlag = AddZCItem(lpIMC->hPrivate,
  1077. szInputCode,
  1078. szInputWord);
  1079. ImmUnlockIMC(hIMC);
  1080. ImmReleaseContext (GetParent(hDlg), hIMC);
  1081. if (fAddWordFlag == ADD_REP){
  1082. InfoMessage(NULL, IDS_WARN_DUPPRASE);
  1083. break;
  1084. } else if (fAddWordFlag == ADD_FULL){
  1085. InfoMessage(NULL, IDS_WARN_OVEREMB);
  1086. break;
  1087. }
  1088. hControl = GetDlgItem (hDlg,IDC_LIST_WORD);
  1089. SendMessage (hControl, LB_ADDSTRING, (WPARAM) 0,
  1090. (LPARAM)(LPTSTR)szListWord);
  1091. } else {
  1092. szInputWord[0] = 0;
  1093. szInputCode[0] = 0;
  1094. }
  1095. }
  1096. SetDlgItemText (hDlg,IDC_INPUTWORD, TEXT(""));
  1097. SetDlgItemText (hDlg,IDC_INPUTCODE, TEXT(""));
  1098. lstrcpy (szInputWordOld, TEXT(""));
  1099. lstrcpy (szInputCodeOld, TEXT(""));
  1100. SetFocus (GetDlgItem (hDlg,IDC_INPUTWORD));
  1101. break;
  1102. case IDC_CLOSE:
  1103. hCrtDlg = NULL;
  1104. lstrcpy (szInputWordOld, TEXT(""));
  1105. lstrcpy (szInputCodeOld, TEXT(""));
  1106. EndDialog (hDlg, FALSE);
  1107. break;
  1108. case IDCANCEL:
  1109. hCrtDlg = NULL;
  1110. lstrcpy (szInputWordOld, TEXT(""));
  1111. lstrcpy (szInputCodeOld, TEXT(""));
  1112. EndDialog(hDlg, FALSE);
  1113. break;
  1114. default:
  1115. return (FALSE);
  1116. break;
  1117. }
  1118. return (TRUE);
  1119. case WM_CLOSE:
  1120. if (hChildDlg) SendMessage(hChildDlg, WM_CLOSE, 0, 0);
  1121. hCrtDlg = NULL;
  1122. lstrcpy (szInputWordOld, TEXT(""));
  1123. lstrcpy (szInputCodeOld, TEXT(""));
  1124. EndDialog(hDlg, FALSE);
  1125. return (TRUE);
  1126. default:
  1127. return (FALSE);
  1128. }
  1129. return (TRUE);
  1130. }
  1131. /*********************************************************************/
  1132. /* void AddStringTolist ( LPINPUTCONTEXT lpIMC) */
  1133. /*********************************************************************/
  1134. void AddStringTolist ( LPINPUTCONTEXT lpIMC,
  1135. HWND hDlg)
  1136. {
  1137. TCHAR WCodeStr[MAXCODE + 1];
  1138. TCHAR DBCSStr [MAXINPUTWORD + 1];
  1139. TCHAR szOutList[80];
  1140. int i = 0, n = 0;
  1141. while (GetUDCItem(lpIMC->hPrivate, i, (LPTSTR)&WCodeStr, (LPTSTR)&DBCSStr)){
  1142. MyStrFormat(szOutList, WCodeStr, DBCSStr);
  1143. SendDlgItemMessage (hDlg, IDC_LIST_WORD, LB_ADDSTRING, (WPARAM)0,
  1144. (LPARAM)(LPTSTR)szOutList);
  1145. i ++;
  1146. }
  1147. }
  1148. /*********************************************************************/
  1149. /* int CheckKey (char szInputWord[]) */
  1150. /* */
  1151. /*********************************************************************/
  1152. int CheckKey (TCHAR szInputWord[])
  1153. {
  1154. int i;
  1155. #ifdef UNICODE
  1156. for (i = 0; i < lstrlen (szInputWord); i++ ){
  1157. if ((WORD)szInputWord [i] < 0x100) return i;
  1158. }
  1159. #else
  1160. for (i = 0; i < lstrlen (szInputWord); i += 2 ){
  1161. if ((BYTE)szInputWord [i] < 128) return i;
  1162. }
  1163. #endif
  1164. return (-1);
  1165. }
  1166. /************************************************************************/
  1167. /*BOOL CrtIsUsedCode(TCHAR wCharCode) */
  1168. /************************************************************************/
  1169. BOOL CrtIsUsedCode(TCHAR wCharCode)
  1170. {
  1171. WORD wFlg;
  1172. for(wFlg=0; wFlg<MBIndex.MBDesc[0].wNumCodes; wFlg++){
  1173. if (wCharCode == MBIndex.MBDesc[0].szUsedCode[wFlg])
  1174. break;
  1175. }
  1176. if(wFlg < MBIndex.MBDesc[0].wNumCodes)
  1177. return (TRUE);
  1178. return (FALSE);
  1179. }
  1180. /*********************************************************************/
  1181. /* int CheckCodeKey (TCHAR szInputCode[]) */
  1182. /* */
  1183. /*********************************************************************/
  1184. int CheckCodeKey (TCHAR szInputCode[])
  1185. {
  1186. int i;
  1187. for (i = 0; i < lstrlen (szInputCode); i++){
  1188. #ifdef UNICODE
  1189. if (szInputCode[i] > 0x100) return i;
  1190. #else
  1191. if ((BYTE)szInputCode [i] > 128) return i;
  1192. #endif
  1193. if(IsCharUpper(szInputCode [i])) {
  1194. szInputCode [i] |= 0x20;
  1195. }
  1196. if (!CrtIsUsedCode (szInputCode [i])) return i;
  1197. }
  1198. return (-1);
  1199. }
  1200. /********************************************************************/
  1201. /*BOOL FAR PASCAL ListWordProc( HWND hwnd, */
  1202. /* UINT uMessage, */
  1203. /* WPARAM wParam, */
  1204. /* LPARAM lParam) */
  1205. /********************************************************************/
  1206. BOOL FAR PASCAL ListWordProc(
  1207. HWND hwnd,
  1208. UINT uMessage,
  1209. WPARAM wParam,
  1210. LPARAM lParam)
  1211. {
  1212. switch (uMessage){
  1213. case WM_KEYDOWN:
  1214. if (wParam == VK_DELETE){
  1215. SendMessage (GetParent (hwnd), WM_COMMAND,
  1216. MAKELONG(IDC_LIST_WORD, (WORD)LBN_DELETE), (LPARAM)hwnd);
  1217. return TRUE;
  1218. }
  1219. break;
  1220. default :
  1221. break;
  1222. }
  1223. return (BOOL) CallWindowProc ((WNDPROC)lpListWordOld, hwnd, uMessage, wParam, lParam);
  1224. }
  1225. /**********************************************************************/
  1226. /* ModiWordDlgProc() */
  1227. /* Return Value: */
  1228. /* TRUE - successful, FALSE - failure */
  1229. /**********************************************************************/
  1230. BOOL FAR PASCAL ModiWordDlgProc(
  1231. HWND hDlg,
  1232. UINT uMessage,
  1233. DWORD wParam,
  1234. LONG lParam)
  1235. {
  1236. RECT rc;
  1237. LONG DlgWidth, DlgHeight;
  1238. RECT rcWorkArea;
  1239. static TCHAR szInputWord [MAXINPUTWORD + 1];
  1240. static TCHAR szInputCode [MAXCODE + 1];
  1241. static TCHAR szInputWordOld [MAXINPUTWORD + 1] ;
  1242. static TCHAR szInputCodeOld [MAXCODE + 1] ;
  1243. switch (uMessage) {
  1244. case WM_INITDIALOG:
  1245. // reset position
  1246. hChildDlg = hDlg;
  1247. GetWindowRect(hDlg, &rc);
  1248. DlgWidth = rc.right - rc.left;
  1249. DlgHeight = rc.bottom - rc.top;
  1250. rcWorkArea = ImeMonitorWorkAreaFromWindow(hDlg);
  1251. SetWindowPos(hDlg, HWND_TOP,
  1252. (int)(rcWorkArea.right - DlgWidth)/2,
  1253. (int)(rcWorkArea.bottom - DlgHeight)/2,
  1254. (int) 0, (int) 0, SWP_NOSIZE);
  1255. SendDlgItemMessage (hDlg, IDC_MODI_WORD, EM_LIMITTEXT, MAXINPUTWORD, 0);
  1256. SendDlgItemMessage (hDlg, IDC_MODI_CODE, EM_LIMITTEXT, MBIndex.MBDesc[0].wMaxCodes, 0);
  1257. SetDlgItemText (hDlg,IDC_MODI_CODE, szModiCode);
  1258. SetDlgItemText (hDlg,IDC_MODI_WORD, szModiWord);
  1259. SetFocus (GetDlgItem (hDlg,IDC_MODI_WORD));
  1260. lstrcpy (szInputWordOld, szModiWord);
  1261. lstrcpy (szInputCodeOld, szModiCode);
  1262. return (TRUE); // don't want to set focus to special control
  1263. case WM_PAINT:
  1264. {
  1265. RECT rc;
  1266. GetClientRect(hDlg, &rc);
  1267. DrawConvexRect(GetDC(hDlg),
  1268. rc.left + 5,
  1269. rc.top + 5,
  1270. rc.right - 5 - 1,
  1271. rc.bottom - 10 - 1);
  1272. DrawConvexRectP(GetDC(hDlg),
  1273. rc.left + 5,
  1274. rc.top + 5,
  1275. rc.right - 5,
  1276. rc.bottom - 10);
  1277. }
  1278. return (FALSE);
  1279. case WM_COMMAND:
  1280. switch (LOWORD(wParam)) {
  1281. case IDC_MODI_CODE:
  1282. {
  1283. HIMC hIMC;
  1284. hIMC = (HIMC)ImmGetContext(hDlg);
  1285. if (!hIMC) {
  1286. return 0L;
  1287. }
  1288. switch(HIWORD(wParam)) {
  1289. case EN_SETFOCUS:
  1290. if(hIMC) {
  1291. ImmSetOpenStatus(hIMC, FALSE);
  1292. ImmUnlockIMC(hIMC);
  1293. }
  1294. break;
  1295. case EN_KILLFOCUS:
  1296. if(hIMC) {
  1297. ImmSetOpenStatus(hIMC, TRUE);
  1298. ImmUnlockIMC(hIMC);
  1299. }
  1300. break;
  1301. default:
  1302. break;
  1303. }
  1304. }
  1305. GetDlgItemText (hDlg, IDC_MODI_CODE, szInputCode, MAXCODE);
  1306. if (SendDlgItemMessage (hDlg,IDC_MODI_CODE, EM_GETMODIFY, 0, 0)){
  1307. int i, CaretPos;
  1308. GetDlgItemText (hDlg, IDC_MODI_CODE, szInputCode, MAXCODE);
  1309. if ( ((CaretPos = CheckCodeKey (szInputCode)) != (-1))) {
  1310. lstrcpy (szInputCode, szInputCodeOld);
  1311. SetDlgItemText (hDlg,IDC_MODI_CODE, szInputCode);
  1312. for (i = 0; i < 1; i++){
  1313. MessageBeep (0XFFFFFFFF);
  1314. }
  1315. }
  1316. lstrcpy (szInputCodeOld, szInputCode);
  1317. }
  1318. break;
  1319. case IDC_MODI_WORD:
  1320. GetDlgItemText (hDlg, IDC_MODI_WORD, szInputWord, MAXINPUTWORD);
  1321. if (SendDlgItemMessage (hDlg,IDC_MODI_WORD, EM_GETMODIFY, 0, 0)){
  1322. int i, CaretPos;
  1323. GetDlgItemText (hDlg, IDC_MODI_WORD, szInputWord, MAXINPUTWORD);
  1324. if (((CaretPos = CheckKey (szInputWord)) != (-1))) {
  1325. lstrcpy (szInputWord, szInputWordOld);
  1326. SetDlgItemText (hDlg,IDC_MODI_WORD, szInputWord);
  1327. SendDlgItemMessage (hDlg,
  1328. IDC_MODI_WORD,
  1329. EM_SETSEL,
  1330. CaretPos,
  1331. CaretPos);
  1332. for (i = 0; i < 1; i++){
  1333. MessageBeep (0xFFFFFFFF);
  1334. }
  1335. }
  1336. if (MBIndex.MBDesc[0].wNumRulers != 0){
  1337. TCHAR MBName[MAXSTRLEN];
  1338. TCHAR szAutoCode [MAXCODE + 1];
  1339. HIMC hIMC;
  1340. LPINPUTCONTEXT lpIMC;
  1341. LPPRIVCONTEXT lpImcP;
  1342. hIMC = (HIMC)ImmGetContext(GetParent(GetParent(hDlg)));
  1343. if (!hIMC) {
  1344. return 0L;
  1345. }
  1346. lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
  1347. if (!lpIMC) { // Oh! Oh!
  1348. return (0L);
  1349. }
  1350. lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
  1351. if (!lpImcP) { // Oh! Oh!
  1352. return (0L);
  1353. }
  1354. // auto coding
  1355. lstrcpy(MBName, sImeG.szIMESystemPath);
  1356. lstrcat((LPTSTR)MBName, TEXT("\\"));
  1357. lstrcat((LPTSTR)MBName, (LPCTSTR)lpImcP->MB_Name);
  1358. ConvCreateWord( lpIMC->hWnd,
  1359. (LPCTSTR)MBName,
  1360. (LPTSTR)szInputWord,
  1361. (LPTSTR)szAutoCode);
  1362. ImmUnlockIMC(hIMC);
  1363. ImmUnlockIMCC(lpIMC->hPrivate);
  1364. ImmReleaseContext(GetParent(GetParent (hDlg)), hIMC);
  1365. SetDlgItemText (hDlg,IDC_MODI_CODE, szAutoCode);
  1366. SendDlgItemMessage (hDlg,IDC_MODI_CODE, EM_SETSEL, 0, -1);
  1367. lstrcpy (szInputCodeOld, szAutoCode);
  1368. }
  1369. lstrcpy (szInputWordOld, szInputWord);
  1370. }
  1371. break;
  1372. case IDOK:
  1373. {
  1374. int iIndexFind;
  1375. TCHAR szFinalCode [MAXCODE + 1];
  1376. TCHAR szFinalWord [MAXINPUTWORD + 1];
  1377. GetDlgItemText (hDlg, IDC_MODI_WORD, szFinalWord, MAXINPUTWORD);
  1378. GetDlgItemText (hDlg, IDC_MODI_CODE, szFinalCode, MAXCODE);
  1379. CharLowerBuff (szFinalWord, lstrlen(szFinalWord));
  1380. CharLowerBuff (szFinalCode, lstrlen(szFinalCode));
  1381. if (lstrlen(szFinalWord) == 0){
  1382. SetFocus (GetDlgItem (hDlg,IDC_MODI_WORD));
  1383. break;
  1384. } else if (lstrlen(szFinalCode) == 0){
  1385. SetFocus (GetDlgItem (hDlg,IDC_MODI_CODE));
  1386. break;
  1387. }
  1388. if ((!lstrcmpi (szFinalCode, szModiCode)) && (!lstrcmpi (szFinalWord, szModiWord))){
  1389. //hadn't modify
  1390. hCrtDlg = NULL;
  1391. EndDialog(hDlg, FALSE);
  1392. break;
  1393. }else {
  1394. HIMC hIMC;
  1395. LPINPUTCONTEXT lpIMC;
  1396. hIMC = (HIMC)ImmGetContext(GetParent(GetParent (hDlg)));
  1397. if (!hIMC) {
  1398. return 0L;
  1399. }
  1400. lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
  1401. if (!lpIMC) { // Oh! Oh!
  1402. return (0L);
  1403. }
  1404. {
  1405. UINT i;
  1406. for(i=0;i<strlen((const char *)szFinalCode);i++){
  1407. if(!IsUsedCode(szFinalCode[i], NULL)){
  1408. InfoMessage(NULL, IDS_WARN_INVALIDCODE);
  1409. ImmUnlockIMC(hIMC);
  1410. ImmReleaseContext (GetParent(GetParent (hDlg)), hIMC);
  1411. return(0L);
  1412. }
  1413. }
  1414. }
  1415. iIndexFind = GetUDCIndex(lpIMC->hPrivate, szFinalCode, szFinalWord);
  1416. if (iIndexFind == -1 || iIndexFind >= MAXNUMBER_EMB){
  1417. //hadn't found
  1418. DelItem (lpIMC->hPrivate, szModiCode, szModiWord);
  1419. AddZCItem(lpIMC->hPrivate, szFinalCode, szFinalWord);
  1420. lstrcpy (szModiWord, szFinalWord);
  1421. lstrcpy (szModiCode, szFinalCode);
  1422. ImmUnlockIMC(hIMC);
  1423. ImmReleaseContext (GetParent(GetParent (hDlg)), hIMC);
  1424. hCrtDlg = NULL;
  1425. EndDialog(hDlg, FALSE);
  1426. break;
  1427. }else{
  1428. InfoMessage(NULL, IDS_WARN_DUPPRASE);
  1429. break;
  1430. }
  1431. ImmUnlockIMC(hIMC);
  1432. ImmReleaseContext (GetParent(GetParent (hDlg)), hIMC);
  1433. }
  1434. }
  1435. hCrtDlg = NULL;
  1436. EndDialog(hDlg, FALSE);
  1437. break;
  1438. case IDCANCEL:
  1439. hCrtDlg = NULL;
  1440. EndDialog(hDlg, FALSE);
  1441. break;
  1442. default:
  1443. return (FALSE);
  1444. break;
  1445. }
  1446. return (TRUE);
  1447. case WM_CLOSE:
  1448. hChildDlg = NULL;
  1449. EndDialog(hDlg, FALSE);
  1450. return (TRUE);
  1451. default:
  1452. return (FALSE);
  1453. }
  1454. return (TRUE);
  1455. }
  1456. /*************************************************************************/
  1457. /* int DelItem (HIMCC, LPTSTR, LPTSTR) */
  1458. /*************************************************************************/
  1459. int DelItem (HIMCC hPrivate, LPTSTR szCode, LPTSTR szWord)
  1460. {
  1461. int iStringIndex;
  1462. iStringIndex = GetUDCIndex(hPrivate, szCode, szWord);
  1463. if (iStringIndex == -1 || iStringIndex >= MAXNUMBER_EMB){
  1464. return -1;
  1465. }else{
  1466. DelSelCU (hPrivate, iStringIndex);
  1467. }
  1468. return iStringIndex;
  1469. }
  1470. /*************************************************************************/
  1471. /* void BreakString (LPTSTR szList, LPTSTR szCode, LPTSTR szWord) */
  1472. /*************************************************************************/
  1473. void BreakString (LPTSTR szList,
  1474. LPTSTR szCode,
  1475. LPTSTR szWord)
  1476. {
  1477. int i = 0, j = 0;
  1478. while (szList[i] != TEXT(' ')){
  1479. szCode[j] = szList[i];
  1480. i ++;
  1481. j ++;
  1482. }
  1483. szCode[j] = TEXT('\0');
  1484. lstrcpy(szWord, &szList[20]);
  1485. }
  1486. /**********************************************************************/
  1487. /* ImeVerDlgProc() */
  1488. /* Return Value: */
  1489. /* TRUE - successful, FALSE - failure */
  1490. /**********************************************************************/
  1491. BOOL FAR PASCAL ImeVerDlgProc( // dialog procedure of configuration
  1492. HWND hDlg,
  1493. UINT uMessage,
  1494. DWORD wParam,
  1495. LONG lParam)
  1496. {
  1497. RECT rc;
  1498. LONG DlgWidth, DlgHeight;
  1499. RECT rcWorkArea;
  1500. rcWorkArea = ImeMonitorWorkAreaFromWindow(hDlg);
  1501. switch (uMessage) {
  1502. case WM_INITDIALOG:
  1503. hCrtDlg = hDlg;
  1504. // reset position
  1505. GetWindowRect(hDlg, &rc);
  1506. DlgWidth = rc.right - rc.left;
  1507. DlgHeight = rc.bottom - rc.top;
  1508. SetWindowPos(hDlg, HWND_TOP,
  1509. (int)(rcWorkArea.right - DlgWidth)/2,
  1510. (int)(rcWorkArea.bottom - DlgHeight)/2,
  1511. (int) 0, (int) 0, SWP_NOSIZE);
  1512. return (TRUE); // don't want to set focus to special control
  1513. case WM_COMMAND:
  1514. switch (wParam) {
  1515. case IDOK:
  1516. EndDialog(hDlg, FALSE);
  1517. break;
  1518. case IDCANCEL:
  1519. EndDialog(hDlg, FALSE);
  1520. break;
  1521. default:
  1522. return (FALSE);
  1523. break;
  1524. }
  1525. return (TRUE);
  1526. case WM_CLOSE:
  1527. EndDialog(hDlg, FALSE);
  1528. return FALSE;
  1529. case WM_PAINT:
  1530. {
  1531. HDC hDC;
  1532. PAINTSTRUCT ps;
  1533. RECT rc;
  1534. RECT rcVerInfo, rcOrgAuthorName;
  1535. HGDIOBJ hOldFont;
  1536. LOGFONT lfFont;
  1537. HFONT hNewFont;
  1538. hDC = BeginPaint(hDlg, &ps);
  1539. GetClientRect(hDlg, &rc);
  1540. DrawConvexRect(hDC,
  1541. rc.left + 10,
  1542. rc.top + 10,
  1543. rc.right - 10 - 1,
  1544. rc.bottom - 43 - 1);
  1545. DrawConvexRectP(hDC,
  1546. rc.left + 10,
  1547. rc.top + 10,
  1548. rc.right - 10,
  1549. rc.bottom - 43);
  1550. // draw ver info and org&auther name
  1551. rcVerInfo.left = rc.left+10;
  1552. rcVerInfo.right = rc.right;
  1553. rcVerInfo.top = rc.top + 30;
  1554. rcVerInfo.bottom = rcVerInfo.top + 19;
  1555. rcOrgAuthorName.left = rc.left;
  1556. rcOrgAuthorName.right = rc.right;
  1557. //rcOrgAuthorName.top = rcVerInfo.bottom + 12;
  1558. rcOrgAuthorName.top = rcVerInfo.bottom + 4;
  1559. rcOrgAuthorName.bottom = rcOrgAuthorName.top + 19;
  1560. SetTextColor(hDC, RGB(0x00, 0x00, 0x00));
  1561. SetBkColor(hDC, RGB(0xC0, 0xC0, 0xC0));
  1562. // set font
  1563. if (sImeG.fDiffSysCharSet) {
  1564. LOGFONT lfFont;
  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, LPTSTR s1, LPTSTR s2)
  1721. {
  1722. int i;
  1723. int len = lstrlen(s1);
  1724. lstrcpy(dest, s1);
  1725. for (i = 0; i < STR_FORMAT_POS-len; i++)
  1726. dest[len+i] = STR_FORMAT_CHAR;
  1727. lstrcpy(&dest[STR_FORMAT_POS], s2);
  1728. return;
  1729. }