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.

1412 lines
41 KiB

  1. /*++
  2. Copyright (c) 1995-1999 Microsoft Corporation, All Rights Reserved
  3. Module Name:
  4. UI.c
  5. ++*/
  6. #include <windows.h>
  7. #include <immdev.h>
  8. #include <imedefs.h>
  9. /**********************************************************************/
  10. /* CMenuDestryed() */
  11. /**********************************************************************/
  12. void PASCAL CMenuDestroyed( // context menu window
  13. // already destroyed
  14. HWND hUIWnd)
  15. {
  16. HGLOBAL hUIPrivate;
  17. LPUIPRIV lpUIPrivate;
  18. hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE);
  19. if (!hUIPrivate) { // Oh! Oh!
  20. return;
  21. }
  22. lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
  23. if (!lpUIPrivate) { // Oh! Oh!
  24. return;
  25. }
  26. lpUIPrivate->hCMenuWnd = NULL;
  27. GlobalUnlock(hUIPrivate);
  28. }
  29. /**********************************************************************/
  30. /* SoftkeyMenuDestroyed() */
  31. /**********************************************************************/
  32. void PASCAL SoftkeyMenuDestroyed( // context menu window
  33. // already destroyed
  34. HWND hUIWnd)
  35. {
  36. HGLOBAL hUIPrivate;
  37. LPUIPRIV lpUIPrivate;
  38. hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE);
  39. if (!hUIPrivate) { // Oh! Oh!
  40. return;
  41. }
  42. lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
  43. if (!lpUIPrivate) { // Oh! Oh!
  44. return;
  45. }
  46. lpUIPrivate->hSoftkeyMenuWnd = NULL;
  47. GlobalUnlock(hUIPrivate);
  48. }
  49. /**********************************************************************/
  50. /* CreateUIWindow() */
  51. /**********************************************************************/
  52. void PASCAL CreateUIWindow( // create composition window
  53. HWND hUIWnd)
  54. {
  55. HGLOBAL hUIPrivate;
  56. // create storage for UI setting
  57. hUIPrivate = GlobalAlloc(GHND, sizeof(UIPRIV));
  58. if (!hUIPrivate) { // Oh! Oh!
  59. return;
  60. }
  61. SetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE, (LONG_PTR)hUIPrivate);
  62. // set the default position for UI window, it is hide now
  63. SetWindowPos(hUIWnd, NULL, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOZORDER);
  64. ShowWindow(hUIWnd, SW_SHOWNOACTIVATE);
  65. return;
  66. }
  67. /**********************************************************************/
  68. /* DestroyUIWindow() */
  69. /**********************************************************************/
  70. void PASCAL DestroyUIWindow( // destroy composition window
  71. HWND hUIWnd)
  72. {
  73. HGLOBAL hUIPrivate;
  74. LPUIPRIV lpUIPrivate;
  75. hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE);
  76. if (!hUIPrivate) { // Oh! Oh!
  77. return;
  78. }
  79. lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
  80. if (!lpUIPrivate) { // Oh! Oh!
  81. return;
  82. }
  83. //destroy ContextMenuWnd
  84. if (lpUIPrivate->hCMenuWnd) {
  85. SetWindowLongPtr(lpUIPrivate->hCMenuWnd, CMENU_HUIWND,(LONG_PTR)0);
  86. PostMessage(lpUIPrivate->hCMenuWnd, WM_USER_DESTROY, 0, 0);
  87. }
  88. //destroy SoftkeyMenuWnd
  89. if (lpUIPrivate->hSoftkeyMenuWnd) {
  90. SetWindowLongPtr(lpUIPrivate->hSoftkeyMenuWnd, SOFTKEYMENU_HUIWND,(LONG_PTR)0);
  91. PostMessage(lpUIPrivate->hSoftkeyMenuWnd, WM_USER_DESTROY, 0, 0);
  92. }
  93. // composition window need to be destroyed
  94. if (lpUIPrivate->hCompWnd) {
  95. DestroyWindow(lpUIPrivate->hCompWnd);
  96. }
  97. // candidate window need to be destroyed
  98. if (lpUIPrivate->hCandWnd) {
  99. DestroyWindow(lpUIPrivate->hCandWnd);
  100. }
  101. // status window need to be destroyed
  102. if (lpUIPrivate->hStatusWnd) {
  103. DestroyWindow(lpUIPrivate->hStatusWnd);
  104. }
  105. // soft keyboard window need to be destroyed
  106. if (lpUIPrivate->hSoftKbdWnd) {
  107. ImmDestroySoftKeyboard(lpUIPrivate->hSoftKbdWnd);
  108. }
  109. GlobalUnlock(hUIPrivate);
  110. // free storage for UI settings
  111. GlobalFree(hUIPrivate);
  112. return;
  113. }
  114. /**********************************************************************/
  115. /* ShowSoftKbd */
  116. /**********************************************************************/
  117. void PASCAL ShowSoftKbd( // Show the soft keyboard window
  118. HWND hUIWnd,
  119. int nShowSoftKbdCmd,
  120. LPPRIVCONTEXT lpImcP)
  121. {
  122. HGLOBAL hUIPrivate;
  123. LPUIPRIV lpUIPrivate;
  124. hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE);
  125. if (!hUIPrivate) { // can not darw status window
  126. return;
  127. }
  128. lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
  129. if (!lpUIPrivate) { // can not draw status window
  130. return;
  131. }
  132. CheckMenuItem(lpImeL->hSKMenu, IDM_SKL1, MF_UNCHECKED);
  133. CheckMenuItem(lpImeL->hSKMenu, IDM_SKL2, MF_UNCHECKED);
  134. CheckMenuItem(lpImeL->hSKMenu, IDM_SKL3, MF_UNCHECKED);
  135. CheckMenuItem(lpImeL->hSKMenu, IDM_SKL4, MF_UNCHECKED);
  136. CheckMenuItem(lpImeL->hSKMenu, IDM_SKL5, MF_UNCHECKED);
  137. CheckMenuItem(lpImeL->hSKMenu, IDM_SKL6, MF_UNCHECKED);
  138. CheckMenuItem(lpImeL->hSKMenu, IDM_SKL7, MF_UNCHECKED);
  139. CheckMenuItem(lpImeL->hSKMenu, IDM_SKL8, MF_UNCHECKED);
  140. CheckMenuItem(lpImeL->hSKMenu, IDM_SKL9, MF_UNCHECKED);
  141. CheckMenuItem(lpImeL->hSKMenu, IDM_SKL10, MF_UNCHECKED);
  142. CheckMenuItem(lpImeL->hSKMenu, IDM_SKL11, MF_UNCHECKED);
  143. CheckMenuItem(lpImeL->hSKMenu, IDM_SKL12, MF_UNCHECKED);
  144. CheckMenuItem(lpImeL->hSKMenu, IDM_SKL13, MF_UNCHECKED);
  145. if (!lpUIPrivate->hSoftKbdWnd) {
  146. // not in show status window mode
  147. } else if (lpUIPrivate->nShowSoftKbdCmd != nShowSoftKbdCmd) {
  148. ImmShowSoftKeyboard(lpUIPrivate->hSoftKbdWnd, nShowSoftKbdCmd);
  149. lpUIPrivate->nShowSoftKbdCmd = nShowSoftKbdCmd;
  150. }
  151. GlobalUnlock(hUIPrivate);
  152. return;
  153. }
  154. /**********************************************************************/
  155. /* CheckSoftKbdPosition() */
  156. /**********************************************************************/
  157. void PASCAL CheckSoftKbdPosition(
  158. LPUIPRIV lpUIPrivate,
  159. LPINPUTCONTEXT lpIMC)
  160. {
  161. #if 0 // MultiMonitor support
  162. UINT fPortionBits = 0;
  163. UINT fPortionTest;
  164. int xPortion, yPortion, nPortion;
  165. RECT rcWnd;
  166. // portion of dispaly
  167. // 0 1
  168. // 2 3
  169. if (lpUIPrivate->hCompWnd) {
  170. GetWindowRect(lpUIPrivate->hCompWnd, &rcWnd);
  171. if (rcWnd.left > sImeG.rcWorkArea.right / 2) {
  172. xPortion = 1;
  173. } else {
  174. xPortion = 0;
  175. }
  176. if (rcWnd.top > sImeG.rcWorkArea.bottom / 2) {
  177. yPortion = 1;
  178. } else {
  179. yPortion = 0;
  180. }
  181. fPortionBits |= 0x0001 << (yPortion * 2 + xPortion);
  182. }
  183. if (lpUIPrivate->hStatusWnd) {
  184. GetWindowRect(lpUIPrivate->hStatusWnd, &rcWnd);
  185. if (rcWnd.left > sImeG.rcWorkArea.right / 2) {
  186. xPortion = 1;
  187. } else {
  188. xPortion = 0;
  189. }
  190. if (rcWnd.top > sImeG.rcWorkArea.bottom / 2) {
  191. yPortion = 1;
  192. } else {
  193. yPortion = 0;
  194. }
  195. fPortionBits |= 0x0001 << (yPortion * 2 + xPortion);
  196. }
  197. GetWindowRect(lpUIPrivate->hSoftKbdWnd, &rcWnd);
  198. // start from portion 3
  199. for (nPortion = 3, fPortionTest = 0x0008; fPortionTest;
  200. nPortion--, fPortionTest >>= 1) {
  201. if (fPortionTest & fPortionBits) {
  202. // someone here!
  203. continue;
  204. }
  205. if (nPortion % 2) {
  206. lpIMC->ptSoftKbdPos.x = sImeG.rcWorkArea.right -
  207. (rcWnd.right - rcWnd.left) - UI_MARGIN;
  208. } else {
  209. lpIMC->ptSoftKbdPos.x = sImeG.rcWorkArea.left;
  210. }
  211. if (nPortion / 2) {
  212. lpIMC->ptSoftKbdPos.y = sImeG.rcWorkArea.bottom -
  213. (rcWnd.bottom - rcWnd.top) - UI_MARGIN;
  214. } else {
  215. lpIMC->ptSoftKbdPos.y = sImeG.rcWorkArea.top;
  216. }
  217. lpIMC->fdwInit |= INIT_SOFTKBDPOS;
  218. break;
  219. }
  220. #else
  221. RECT rcWorkArea, rcWnd;
  222. GetWindowRect(lpUIPrivate->hSoftKbdWnd, &rcWnd);
  223. rcWorkArea = ImeMonitorWorkAreaFromWindow(lpIMC->hWnd);
  224. lpIMC->ptSoftKbdPos.x = rcWorkArea.right -
  225. (rcWnd.right - rcWnd.left) - UI_MARGIN;
  226. lpIMC->ptSoftKbdPos.y = rcWorkArea.bottom -
  227. (rcWnd.bottom - rcWnd.top) - UI_MARGIN;
  228. #endif
  229. return;
  230. }
  231. /**********************************************************************/
  232. /* SetSoftKbdData() */
  233. /**********************************************************************/
  234. void PASCAL SetSoftKbdData(
  235. HWND hSoftKbdWnd,
  236. LPINPUTCONTEXT lpIMC)
  237. {
  238. int i;
  239. LPSOFTKBDDATA lpSoftKbdData;
  240. LPPRIVCONTEXT lpImcP;
  241. HGLOBAL hsSoftKbdData;
  242. lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
  243. if (!lpImcP) {
  244. return;
  245. }
  246. hsSoftKbdData = GlobalAlloc(GHND, sizeof(SOFTKBDDATA) * 2);
  247. if (!hsSoftKbdData) {
  248. ImmUnlockIMCC(lpIMC->hPrivate);
  249. return;
  250. }
  251. lpSoftKbdData = (LPSOFTKBDDATA)GlobalLock(hsSoftKbdData);
  252. if (!lpSoftKbdData) { // can not draw soft keyboard window
  253. ImmUnlockIMCC(lpIMC->hPrivate);
  254. return;
  255. }
  256. lpSoftKbdData->uCount = 2;
  257. for (i = 0; i < MAXSOFTKEYS; i++) {
  258. BYTE bVirtKey;
  259. bVirtKey = VirtKey48Map[i];
  260. if (!bVirtKey) {
  261. continue;
  262. }
  263. {
  264. WORD CHIByte, CLOByte;
  265. #ifdef UNICODE
  266. lpSoftKbdData->wCode[0][bVirtKey] = SKLayout[lpImeL->dwSKWant][i];
  267. lpSoftKbdData->wCode[1][bVirtKey] = SKLayoutS[lpImeL->dwSKWant][i];
  268. #else
  269. CHIByte = SKLayout[lpImeL->dwSKWant][i*2] & 0x00ff;
  270. CLOByte = SKLayout[lpImeL->dwSKWant][i*2 + 1] & 0x00ff;
  271. lpSoftKbdData->wCode[0][bVirtKey] = (CHIByte << 8) | CLOByte;
  272. CHIByte = SKLayoutS[lpImeL->dwSKWant][i*2] & 0x00ff;
  273. CLOByte = SKLayoutS[lpImeL->dwSKWant][i*2 + 1] & 0x00ff;
  274. lpSoftKbdData->wCode[1][bVirtKey] = (CHIByte << 8) | CLOByte;
  275. #endif
  276. }
  277. }
  278. SendMessage(hSoftKbdWnd, WM_IME_CONTROL, IMC_SETSOFTKBDDATA,
  279. (LPARAM)lpSoftKbdData);
  280. GlobalUnlock(hsSoftKbdData);
  281. // free storage for UI settings
  282. GlobalFree(hsSoftKbdData);
  283. ImmUnlockIMCC(lpIMC->hPrivate);
  284. return;
  285. }
  286. /**********************************************************************/
  287. /* UpdateSoftKbd() */
  288. /**********************************************************************/
  289. void PASCAL UpdateSoftKbd(
  290. HWND hUIWnd)
  291. {
  292. HIMC hIMC;
  293. LPINPUTCONTEXT lpIMC;
  294. LPPRIVCONTEXT lpImcP;
  295. HGLOBAL hUIPrivate;
  296. LPUIPRIV lpUIPrivate;
  297. hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC);
  298. if (!hIMC) {
  299. return;
  300. }
  301. lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
  302. if (!lpIMC) {
  303. return;
  304. }
  305. hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE);
  306. if (!hUIPrivate) { // can not darw soft keyboard window
  307. ImmUnlockIMC(hIMC);
  308. return;
  309. }
  310. lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
  311. if (!lpUIPrivate) { // can not draw soft keyboard window
  312. ImmUnlockIMC(hIMC);
  313. return;
  314. }
  315. lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
  316. if (!lpImcP) {
  317. GlobalUnlock(hUIPrivate);
  318. ImmUnlockIMC(hIMC);
  319. return;
  320. }
  321. if (!(lpIMC->fdwConversion & IME_CMODE_SOFTKBD)) {
  322. if (lpUIPrivate->hSoftKbdWnd) {
  323. ImmDestroySoftKeyboard(lpUIPrivate->hSoftKbdWnd);
  324. lpUIPrivate->hSoftKbdWnd = NULL;
  325. }
  326. lpUIPrivate->nShowSoftKbdCmd = SW_HIDE;
  327. } else if (!lpIMC->fOpen) {
  328. if (lpUIPrivate->nShowSoftKbdCmd != SW_HIDE) {
  329. ShowSoftKbd(hUIWnd, SW_HIDE, NULL);
  330. }
  331. } else {
  332. if (!lpUIPrivate->hSoftKbdWnd) {
  333. // create soft keyboard
  334. lpUIPrivate->hSoftKbdWnd =
  335. ImmCreateSoftKeyboard(SOFTKEYBOARD_TYPE_C1, hUIWnd,
  336. 0, 0);
  337. }
  338. if (!(lpIMC->fdwInit & INIT_SOFTKBDPOS)) {
  339. CheckSoftKbdPosition(lpUIPrivate, lpIMC);
  340. }
  341. SetSoftKbdData(lpUIPrivate->hSoftKbdWnd, lpIMC);
  342. lpUIPrivate->fdwSetContext |= ISC_SHOW_SOFTKBD;
  343. if (lpUIPrivate->nShowSoftKbdCmd == SW_HIDE) {
  344. SetWindowPos(lpUIPrivate->hSoftKbdWnd, NULL,
  345. lpIMC->ptSoftKbdPos.x, lpIMC->ptSoftKbdPos.y,
  346. 0, 0, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER);
  347. // only show, if the application want to show it
  348. if (lpUIPrivate->fdwSetContext & ISC_SHOW_SOFTKBD) {
  349. ShowSoftKbd(hUIWnd, SW_SHOWNOACTIVATE, lpImcP);
  350. }
  351. }
  352. }
  353. ImmUnlockIMCC(lpIMC->hPrivate);
  354. GlobalUnlock(hUIPrivate);
  355. ImmUnlockIMC(hIMC);
  356. return;
  357. }
  358. /**********************************************************************/
  359. /* SoftKbdDestryed() */
  360. /**********************************************************************/
  361. void PASCAL SoftKbdDestroyed( // soft keyboard window
  362. // already destroyed
  363. HWND hUIWnd)
  364. {
  365. HGLOBAL hUIPrivate;
  366. LPUIPRIV lpUIPrivate;
  367. hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE);
  368. if (!hUIPrivate) { // Oh! Oh!
  369. return;
  370. }
  371. lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
  372. if (!lpUIPrivate) { // Oh! Oh!
  373. return;
  374. }
  375. lpUIPrivate->hSoftKbdWnd = NULL;
  376. GlobalUnlock(hUIPrivate);
  377. }
  378. /**********************************************************************/
  379. /* StatusWndMsg() */
  380. /**********************************************************************/
  381. void PASCAL StatusWndMsg( // set the show hide state and
  382. HWND hUIWnd,
  383. BOOL fOn)
  384. {
  385. HGLOBAL hUIPrivate;
  386. HIMC hIMC;
  387. HWND hStatusWnd;
  388. register LPUIPRIV lpUIPrivate;
  389. hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE);
  390. if (!hUIPrivate) {
  391. return;
  392. }
  393. lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
  394. if (!lpUIPrivate) {
  395. return;
  396. }
  397. hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC);
  398. if (!hIMC) {
  399. GlobalUnlock(hUIPrivate);
  400. return;
  401. }
  402. if (fOn) {
  403. lpUIPrivate->fdwSetContext |= ISC_OPEN_STATUS_WINDOW;
  404. if (!lpUIPrivate->hStatusWnd) {
  405. OpenStatus(
  406. hUIWnd);
  407. }
  408. } else {
  409. lpUIPrivate->fdwSetContext &= ~(ISC_OPEN_STATUS_WINDOW);
  410. }
  411. hStatusWnd = lpUIPrivate->hStatusWnd;
  412. GlobalUnlock(hUIPrivate);
  413. if (!hStatusWnd) {
  414. return;
  415. }
  416. if (!fOn) {
  417. register DWORD fdwSetContext;
  418. fdwSetContext = lpUIPrivate->fdwSetContext &
  419. (ISC_SHOWUICOMPOSITIONWINDOW|ISC_HIDE_COMP_WINDOW);
  420. if (fdwSetContext == ISC_HIDE_COMP_WINDOW) {
  421. ShowComp(
  422. hUIWnd, SW_HIDE);
  423. }
  424. fdwSetContext = lpUIPrivate->fdwSetContext &
  425. (ISC_SHOWUICANDIDATEWINDOW|ISC_HIDE_CAND_WINDOW);
  426. if (fdwSetContext == ISC_HIDE_CAND_WINDOW) {
  427. ShowCand(
  428. hUIWnd, SW_HIDE);
  429. }
  430. fdwSetContext = lpUIPrivate->fdwSetContext &
  431. (ISC_SHOW_SOFTKBD|ISC_HIDE_SOFTKBD);
  432. if (fdwSetContext == ISC_HIDE_SOFTKBD) {
  433. lpUIPrivate->fdwSetContext &= ~(ISC_HIDE_SOFTKBD);
  434. ShowSoftKbd(hUIWnd, SW_HIDE, NULL);
  435. }
  436. ShowStatus(
  437. hUIWnd, SW_HIDE);
  438. } else if (hIMC) {
  439. ShowStatus(
  440. hUIWnd, SW_SHOWNOACTIVATE);
  441. } else {
  442. ShowStatus(
  443. hUIWnd, SW_HIDE);
  444. }
  445. return;
  446. }
  447. /**********************************************************************/
  448. /* ShowUI() */
  449. /**********************************************************************/
  450. void PASCAL ShowUI( // show the sub windows
  451. HWND hUIWnd,
  452. int nShowCmd)
  453. {
  454. HIMC hIMC;
  455. LPINPUTCONTEXT lpIMC;
  456. LPPRIVCONTEXT lpImcP;
  457. HGLOBAL hUIPrivate;
  458. LPUIPRIV lpUIPrivate;
  459. if (nShowCmd == SW_HIDE) {
  460. } else if (!(hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC))) {
  461. nShowCmd = SW_HIDE;
  462. } else if (!(lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC))) {
  463. nShowCmd = SW_HIDE;
  464. } else if (!(lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate))) {
  465. ImmUnlockIMC(hIMC);
  466. nShowCmd = SW_HIDE;
  467. } else {
  468. }
  469. if (nShowCmd == SW_HIDE) {
  470. ShowStatus(hUIWnd, nShowCmd);
  471. ShowComp(hUIWnd, nShowCmd);
  472. ShowCand(hUIWnd, nShowCmd);
  473. ShowSoftKbd(hUIWnd, nShowCmd, NULL);
  474. return;
  475. }
  476. hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE);
  477. if (!hUIPrivate) { // can not darw status window
  478. goto ShowUIUnlockIMCC;
  479. }
  480. lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
  481. if (!lpUIPrivate) { // can not draw status window
  482. goto ShowUIUnlockIMCC;
  483. }
  484. lpUIPrivate->fdwSetContext |= ISC_SHOWUICOMPOSITIONWINDOW;
  485. if ((lpUIPrivate->fdwSetContext & ISC_SHOWUICOMPOSITIONWINDOW) &&
  486. (lpImcP->fdwImeMsg & MSG_ALREADY_START)) {
  487. if (lpUIPrivate->hCompWnd) {
  488. if (lpUIPrivate->nShowCompCmd != SW_HIDE) {
  489. // some time the WM_NCPAINT is eaten by the app
  490. RedrawWindow(lpUIPrivate->hCompWnd, NULL, NULL,
  491. RDW_FRAME|RDW_INVALIDATE|RDW_ERASE);
  492. }
  493. if (MBIndex.IMEChara[0].IC_Trace) { // modify 95.7.17
  494. SendMessage(lpUIPrivate->hCompWnd, WM_IME_NOTIFY,
  495. IMN_SETCOMPOSITIONWINDOW, 0);
  496. }
  497. if (lpUIPrivate->nShowCompCmd == SW_HIDE) {
  498. ShowComp(hUIWnd, nShowCmd);
  499. }
  500. } else {
  501. StartComp(hUIWnd);
  502. }
  503. } else if (lpUIPrivate->nShowCompCmd == SW_HIDE) {
  504. } else if (lpUIPrivate->fdwSetContext & ISC_OPEN_STATUS_WINDOW) {
  505. lpUIPrivate->fdwSetContext |= ISC_HIDE_COMP_WINDOW;
  506. } else {
  507. ShowComp(hUIWnd, SW_HIDE);
  508. }
  509. if ((lpUIPrivate->fdwSetContext & ISC_SHOWUICANDIDATEWINDOW) &&
  510. (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN)) {
  511. if (lpUIPrivate->hCandWnd) {
  512. // ????
  513. if (lpUIPrivate->nShowCandCmd != SW_HIDE) {
  514. // some time the WM_NCPAINT is eaten by the app
  515. RedrawWindow(lpUIPrivate->hCandWnd, NULL, NULL,
  516. RDW_FRAME|RDW_INVALIDATE|RDW_ERASE);
  517. }
  518. if (MBIndex.IMEChara[0].IC_Trace) { // 9.12
  519. SendMessage(lpUIPrivate->hCandWnd, WM_IME_NOTIFY,
  520. IMN_SETCANDIDATEPOS, 0x0001);
  521. }
  522. if (lpUIPrivate->nShowCandCmd == SW_HIDE) {
  523. ShowCand(hUIWnd, nShowCmd);
  524. }
  525. } else {
  526. OpenCand(hUIWnd);
  527. }
  528. } else if (lpUIPrivate->nShowCandCmd == SW_HIDE) {
  529. } else if (lpUIPrivate->fdwSetContext & ISC_OPEN_STATUS_WINDOW) {
  530. lpUIPrivate->fdwSetContext |= ISC_HIDE_CAND_WINDOW;
  531. } else {
  532. ShowCand(hUIWnd, SW_HIDE);
  533. }
  534. if (lpUIPrivate->fdwSetContext & ISC_OPEN_STATUS_WINDOW) {
  535. if(lpUIPrivate->hStatusWnd) {
  536. OpenStatus(hUIWnd);
  537. }
  538. if (lpUIPrivate->nShowStatusCmd != SW_HIDE) {
  539. // some time the WM_NCPAINT is eaten by the app
  540. RedrawWindow(lpUIPrivate->hStatusWnd, NULL, NULL,
  541. RDW_FRAME|RDW_INVALIDATE|RDW_ERASE);
  542. }
  543. SendMessage(lpUIPrivate->hStatusWnd, WM_IME_NOTIFY,
  544. IMN_SETSTATUSWINDOWPOS, 0);
  545. if (lpUIPrivate->nShowStatusCmd == SW_HIDE) {
  546. ShowStatus(hUIWnd, nShowCmd);
  547. }
  548. else{
  549. ShowStatus(hUIWnd, nShowCmd);
  550. }
  551. } else if (lpUIPrivate->hStatusWnd) {
  552. DestroyWindow(lpUIPrivate->hStatusWnd);
  553. }
  554. if (!lpIMC->fOpen) {
  555. if (lpUIPrivate->nShowCompCmd != SW_HIDE) {
  556. ShowSoftKbd(hUIWnd, SW_HIDE, NULL);
  557. }
  558. } else if ((lpUIPrivate->fdwSetContext & ISC_SHOW_SOFTKBD) &&
  559. (lpIMC->fdwConversion & IME_CMODE_SOFTKBD)) {
  560. if (!lpUIPrivate->hSoftKbdWnd) {
  561. UpdateSoftKbd(hUIWnd);
  562. } else if (lpUIPrivate->nShowSoftKbdCmd == SW_HIDE) {
  563. ShowSoftKbd(hUIWnd, nShowCmd, lpImcP);
  564. } else if (lpUIPrivate->hIMC != hIMC) {
  565. UpdateSoftKbd(hUIWnd);
  566. } else {
  567. RedrawWindow(lpUIPrivate->hSoftKbdWnd, NULL, NULL,
  568. RDW_FRAME|RDW_INVALIDATE);
  569. }
  570. } else if (lpUIPrivate->nShowSoftKbdCmd == SW_HIDE) {
  571. } else if (lpUIPrivate->fdwSetContext & ISC_OPEN_STATUS_WINDOW) {
  572. lpUIPrivate->fdwSetContext |= ISC_HIDE_SOFTKBD;
  573. } else {
  574. ShowSoftKbd(hUIWnd, SW_HIDE, NULL);
  575. }
  576. // we switch to this hIMC
  577. lpUIPrivate->hIMC = hIMC;
  578. GlobalUnlock(hUIPrivate);
  579. ShowUIUnlockIMCC:
  580. ImmUnlockIMCC(lpIMC->hPrivate);
  581. ImmUnlockIMC(hIMC);
  582. return;
  583. }
  584. /**********************************************************************/
  585. /* ShowGuideLine */
  586. /**********************************************************************/
  587. void PASCAL ShowGuideLine(
  588. HWND hUIWnd)
  589. {
  590. HIMC hIMC;
  591. LPINPUTCONTEXT lpIMC;
  592. LPGUIDELINE lpGuideLine;
  593. hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC);
  594. if (!hIMC) {
  595. return;
  596. }
  597. lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
  598. if (!lpIMC) {
  599. return;
  600. }
  601. lpGuideLine = (LPGUIDELINE)ImmLockIMCC(lpIMC->hGuideLine);
  602. if (!lpGuideLine) {
  603. } else if (lpGuideLine->dwLevel == GL_LEVEL_ERROR) {
  604. MessageBeep((UINT)-1);
  605. MessageBeep((UINT)-1);
  606. } else if (lpGuideLine->dwLevel == GL_LEVEL_WARNING) {
  607. MessageBeep((UINT)-1);
  608. } else {
  609. }
  610. ImmUnlockIMCC(lpIMC->hGuideLine);
  611. ImmUnlockIMC(hIMC);
  612. return;
  613. }
  614. /**********************************************************************/
  615. /* UpdateStatusWindow() */
  616. /* Return Value: */
  617. /* none */
  618. /**********************************************************************/
  619. BOOL UpdateStatusWindow(
  620. HWND hUIWnd)
  621. {
  622. HWND hStatusWnd;
  623. if (!(hStatusWnd = GetStatusWnd(hUIWnd))) {
  624. return (FALSE);
  625. }
  626. InvalidateRect(hStatusWnd, &(sImeG.rcStatusText), TRUE);
  627. UpdateWindow(hStatusWnd);
  628. return (TRUE);
  629. }
  630. /**********************************************************************/
  631. /* NotifyUI() */
  632. /**********************************************************************/
  633. void PASCAL NotifyUI(
  634. HWND hUIWnd,
  635. WPARAM wParam,
  636. LPARAM lParam)
  637. {
  638. HWND hStatusWnd;
  639. switch (wParam) {
  640. case IMN_OPENSTATUSWINDOW:
  641. //PostStatus(hUIWnd, TRUE);
  642. StatusWndMsg(hUIWnd, TRUE);
  643. break;
  644. case IMN_CLOSESTATUSWINDOW:
  645. //PostStatus(hUIWnd, FALSE);
  646. StatusWndMsg(hUIWnd, FALSE);
  647. break;
  648. case IMN_OPENCANDIDATE:
  649. if (lParam & 0x00000001) {
  650. OpenCand(hUIWnd);
  651. }
  652. break;
  653. case IMN_CHANGECANDIDATE:
  654. if (lParam & 0x00000001) {
  655. HDC hDC;
  656. HWND hCandWnd;
  657. //RECT rcRect;
  658. hCandWnd = GetCandWnd(hUIWnd);
  659. if (!hCandWnd) {
  660. return;
  661. }
  662. hDC = GetDC(hCandWnd);
  663. PaintCandWindow(hCandWnd, hDC);
  664. ReleaseDC(hCandWnd, hDC);
  665. }
  666. break;
  667. case IMN_CLOSECANDIDATE:
  668. if (lParam & 0x00000001) {
  669. CloseCand(hUIWnd);
  670. }
  671. break;
  672. case IMN_SETSENTENCEMODE:
  673. break;
  674. case IMN_SETOPENSTATUS:
  675. case IMN_SETCONVERSIONMODE:
  676. hStatusWnd = GetStatusWnd(hUIWnd);
  677. if (!hStatusWnd) {
  678. return;
  679. }
  680. {
  681. RECT rcRect;
  682. rcRect = sImeG.rcStatusText;
  683. // off by 1
  684. rcRect.right += 1;
  685. rcRect.bottom += 1;
  686. RedrawWindow(hStatusWnd, &rcRect, NULL, RDW_INVALIDATE);
  687. }
  688. break;
  689. case IMN_SETCOMPOSITIONFONT:
  690. // we are not going to change font, but an IME can do this if it want
  691. break;
  692. case IMN_SETCOMPOSITIONWINDOW:
  693. {
  694. HWND hCompWnd;
  695. hCompWnd = GetCompWnd(hUIWnd);
  696. if (!hCompWnd) {
  697. return;
  698. }
  699. PostMessage(hCompWnd, WM_IME_NOTIFY, wParam, lParam);
  700. }
  701. break;
  702. case IMN_SETCANDIDATEPOS:
  703. {
  704. HWND hCandWnd;
  705. hCandWnd = GetCandWnd(hUIWnd);
  706. if (!hCandWnd) {
  707. return;
  708. }
  709. PostMessage(hCandWnd, WM_IME_NOTIFY, wParam, lParam);
  710. }
  711. break;
  712. case IMN_SETSTATUSWINDOWPOS:
  713. hStatusWnd = GetStatusWnd(hUIWnd);
  714. if (hStatusWnd) {
  715. PostMessage(hStatusWnd, WM_IME_NOTIFY, wParam, lParam);
  716. } else {
  717. }
  718. break;
  719. case IMN_GUIDELINE:
  720. ShowGuideLine(hUIWnd);
  721. break;
  722. case IMN_PRIVATE:
  723. switch (lParam) {
  724. case IMN_PRIVATE_UPDATE_SOFTKBD:
  725. UpdateSoftKbd(hUIWnd);
  726. break;
  727. case IMN_PRIVATE_UPDATE_STATUS:
  728. UpdateStatusWindow(hUIWnd);
  729. break;
  730. case IMN_PRIVATE_DESTROYCANDWIN:
  731. SendMessage(GetCandWnd(hUIWnd), WM_DESTROY, (WPARAM)NULL, (LPARAM)NULL);
  732. break;
  733. case IMN_PRIVATE_CMENUDESTROYED:
  734. CMenuDestroyed(hUIWnd);
  735. break;
  736. case IMN_PRIVATE_SOFTKEYMENUDESTROYED:
  737. SoftkeyMenuDestroyed(hUIWnd);
  738. break;
  739. }
  740. break;
  741. case IMN_SOFTKBDDESTROYED:
  742. SoftKbdDestroyed(hUIWnd);
  743. break;
  744. default:
  745. break;
  746. }
  747. return;
  748. }
  749. /**********************************************************************/
  750. /* SetContext() */
  751. /**********************************************************************/
  752. void PASCAL SetContext( // the context activated/deactivated
  753. HWND hUIWnd,
  754. BOOL fOn,
  755. LPARAM lShowUI)
  756. {
  757. HIMC hIMC;
  758. LPINPUTCONTEXT lpIMC;
  759. LPPRIVCONTEXT lpImcP;
  760. HGLOBAL hUIPrivate;
  761. register LPUIPRIV lpUIPrivate;
  762. hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC);
  763. if(!hIMC){
  764. return;
  765. }
  766. // get lpIMC
  767. lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
  768. if (!lpIMC) {
  769. return;
  770. }
  771. hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE);
  772. if (!hUIPrivate) {
  773. ImmUnlockIMC(hIMC);
  774. return;
  775. }
  776. lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
  777. if (!lpUIPrivate) {
  778. ImmUnlockIMC(hIMC);
  779. return;
  780. }
  781. if (fOn) {
  782. register DWORD fdwSetContext;
  783. lpUIPrivate->fdwSetContext = lpUIPrivate->fdwSetContext &
  784. ~(ISC_SHOWUIALL|ISC_HIDE_SOFTKBD);
  785. lpUIPrivate->fdwSetContext |= (lShowUI & ISC_SHOWUIALL) |
  786. ISC_SHOW_SOFTKBD;
  787. {
  788. HKEY hKey;
  789. DWORD bcData;
  790. TCHAR buf[256];
  791. bcData=256;
  792. if(RegOpenKeyEx (HKEY_CURRENT_USER,
  793. TEXT("Control Panel\\Input Method"),
  794. 0,
  795. KEY_ENUMERATE_SUB_KEYS |
  796. KEY_EXECUTE |
  797. KEY_QUERY_VALUE,
  798. &hKey)){
  799. goto SetShowStatus;
  800. }
  801. if(RegQueryValueEx (hKey, TEXT("show status"),
  802. NULL,
  803. NULL, //null-terminate string
  804. (LPBYTE)buf, //&bData,
  805. &bcData) != ERROR_SUCCESS){
  806. // Set defaut value as ON if no entry found in registry
  807. lpUIPrivate->fdwSetContext |= ISC_OPEN_STATUS_WINDOW;
  808. goto SetShowStatus;
  809. }
  810. if(lstrcmp(buf, TEXT("1"))==0)
  811. lpUIPrivate->fdwSetContext |= ISC_OPEN_STATUS_WINDOW;
  812. else
  813. lpUIPrivate->fdwSetContext &= ~ISC_OPEN_STATUS_WINDOW;
  814. SetShowStatus:
  815. RegCloseKey(hKey);
  816. }
  817. fdwSetContext = lpUIPrivate->fdwSetContext &
  818. (ISC_SHOWUICOMPOSITIONWINDOW|ISC_HIDE_COMP_WINDOW);
  819. if (fdwSetContext == ISC_HIDE_COMP_WINDOW) {
  820. ShowComp(
  821. hUIWnd, SW_HIDE);
  822. } else if (fdwSetContext & ISC_HIDE_COMP_WINDOW) {
  823. lpUIPrivate->fdwSetContext &= ~(ISC_HIDE_COMP_WINDOW);
  824. }
  825. fdwSetContext = lpUIPrivate->fdwSetContext &
  826. (ISC_SHOWUICANDIDATEWINDOW|ISC_HIDE_CAND_WINDOW);
  827. if (fdwSetContext == ISC_HIDE_CAND_WINDOW) {
  828. ShowCand(
  829. hUIWnd, SW_HIDE);
  830. } else if (fdwSetContext & ISC_HIDE_CAND_WINDOW) {
  831. lpUIPrivate->fdwSetContext &= ~(ISC_HIDE_CAND_WINDOW);
  832. }
  833. if (lpIMC->cfCandForm[0].dwIndex != 0) {
  834. lpIMC->cfCandForm[0].dwStyle = CFS_DEFAULT;
  835. }
  836. lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
  837. if (!lpImcP) {
  838. GlobalUnlock(hUIPrivate);
  839. ImmUnlockIMC(hIMC);
  840. return;
  841. }
  842. // init ime properties & reset context
  843. InitImeCharac(0);
  844. if(MBIndex.IMEChara[0].IC_Trace != SaTC_Trace) {
  845. int UI_MODE;
  846. lpImcP->iImeState = CST_INIT;
  847. CompCancel(hIMC, lpIMC);
  848. // init fields of hPrivate
  849. lpImcP->fdwImeMsg = (DWORD) 0;
  850. lpImcP->dwCompChar = (DWORD) 0;
  851. lpImcP->fdwGcsFlag = (DWORD) 0;
  852. lpImcP->uSYHFlg = 0x00000000;
  853. lpImcP->uDYHFlg = 0x00000000;
  854. // init input state(all)
  855. lpImcP->PrivateArea.Comp_Status.OnLineCreWord = 0;
  856. lpImcP->PrivateArea.Comp_Status.dwSTLX = 0;
  857. lpImcP->PrivateArea.Comp_Status.dwSTMULCODE = 0;
  858. lpImcP->PrivateArea.Comp_Status.dwInvalid = 0;
  859. CWCodeStr[0] = 0;
  860. CWDBCSStr[0] = 0;
  861. // change compwnd size
  862. // init fields of hIMC
  863. lpIMC->fOpen = TRUE;
  864. SendMessage(GetCandWnd(hUIWnd), WM_DESTROY, (WPARAM)NULL, (LPARAM)NULL);
  865. // set cand window data
  866. if(MBIndex.IMEChara[0].IC_Trace) {
  867. UI_MODE = BOX_UI;
  868. } else {
  869. POINT ptSTFixPos;
  870. UI_MODE = LIN_UI;
  871. ptSTFixPos.x = 0;
  872. ptSTFixPos.y = sImeG.rcWorkArea.bottom - sImeG.yStatusHi;
  873. ImmSetStatusWindowPos(hIMC, (LPPOINT)&ptSTFixPos);
  874. }
  875. InitCandUIData(
  876. GetSystemMetrics(SM_CXBORDER),
  877. GetSystemMetrics(SM_CYBORDER), UI_MODE);
  878. }
  879. SaTC_Trace = MBIndex.IMEChara[0].IC_Trace;
  880. // init Caps
  881. {
  882. BYTE lpbKeyState[256];
  883. DWORD fdwConversion;
  884. GetKeyboardState(lpbKeyState);
  885. if (lpbKeyState[VK_CAPITAL] & 0x01) {
  886. uCaps = 1;
  887. // change to alphanumeric mode
  888. fdwConversion = lpIMC->fdwConversion & ~(IME_CMODE_CHARCODE |
  889. IME_CMODE_NATIVE | IME_CMODE_EUDC);
  890. // init ime Private status
  891. lpImcP->PrivateArea.Comp_Status.dwSTLX = 0;
  892. lpImcP->PrivateArea.Comp_Status.dwSTMULCODE = 0;
  893. lpImcP->PrivateArea.Comp_Status.dwInvalid = 0;
  894. } else {
  895. // change to native mode
  896. if(uCaps == 1) {
  897. fdwConversion = (lpIMC->fdwConversion | IME_CMODE_NATIVE) &
  898. ~(IME_CMODE_CHARCODE | IME_CMODE_EUDC);
  899. } else {
  900. fdwConversion = lpIMC->fdwConversion;
  901. }
  902. uCaps = 0;
  903. }
  904. ImmSetConversionStatus(hIMC, fdwConversion, lpIMC->fdwSentence);
  905. }
  906. if ((lpIMC->cfCompForm.dwStyle & CFS_FORCE_POSITION)
  907. && (MBIndex.IMEChara[0].IC_Trace)) {
  908. POINT ptNew; // new position of UI
  909. POINT ptSTWPos;
  910. ImmGetStatusWindowPos(hIMC, (LPPOINT)&ptSTWPos);
  911. ptNew.x = ptSTWPos.x + sImeG.xStatusWi + UI_MARGIN;
  912. if((ptSTWPos.x + sImeG.xStatusWi + sImeG.xCandWi + lpImeL->xCompWi + 2 * UI_MARGIN) >=
  913. sImeG.rcWorkArea.right) {
  914. ptNew.x = ptSTWPos.x - lpImeL->xCompWi - UI_MARGIN;
  915. }
  916. ptNew.x += lpImeL->cxCompBorder;
  917. ptNew.y = ptSTWPos.y + lpImeL->cyCompBorder;
  918. lpIMC->cfCompForm.ptCurrentPos = ptNew;
  919. ScreenToClient(lpIMC->hWnd, &lpIMC->cfCompForm.ptCurrentPos);
  920. lpIMC->cfCompForm.dwStyle = CFS_DEFAULT;
  921. }
  922. } else {
  923. lpUIPrivate->fdwSetContext &= ~ISC_SETCONTEXT_UI;
  924. }
  925. GlobalUnlock(hUIPrivate);
  926. UIPaint(hUIWnd);
  927. ImmUnlockIMC(hIMC);
  928. return;
  929. }
  930. /**********************************************************************/
  931. /* GetCompWindow() */
  932. /**********************************************************************/
  933. LRESULT PASCAL GetCompWindow(
  934. HWND hUIWnd,
  935. LPCOMPOSITIONFORM lpCompForm)
  936. {
  937. HWND hCompWnd;
  938. RECT rcCompWnd;
  939. hCompWnd = GetCompWnd(hUIWnd);
  940. if (!hCompWnd) {
  941. return (1L);
  942. }
  943. if (!GetWindowRect(hCompWnd, &rcCompWnd)) {
  944. return (1L);
  945. }
  946. lpCompForm->dwStyle = CFS_POINT|CFS_RECT;
  947. lpCompForm->ptCurrentPos = *(LPPOINT)&rcCompWnd;
  948. lpCompForm->rcArea = rcCompWnd;
  949. return (0L);
  950. }
  951. /**********************************************************************/
  952. /* SelectIME() */
  953. /**********************************************************************/
  954. void PASCAL SelectIME( // switch IMEs
  955. HWND hUIWnd,
  956. BOOL fSelect)
  957. {
  958. if (!fSelect) {
  959. ShowUI(hUIWnd, SW_HIDE);
  960. } else {
  961. ShowUI(hUIWnd, SW_SHOWNOACTIVATE);
  962. }
  963. return;
  964. }
  965. /**********************************************************************/
  966. /* UIPaint() */
  967. /**********************************************************************/
  968. LRESULT PASCAL UIPaint(
  969. HWND hUIWnd)
  970. {
  971. PAINTSTRUCT ps;
  972. MSG sMsg;
  973. HGLOBAL hUIPrivate;
  974. LPUIPRIV lpUIPrivate;
  975. // for safety
  976. BeginPaint(hUIWnd, &ps);
  977. EndPaint(hUIWnd, &ps);
  978. // some application will not remove the WM_PAINT messages
  979. PeekMessage(&sMsg, hUIWnd, WM_PAINT, WM_PAINT, PM_REMOVE|PM_NOYIELD);
  980. hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE);
  981. if (!hUIPrivate) {
  982. return (0L);
  983. }
  984. lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
  985. if (!lpUIPrivate) {
  986. return (0L);
  987. }
  988. if (lpUIPrivate->fdwSetContext & ISC_SETCONTEXT_UI) {
  989. ShowUI(hUIWnd, SW_SHOWNOACTIVATE);
  990. } else {
  991. ShowUI(hUIWnd, SW_HIDE);
  992. }
  993. GlobalUnlock(hUIPrivate);
  994. return (0L);
  995. }
  996. /**********************************************************************/
  997. /* UIWndProc() */
  998. /**********************************************************************/
  999. LRESULT CALLBACK UIWndProc(
  1000. HWND hUIWnd,
  1001. UINT uMsg,
  1002. WPARAM wParam,
  1003. LPARAM lParam)
  1004. {
  1005. switch (uMsg) {
  1006. case WM_CREATE:
  1007. CreateUIWindow(hUIWnd);
  1008. break;
  1009. case WM_DESTROY:
  1010. DestroyUIWindow(hUIWnd);
  1011. break;
  1012. case WM_IME_STARTCOMPOSITION:
  1013. // you can create a window as the composition window here
  1014. StartComp(hUIWnd);
  1015. break;
  1016. case WM_IME_COMPOSITION:
  1017. if (!MBIndex.IMEChara[0].IC_Trace) {
  1018. } else if (lParam & GCS_RESULTSTR) {
  1019. MoveDefaultCompPosition(hUIWnd);
  1020. } else {
  1021. }
  1022. {
  1023. HWND hCompWnd;
  1024. hCompWnd = GetCompWnd(hUIWnd);
  1025. if (hCompWnd) {
  1026. RECT rcRect;
  1027. rcRect = lpImeL->rcCompText;
  1028. // off by 1
  1029. rcRect.right += 1;
  1030. rcRect.bottom += 1;
  1031. RedrawWindow(hCompWnd, &rcRect, NULL, RDW_INVALIDATE);
  1032. }
  1033. }
  1034. break;
  1035. case WM_IME_ENDCOMPOSITION:
  1036. // you can destroy the composition window here
  1037. EndComp(hUIWnd);
  1038. break;
  1039. case WM_IME_NOTIFY:
  1040. NotifyUI(hUIWnd, wParam, lParam);
  1041. break;
  1042. case WM_IME_SETCONTEXT:
  1043. SetContext(hUIWnd, (BOOL)wParam, lParam);
  1044. break;
  1045. case WM_IME_CONTROL:
  1046. switch (wParam) {
  1047. case IMC_GETCANDIDATEPOS:
  1048. return (1L); // not implemented yet
  1049. case IMC_GETCOMPOSITIONFONT:
  1050. return (1L); // not implemented yet
  1051. case IMC_GETCOMPOSITIONWINDOW:
  1052. return GetCompWindow(hUIWnd, (LPCOMPOSITIONFORM)lParam);
  1053. case IMC_GETSTATUSWINDOWPOS:
  1054. {
  1055. HWND hStatusWnd;
  1056. RECT rcStatusWnd;
  1057. LPARAM lParam;
  1058. hStatusWnd = GetStatusWnd(hUIWnd);
  1059. if (!hStatusWnd) {
  1060. return (0L); // fail, return (0, 0)?
  1061. }
  1062. if (!GetWindowRect(hStatusWnd, &rcStatusWnd)) {
  1063. return (0L); // fail, return (0, 0)?
  1064. }
  1065. lParam = MAKELRESULT(rcStatusWnd.left, rcStatusWnd.top);
  1066. return (lParam);
  1067. }
  1068. return (0L);
  1069. case IMC_SETSTATUSWINDOWPOS:
  1070. {
  1071. HIMC hIMC;
  1072. LPINPUTCONTEXT lpIMC;
  1073. LPPRIVCONTEXT lpImcP;
  1074. POINT ptPos;
  1075. ptPos.x = ((LPPOINTS)&lParam)->x;
  1076. ptPos.y = ((LPPOINTS)&lParam)->y;
  1077. hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC);
  1078. if (!hIMC) {
  1079. return (1L);
  1080. }
  1081. if(!ImmSetStatusWindowPos(hIMC, &ptPos)) {
  1082. return (1L);
  1083. }
  1084. // set comp window position when TraceCuer
  1085. lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
  1086. if (!lpIMC) {
  1087. return (1L);
  1088. }
  1089. lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
  1090. if (!lpImcP) {
  1091. return (1L);
  1092. }
  1093. if(!MBIndex.IMEChara[0].IC_Trace) {
  1094. lpIMC->cfCompForm.dwStyle = CFS_RECT;
  1095. lpIMC->cfCompForm.ptCurrentPos.x = ptPos.x + sImeG.xStatusWi + UI_MARGIN;
  1096. lpIMC->cfCompForm.ptCurrentPos.y = ptPos.y;
  1097. CopyRect(&lpIMC->cfCompForm.rcArea, &sImeG.rcWorkArea);
  1098. ScreenToClient(lpIMC->hWnd, &lpIMC->cfCompForm.ptCurrentPos);
  1099. // set composition window to the new poosition
  1100. PostMessage(GetCompWnd(hUIWnd), WM_IME_NOTIFY, IMN_SETCOMPOSITIONWINDOW, 0);
  1101. }
  1102. ImmUnlockIMCC(lpIMC->hPrivate);
  1103. ImmUnlockIMC(hIMC);
  1104. return (0L);
  1105. }
  1106. return (1L);
  1107. default:
  1108. return (1L);
  1109. }
  1110. break;
  1111. case WM_IME_COMPOSITIONFULL:
  1112. return (0L);
  1113. case WM_IME_SELECT:
  1114. SetContext(hUIWnd, (BOOL)wParam, 0);
  1115. return (0L);
  1116. case WM_MOUSEACTIVATE:
  1117. return (MA_NOACTIVATE);
  1118. default:
  1119. return DefWindowProc(hUIWnd, uMsg, wParam, lParam);
  1120. }
  1121. return (0L);
  1122. }
  1123. void DrawConvexRect(HDC hDC, int x1, int y1, int x2, int y2)
  1124. {
  1125. HPEN hPen, hOldPen;
  1126. SelectObject(hDC, GetStockObject(LTGRAY_BRUSH));
  1127. SelectObject(hDC, GetStockObject(WHITE_PEN));
  1128. MoveToEx(hDC, x1, y1,NULL);
  1129. LineTo(hDC, x2, y1);
  1130. MoveToEx(hDC, x1, y1,NULL);
  1131. LineTo(hDC, x1, y2);
  1132. hPen = CreatePen(PS_SOLID, 1, RGB(128, 128, 128));
  1133. hOldPen = SelectObject (hDC, hPen);
  1134. MoveToEx(hDC, x2-1, y2-1,NULL);
  1135. LineTo(hDC, x2-1, y1);
  1136. MoveToEx(hDC, x2-1, y2-1,NULL);
  1137. LineTo(hDC, x1, y2-1);
  1138. SelectObject(hDC, hOldPen);
  1139. DeleteObject(hPen);
  1140. }
  1141. void DrawConvexRectP(HDC hDC, int x1, int y1, int x2, int y2)
  1142. {
  1143. HPEN hPen, hOldPen;
  1144. SelectObject(hDC, GetStockObject(LTGRAY_BRUSH));
  1145. SelectObject(hDC, GetStockObject(WHITE_PEN));
  1146. MoveToEx(hDC, x1, y1,NULL);
  1147. LineTo(hDC, x2 - 1, y1);
  1148. MoveToEx(hDC, x1, y1,NULL);
  1149. LineTo(hDC, x1, y2 - 1);
  1150. hPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
  1151. hOldPen = SelectObject (hDC, hPen);
  1152. MoveToEx(hDC, x2-1, y2-1,NULL);
  1153. LineTo(hDC, x2-1, y1);
  1154. MoveToEx(hDC, x2-1, y2-1,NULL);
  1155. LineTo(hDC, x1, y2-1);
  1156. SelectObject(hDC, hOldPen);
  1157. DeleteObject(hPen);
  1158. }
  1159. void DrawConcaveRect(HDC hDC, int x1, int y1, int x2, int y2)
  1160. {
  1161. HPEN hLtPen = CreatePen(PS_SOLID, 1, 0x00808080);
  1162. HPEN OldPen = SelectObject(hDC, hLtPen);
  1163. MoveToEx(hDC, x1, y1,NULL);
  1164. LineTo(hDC, x2, y1);
  1165. MoveToEx(hDC, x1, y1,NULL);
  1166. LineTo(hDC, x1, y2);
  1167. SelectObject(hDC, GetStockObject(WHITE_PEN));
  1168. MoveToEx(hDC, x2 , y2,NULL);
  1169. LineTo(hDC, x2 , y1-1);
  1170. MoveToEx(hDC, x2 , y2,NULL);
  1171. LineTo(hDC, x1-1, y2);
  1172. SelectObject(hDC, OldPen);
  1173. DeleteObject(hLtPen);
  1174. }