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

775 lines
26 KiB

  1. /*++
  2. Copyright (c) 1990-1998 Microsoft Corporation, All Rights Reserved
  3. Module Name:
  4. IMM.C
  5. ++*/
  6. #include "windows.h"
  7. #include "immdev.h"
  8. #include "fakeime.h"
  9. #if defined(FAKEIMEM) || defined(UNICODE)
  10. int GetCandidateStringsFromDictionary(LPWSTR lpString, LPWSTR lpBuf, DWORD dwBufLen, LPTSTR szDicFileName);
  11. #endif
  12. /**********************************************************************/
  13. /* ImeInquire() */
  14. /* */
  15. /**********************************************************************/
  16. BOOL WINAPI ImeInquire(LPIMEINFO lpIMEInfo,LPTSTR lpszClassName,DWORD dwSystemInfoFlags)
  17. {
  18. ImeLog(LOGF_ENTRY | LOGF_API, TEXT("ImeInquire"));
  19. // Init IMEINFO Structure.
  20. lpIMEInfo->dwPrivateDataSize = sizeof(UIEXTRA);
  21. lpIMEInfo->fdwProperty = IME_PROP_KBD_CHAR_FIRST |
  22. #if defined(FAKEIMEM) || defined(UNICODE)
  23. IME_PROP_UNICODE |
  24. #endif
  25. IME_PROP_AT_CARET;
  26. lpIMEInfo->fdwConversionCaps = IME_CMODE_LANGUAGE |
  27. IME_CMODE_FULLSHAPE |
  28. IME_CMODE_ROMAN |
  29. IME_CMODE_CHARCODE;
  30. lpIMEInfo->fdwSentenceCaps = 0L;
  31. lpIMEInfo->fdwUICaps = UI_CAP_2700;
  32. lpIMEInfo->fdwSCSCaps = SCS_CAP_COMPSTR |
  33. SCS_CAP_MAKEREAD |
  34. SCS_CAP_SETRECONVERTSTRING;
  35. lpIMEInfo->fdwSelectCaps = SELECT_CAP_CONVERSION;
  36. #ifdef FAKEIMEM
  37. memcpy((LPWSTR)lpszClassName,(LPWSTR)wszUIClassName,
  38. (lstrlenW((LPWSTR)wszUIClassName) + 1) * sizeof(WCHAR));
  39. #else
  40. lstrcpy(lpszClassName,(LPTSTR)szUIClassName);
  41. #endif
  42. return TRUE;
  43. }
  44. /**********************************************************************/
  45. /* ImeConversionList() */
  46. /* */
  47. /**********************************************************************/
  48. DWORD WINAPI ImeConversionList(HIMC hIMC,LPCTSTR lpSource,LPCANDIDATELIST lpCandList,DWORD dwBufLen,UINT uFlags)
  49. {
  50. ImeLog(LOGF_API, TEXT("ImeConversionList"));
  51. return 0;
  52. }
  53. /**********************************************************************/
  54. /* ImeDestroy() */
  55. /* */
  56. /**********************************************************************/
  57. BOOL WINAPI ImeDestroy(UINT uForce)
  58. {
  59. ImeLog(LOGF_ENTRY | LOGF_API, TEXT("ImeDestroy"));
  60. return TRUE;
  61. }
  62. /**********************************************************************/
  63. /* ImeEscape() */
  64. /* */
  65. /**********************************************************************/
  66. LRESULT WINAPI ImeEscape(HIMC hIMC,UINT uSubFunc,LPVOID lpData)
  67. {
  68. LRESULT lRet = FALSE;
  69. ImeLog(LOGF_API, TEXT("ImeEscape"));
  70. switch (uSubFunc)
  71. {
  72. case IME_ESC_QUERY_SUPPORT:
  73. switch (*(LPUINT)lpData)
  74. {
  75. case IME_ESC_QUERY_SUPPORT:
  76. case IME_ESC_PRI_GETDWORDTEST:
  77. case IME_ESC_GETHELPFILENAME:
  78. lRet = TRUE;
  79. break;
  80. default:
  81. lRet = FALSE;
  82. break;
  83. }
  84. break;
  85. case IME_ESC_PRI_GETDWORDTEST:
  86. lRet = 0x12345678;
  87. break;
  88. case IME_ESC_GETHELPFILENAME:
  89. Mylstrcpy((LPMYSTR)lpData, MYTEXT("fakeime.hlp"));
  90. lRet = TRUE;
  91. break;
  92. default:
  93. lRet = FALSE;
  94. break;
  95. }
  96. return lRet;
  97. }
  98. /**********************************************************************/
  99. /* ImeSetActiveContext() */
  100. /* */
  101. /**********************************************************************/
  102. BOOL WINAPI ImeSetActiveContext(HIMC hIMC,BOOL fFlag)
  103. {
  104. ImeLog(LOGF_API, TEXT("ImeSetActiveContext"));
  105. UpdateIndicIcon(hIMC);
  106. return TRUE;
  107. }
  108. /**********************************************************************/
  109. /* ImeProcessKey() */
  110. /* */
  111. /**********************************************************************/
  112. BOOL WINAPI ImeProcessKey(HIMC hIMC,UINT vKey,LPARAM lKeyData,CONST LPBYTE lpbKeyState)
  113. {
  114. BOOL fRet = FALSE;
  115. BOOL fOpen;
  116. BOOL fCompStr = FALSE;
  117. LPINPUTCONTEXT lpIMC;
  118. LPCOMPOSITIONSTRING lpCompStr;
  119. ImeLog(LOGF_KEY | LOGF_API, TEXT("ImeProcessKey"));
  120. if (lKeyData & 0x80000000)
  121. return FALSE;
  122. if (!(lpIMC = ImmLockIMC(hIMC)))
  123. return FALSE;
  124. fOpen = lpIMC->fOpen;
  125. if (fOpen)
  126. {
  127. if (lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr))
  128. {
  129. if ((lpCompStr->dwSize > sizeof(COMPOSITIONSTRING)) &&
  130. (lpCompStr->dwCompStrLen))
  131. fCompStr = TRUE;
  132. }
  133. if (lpbKeyState[VK_MENU] & 0x80)
  134. {
  135. fRet = FALSE;
  136. }
  137. else if (lpbKeyState[VK_CONTROL] & 0x80)
  138. {
  139. if (fCompStr)
  140. fRet = (BOOL)bCompCtl[vKey];
  141. else
  142. fRet = (BOOL)bNoCompCtl[vKey];
  143. }
  144. else if (lpbKeyState[VK_SHIFT] & 0x80)
  145. {
  146. if (fCompStr)
  147. fRet = (BOOL)bCompSht[vKey];
  148. else
  149. fRet = (BOOL)bNoCompSht[vKey];
  150. }
  151. else
  152. {
  153. if (fCompStr)
  154. fRet = (BOOL)bComp[vKey];
  155. else
  156. fRet = (BOOL)bNoComp[vKey];
  157. }
  158. if (lpCompStr)
  159. ImmUnlockIMCC(lpIMC->hCompStr);
  160. }
  161. ImmUnlockIMC(hIMC);
  162. return fRet;
  163. }
  164. /**********************************************************************/
  165. /* NotifyIME() */
  166. /* */
  167. /**********************************************************************/
  168. BOOL WINAPI NotifyIME(HIMC hIMC,DWORD dwAction,DWORD dwIndex,DWORD dwValue)
  169. {
  170. LPINPUTCONTEXT lpIMC;
  171. BOOL bRet = FALSE;
  172. LPCOMPOSITIONSTRING lpCompStr;
  173. LPCANDIDATEINFO lpCandInfo;
  174. LPCANDIDATELIST lpCandList;
  175. MYCHAR szBuf[256];
  176. int nBufLen;
  177. LPMYSTR lpstr;
  178. TRANSMSG GnMsg;
  179. int i = 0;
  180. LPDWORD lpdw;
  181. ImeLog(LOGF_API, TEXT("NotifyIME"));
  182. switch(dwAction)
  183. {
  184. case NI_CONTEXTUPDATED:
  185. switch (dwValue)
  186. {
  187. case IMC_SETOPENSTATUS:
  188. lpIMC = ImmLockIMC(hIMC);
  189. if (lpIMC)
  190. {
  191. if (!lpIMC->fOpen && IsCompStr(hIMC))
  192. FlushText(hIMC);
  193. ImmUnlockIMC(hIMC);
  194. }
  195. UpdateIndicIcon(hIMC);
  196. bRet = TRUE;
  197. break;
  198. case IMC_SETCONVERSIONMODE:
  199. break;
  200. case IMC_SETCOMPOSITIONWINDOW:
  201. break;
  202. default:
  203. break;
  204. }
  205. break;
  206. case NI_COMPOSITIONSTR:
  207. switch (dwIndex)
  208. {
  209. case CPS_COMPLETE:
  210. MakeResultString(hIMC,TRUE);
  211. bRet = TRUE;
  212. break;
  213. case CPS_CONVERT:
  214. ConvKanji(hIMC);
  215. bRet = TRUE;
  216. break;
  217. case CPS_REVERT:
  218. RevertText(hIMC);
  219. bRet = TRUE;
  220. break;
  221. case CPS_CANCEL:
  222. FlushText(hIMC);
  223. bRet = TRUE;
  224. break;
  225. default:
  226. break;
  227. }
  228. break;
  229. case NI_OPENCANDIDATE:
  230. if (IsConvertedCompStr(hIMC))
  231. {
  232. if (!(lpIMC = ImmLockIMC(hIMC)))
  233. return FALSE;
  234. if (!(lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr)))
  235. {
  236. ImmUnlockIMC(hIMC);
  237. return FALSE;
  238. }
  239. if (lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo))
  240. {
  241. //
  242. // Get the candidate strings from dic file.
  243. //
  244. #if defined(FAKEIMEM) || defined(UNICODE)
  245. nBufLen = GetCandidateStringsFromDictionary(GETLPCOMPREADSTR(lpCompStr),
  246. (LPMYSTR)szBuf,256,
  247. (LPTSTR)szDicFileName );
  248. #else
  249. nBufLen = GetPrivateProfileString(GETLPCOMPREADSTR(lpCompStr),
  250. NULL,(LPSTR)"",
  251. (LPSTR)szBuf,256,(LPSTR)szDicFileName );
  252. #endif
  253. //
  254. // generate WM_IME_NOTFIY IMN_OPENCANDIDATE message.
  255. //
  256. GnMsg.message = WM_IME_NOTIFY;
  257. GnMsg.wParam = IMN_OPENCANDIDATE;
  258. GnMsg.lParam = 1L;
  259. GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
  260. //
  261. // Make candidate structures.
  262. //
  263. lpCandInfo->dwSize = sizeof(MYCAND);
  264. lpCandInfo->dwCount = 1;
  265. lpCandInfo->dwOffset[0] =
  266. (DWORD)((LPSTR)&((LPMYCAND)lpCandInfo)->cl - (LPSTR)lpCandInfo);
  267. lpCandList = (LPCANDIDATELIST)((LPSTR)lpCandInfo + lpCandInfo->dwOffset[0]);
  268. lpdw = (LPDWORD)&(lpCandList->dwOffset);
  269. lpstr = &szBuf[0];
  270. while (*lpstr && (i < MAXCANDSTRNUM))
  271. {
  272. lpCandList->dwOffset[i] =
  273. (DWORD)((LPSTR)((LPMYCAND)lpCandInfo)->szCand[i] - (LPSTR)lpCandList);
  274. Mylstrcpy((LPMYSTR)((LPMYSTR)lpCandList+lpCandList->dwOffset[i]),lpstr);
  275. lpstr += (Mylstrlen(lpstr) + 1);
  276. i++;
  277. }
  278. lpCandList->dwSize = sizeof(CANDIDATELIST) +
  279. (MAXCANDSTRNUM * (sizeof(DWORD) + MAXCANDSTRSIZE));
  280. lpCandList->dwStyle = IME_CAND_READ;
  281. lpCandList->dwCount = i;
  282. lpCandList->dwPageStart = 0;
  283. if (i < MAXCANDPAGESIZE)
  284. lpCandList->dwPageSize = i;
  285. else
  286. lpCandList->dwPageSize = MAXCANDPAGESIZE;
  287. lpCandList->dwSelection++;
  288. if (lpCandList->dwSelection == (DWORD)i)
  289. lpCandList->dwSelection = 0;
  290. //
  291. // Generate messages.
  292. //
  293. GnMsg.message = WM_IME_NOTIFY;
  294. GnMsg.wParam = IMN_CHANGECANDIDATE;
  295. GnMsg.lParam = 1L;
  296. GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
  297. ImmUnlockIMCC(lpIMC->hCandInfo);
  298. ImmUnlockIMC(hIMC);
  299. bRet = TRUE;
  300. }
  301. }
  302. break;
  303. case NI_CLOSECANDIDATE:
  304. if (!(lpIMC = ImmLockIMC(hIMC)))
  305. return FALSE;
  306. if (IsCandidate(lpIMC))
  307. {
  308. GnMsg.message = WM_IME_NOTIFY;
  309. GnMsg.wParam = IMN_CLOSECANDIDATE;
  310. GnMsg.lParam = 1L;
  311. GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
  312. bRet = TRUE;
  313. }
  314. ImmUnlockIMC(hIMC);
  315. break;
  316. case NI_SELECTCANDIDATESTR:
  317. if (!(lpIMC = ImmLockIMC(hIMC)))
  318. return FALSE;
  319. if (dwIndex == 1 && IsCandidate(lpIMC))
  320. {
  321. if (lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo))
  322. {
  323. lpCandList = (LPCANDIDATELIST)((LPSTR)lpCandInfo + lpCandInfo->dwOffset[0]);
  324. if (lpCandList->dwCount > dwValue)
  325. {
  326. lpCandList->dwSelection = dwValue;
  327. bRet = TRUE;
  328. //
  329. // Generate messages.
  330. //
  331. GnMsg.message = WM_IME_NOTIFY;
  332. GnMsg.wParam = IMN_CHANGECANDIDATE;
  333. GnMsg.lParam = 1L;
  334. GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
  335. }
  336. ImmUnlockIMCC(lpIMC->hCandInfo);
  337. }
  338. }
  339. ImmUnlockIMC(hIMC);
  340. break;
  341. case NI_CHANGECANDIDATELIST:
  342. if (!(lpIMC = ImmLockIMC(hIMC)))
  343. return FALSE;
  344. if (dwIndex == 1 && IsCandidate(lpIMC))
  345. bRet = TRUE;
  346. ImmUnlockIMC(hIMC);
  347. break;
  348. case NI_SETCANDIDATE_PAGESIZE:
  349. if (!(lpIMC = ImmLockIMC(hIMC)))
  350. return FALSE;
  351. if (dwIndex == 1 && IsCandidate(lpIMC))
  352. {
  353. if (dwValue > MAXCANDPAGESIZE)
  354. return FALSE;
  355. if (lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo))
  356. {
  357. lpCandList = (LPCANDIDATELIST)((LPSTR)lpCandInfo + lpCandInfo->dwOffset[0]);
  358. if (lpCandList->dwCount > dwValue)
  359. {
  360. lpCandList->dwPageSize = dwValue;
  361. bRet = TRUE;
  362. //
  363. // Generate messages.
  364. //
  365. GnMsg.message = WM_IME_NOTIFY;
  366. GnMsg.wParam = IMN_CHANGECANDIDATE;
  367. GnMsg.lParam = 1L;
  368. GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
  369. }
  370. ImmUnlockIMCC(lpIMC->hCandInfo);
  371. }
  372. }
  373. ImmUnlockIMC(hIMC);
  374. break;
  375. case NI_SETCANDIDATE_PAGESTART:
  376. if (!(lpIMC = ImmLockIMC(hIMC)))
  377. return FALSE;
  378. if (dwIndex == 1 && IsCandidate(lpIMC))
  379. {
  380. if (dwValue > MAXCANDPAGESIZE)
  381. return FALSE;
  382. if (lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo))
  383. {
  384. lpCandList = (LPCANDIDATELIST)((LPSTR)lpCandInfo + lpCandInfo->dwOffset[0]);
  385. if (lpCandList->dwCount > dwValue)
  386. {
  387. lpCandList->dwPageStart = dwValue;
  388. bRet = TRUE;
  389. //
  390. // Generate messages.
  391. //
  392. GnMsg.message = WM_IME_NOTIFY;
  393. GnMsg.wParam = IMN_CHANGECANDIDATE;
  394. GnMsg.lParam = 1L;
  395. GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
  396. }
  397. ImmUnlockIMCC(lpIMC->hCandInfo);
  398. }
  399. }
  400. ImmUnlockIMC(hIMC);
  401. break;
  402. case NI_IMEMENUSELECTED:
  403. #ifdef DEBUG
  404. {
  405. TCHAR szDev[80];
  406. OutputDebugString((LPTSTR)TEXT("NotifyIME IMEMENUSELECTED\r\n"));
  407. wsprintf((LPTSTR)szDev,TEXT("\thIMC is 0x%x\r\n"),hIMC);
  408. OutputDebugString((LPTSTR)szDev);
  409. wsprintf((LPTSTR)szDev,TEXT("\tdwIndex is 0x%x\r\n"),dwIndex);
  410. OutputDebugString((LPTSTR)szDev);
  411. wsprintf((LPTSTR)szDev,TEXT("\tdwValue is 0x%x\r\n"),dwValue);
  412. OutputDebugString((LPTSTR)szDev);
  413. }
  414. #endif
  415. break;
  416. default:
  417. break;
  418. }
  419. return bRet;
  420. }
  421. /**********************************************************************/
  422. /* ImeSelect() */
  423. /* */
  424. /**********************************************************************/
  425. BOOL WINAPI ImeSelect(HIMC hIMC, BOOL fSelect)
  426. {
  427. LPINPUTCONTEXT lpIMC;
  428. ImeLog(LOGF_ENTRY | LOGF_API, TEXT("ImeSelect"));
  429. if (fSelect)
  430. UpdateIndicIcon(hIMC);
  431. // it's NULL context.
  432. if (!hIMC)
  433. return TRUE;
  434. if (lpIMC = ImmLockIMC(hIMC))
  435. {
  436. if (fSelect)
  437. {
  438. LPCOMPOSITIONSTRING lpCompStr;
  439. LPCANDIDATEINFO lpCandInfo;
  440. // Init the general member of IMC.
  441. if (!(lpIMC->fdwInit & INIT_LOGFONT))
  442. {
  443. lpIMC->lfFont.A.lfCharSet = SHIFTJIS_CHARSET;
  444. lpIMC->fdwInit |= INIT_LOGFONT;
  445. }
  446. if (!(lpIMC->fdwInit & INIT_CONVERSION))
  447. {
  448. lpIMC->fdwConversion = IME_CMODE_ROMAN | IME_CMODE_FULLSHAPE | IME_CMODE_NATIVE;
  449. lpIMC->fdwInit |= INIT_CONVERSION;
  450. }
  451. lpIMC->hCompStr = ImmReSizeIMCC(lpIMC->hCompStr,sizeof(MYCOMPSTR));
  452. if (lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr))
  453. {
  454. lpCompStr->dwSize = sizeof(MYCOMPSTR);
  455. ImmUnlockIMCC(lpIMC->hCompStr);
  456. }
  457. lpIMC->hCandInfo = ImmReSizeIMCC(lpIMC->hCandInfo,sizeof(MYCAND));
  458. if (lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo))
  459. {
  460. lpCandInfo->dwSize = sizeof(MYCAND);
  461. ImmUnlockIMCC(lpIMC->hCandInfo);
  462. }
  463. }
  464. }
  465. ImmUnlockIMC(hIMC);
  466. return TRUE;
  467. }
  468. #ifdef DEBUG
  469. void DumpRS(LPRECONVERTSTRING lpRS)
  470. {
  471. TCHAR szDev[80];
  472. LPMYSTR lpDump= ((LPMYSTR)lpRS) + lpRS->dwStrOffset;
  473. *(LPMYSTR)(lpDump + lpRS->dwStrLen) = MYTEXT('\0');
  474. OutputDebugString(TEXT("DumpRS\r\n"));
  475. wsprintf(szDev, TEXT("dwSize %x\r\n"), lpRS->dwSize);
  476. OutputDebugString(szDev);
  477. wsprintf(szDev, TEXT("dwStrLen %x\r\n"), lpRS->dwStrLen);
  478. OutputDebugString(szDev);
  479. wsprintf(szDev, TEXT("dwStrOffset %x\r\n"), lpRS->dwStrOffset);
  480. OutputDebugString(szDev);
  481. wsprintf(szDev, TEXT("dwCompStrLen %x\r\n"), lpRS->dwCompStrLen);
  482. OutputDebugString(szDev);
  483. wsprintf(szDev, TEXT("dwCompStrOffset %x\r\n"), lpRS->dwCompStrOffset);
  484. OutputDebugString(szDev);
  485. wsprintf(szDev, TEXT("dwTargetStrLen %x\r\n"), lpRS->dwTargetStrLen);
  486. OutputDebugString(szDev);
  487. wsprintf(szDev, TEXT("dwTargetStrOffset %x\r\n"), lpRS->dwTargetStrOffset);
  488. OutputDebugString(szDev);
  489. MyOutputDebugString(lpDump);
  490. OutputDebugString(TEXT("\r\n"));
  491. }
  492. #endif
  493. /**********************************************************************/
  494. /* ImeSetCompositionString() */
  495. /* */
  496. /**********************************************************************/
  497. BOOL WINAPI ImeSetCompositionString(HIMC hIMC, DWORD dwIndex, LPVOID lpComp, DWORD dwComp, LPVOID lpRead, DWORD dwRead)
  498. {
  499. ImeLog(LOGF_API, TEXT("ImeSetCompositionString"));
  500. switch (dwIndex)
  501. {
  502. case SCS_QUERYRECONVERTSTRING:
  503. #ifdef DEBUG
  504. OutputDebugString(TEXT("SCS_QUERYRECONVERTSTRING\r\n"));
  505. if (lpComp)
  506. DumpRS((LPRECONVERTSTRING)lpComp);
  507. if (lpRead)
  508. DumpRS((LPRECONVERTSTRING)lpRead);
  509. #endif
  510. break;
  511. case SCS_SETRECONVERTSTRING:
  512. #ifdef DEBUG
  513. OutputDebugString(TEXT("SCS_SETRECONVERTSTRING\r\n"));
  514. if (lpComp)
  515. DumpRS((LPRECONVERTSTRING)lpComp);
  516. if (lpRead)
  517. DumpRS((LPRECONVERTSTRING)lpRead);
  518. #endif
  519. break;
  520. }
  521. return FALSE;
  522. }
  523. /**********************************************************************/
  524. /* ImeGetImeMenuItemInfo() */
  525. /* */
  526. /**********************************************************************/
  527. DWORD WINAPI ImeGetImeMenuItems(HIMC hIMC, DWORD dwFlags, DWORD dwType, LPMYIMEMENUITEMINFO lpImeParentMenu, LPMYIMEMENUITEMINFO lpImeMenu, DWORD dwSize)
  528. {
  529. ImeLog(LOGF_API, TEXT("ImeGetImeMenuItems"));
  530. if (!lpImeMenu)
  531. {
  532. if (!lpImeParentMenu)
  533. {
  534. if (dwFlags & IGIMIF_RIGHTMENU)
  535. return NUM_ROOT_MENU_R;
  536. else
  537. return NUM_ROOT_MENU_L;
  538. }
  539. else
  540. {
  541. if (dwFlags & IGIMIF_RIGHTMENU)
  542. return NUM_SUB_MENU_R;
  543. else
  544. return NUM_SUB_MENU_L;
  545. }
  546. return 0;
  547. }
  548. if (!lpImeParentMenu)
  549. {
  550. if (dwFlags & IGIMIF_RIGHTMENU)
  551. {
  552. lpImeMenu->cbSize = sizeof(IMEMENUITEMINFO);
  553. lpImeMenu->fType = 0;
  554. lpImeMenu->fState = 0;
  555. lpImeMenu->wID = IDIM_ROOT_MR_1;
  556. lpImeMenu->hbmpChecked = 0;
  557. lpImeMenu->hbmpUnchecked = 0;
  558. Mylstrcpy(lpImeMenu->szString, MYTEXT("RootRightMenu1"));
  559. lpImeMenu->hbmpItem = 0;
  560. lpImeMenu++;
  561. lpImeMenu->cbSize = sizeof(IMEMENUITEMINFO);
  562. lpImeMenu->fType = IMFT_SUBMENU;
  563. lpImeMenu->fState = 0;
  564. lpImeMenu->wID = IDIM_ROOT_MR_2;
  565. lpImeMenu->hbmpChecked = 0;
  566. lpImeMenu->hbmpUnchecked = 0;
  567. Mylstrcpy(lpImeMenu->szString, MYTEXT("RootRightMenu2"));
  568. lpImeMenu->hbmpItem = 0;
  569. lpImeMenu++;
  570. lpImeMenu->cbSize = sizeof(IMEMENUITEMINFO);
  571. lpImeMenu->fType = 0;
  572. lpImeMenu->fState = 0;
  573. lpImeMenu->wID = IDIM_ROOT_MR_3;
  574. lpImeMenu->hbmpChecked = 0;
  575. lpImeMenu->hbmpUnchecked = 0;
  576. Mylstrcpy(lpImeMenu->szString, MYTEXT("RootRightMenu3"));
  577. lpImeMenu->hbmpItem = 0;
  578. return NUM_ROOT_MENU_R;
  579. }
  580. else
  581. {
  582. lpImeMenu->cbSize = sizeof(IMEMENUITEMINFO);
  583. lpImeMenu->fType = 0;
  584. lpImeMenu->fState = 0;
  585. lpImeMenu->wID = IDIM_ROOT_ML_1;
  586. lpImeMenu->hbmpChecked = 0;
  587. lpImeMenu->hbmpUnchecked = 0;
  588. Mylstrcpy(lpImeMenu->szString, MYTEXT("RootLeftMenu1"));
  589. lpImeMenu->hbmpItem = 0;
  590. lpImeMenu++;
  591. lpImeMenu->cbSize = sizeof(IMEMENUITEMINFO);
  592. lpImeMenu->fType = IMFT_SUBMENU;
  593. lpImeMenu->fState = 0;
  594. lpImeMenu->wID = IDIM_ROOT_ML_2;
  595. lpImeMenu->hbmpChecked = 0;
  596. lpImeMenu->hbmpUnchecked = 0;
  597. Mylstrcpy(lpImeMenu->szString, MYTEXT("RootLeftMenu2"));
  598. lpImeMenu->hbmpItem = 0;
  599. lpImeMenu++;
  600. lpImeMenu->cbSize = sizeof(IMEMENUITEMINFO);
  601. lpImeMenu->fType = 0;
  602. lpImeMenu->fState = 0;
  603. lpImeMenu->wID = IDIM_ROOT_ML_3;
  604. lpImeMenu->hbmpChecked = 0;
  605. lpImeMenu->hbmpUnchecked = 0;
  606. Mylstrcpy(lpImeMenu->szString, MYTEXT("RootLeftMenu3"));
  607. lpImeMenu->hbmpItem = LoadBitmap(hInst,TEXT("FACEBMP"));
  608. return NUM_ROOT_MENU_L;
  609. }
  610. }
  611. else
  612. {
  613. if (dwFlags & IGIMIF_RIGHTMENU)
  614. {
  615. lpImeMenu->cbSize = sizeof(IMEMENUITEMINFO);
  616. lpImeMenu->fType = 0;
  617. lpImeMenu->fState = 0;
  618. lpImeMenu->wID = IDIM_SUB_MR_1;
  619. lpImeMenu->hbmpChecked = 0;
  620. lpImeMenu->hbmpUnchecked = 0;
  621. Mylstrcpy(lpImeMenu->szString, MYTEXT("SubRightMenu1"));
  622. lpImeMenu->hbmpItem = 0;
  623. lpImeMenu++;
  624. lpImeMenu->cbSize = sizeof(IMEMENUITEMINFO);
  625. lpImeMenu->fType = 0;
  626. lpImeMenu->fState = 0;
  627. lpImeMenu->wID = IDIM_SUB_MR_2;
  628. lpImeMenu->hbmpChecked = 0;
  629. lpImeMenu->hbmpUnchecked = 0;
  630. Mylstrcpy(lpImeMenu->szString, MYTEXT("SubRightMenu2"));
  631. lpImeMenu->hbmpItem = 0;
  632. return NUM_SUB_MENU_R;
  633. }
  634. else
  635. {
  636. lpImeMenu->cbSize = sizeof(IMEMENUITEMINFO);
  637. lpImeMenu->fType = 0;
  638. lpImeMenu->fState = IMFS_CHECKED;
  639. lpImeMenu->wID = IDIM_SUB_ML_1;
  640. lpImeMenu->hbmpChecked = 0;
  641. lpImeMenu->hbmpUnchecked = 0;
  642. Mylstrcpy(lpImeMenu->szString, MYTEXT("SubLeftMenu1"));
  643. lpImeMenu->hbmpItem = 0;
  644. lpImeMenu++;
  645. lpImeMenu->cbSize = sizeof(IMEMENUITEMINFO);
  646. lpImeMenu->fType = 0;
  647. lpImeMenu->fState = IMFS_CHECKED;
  648. lpImeMenu->wID = IDIM_SUB_ML_2;
  649. lpImeMenu->hbmpChecked = LoadBitmap(hInst,TEXT("CHECKBMP"));
  650. lpImeMenu->hbmpUnchecked = LoadBitmap(hInst,TEXT("UNCHECKBMP"));
  651. Mylstrcpy(lpImeMenu->szString, MYTEXT("SubLeftMenu2"));
  652. lpImeMenu->hbmpItem = 0;
  653. return NUM_SUB_MENU_L;
  654. }
  655. }
  656. return 0;
  657. }