home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / winui / input / ime / imeapps / imemenu.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-09-11  |  7.2 KB  |  220 lines

  1. /**********************************************************************/
  2. /*                                                                    */
  3. /*      IMEMENU.C                                                     */
  4. /*                                                                    */
  5. /*      Copyright (c) 1995-1997  Microsoft Corporation                */
  6. /*                                                                    */
  7. /**********************************************************************/
  8.  
  9. #include "windows.h"
  10. #include "commdlg.h"
  11. #include "commctrl.h"
  12. #include "imm.h"
  13. #include "resource.h"
  14. #include "imeapps.h"
  15.  
  16. LPDWORD lpdwIDTable = NULL;
  17. int nIDTable = 0;
  18.  
  19. /**********************************************************************/
  20. /*                                                                    */
  21. /*    EndMenuItemIDTable()                                            */
  22. /*                                                                    */
  23. /**********************************************************************/
  24. void EndMenuItemIDTable()
  25. {
  26.     if (lpdwIDTable)
  27.         GlobalFree((HANDLE)lpdwIDTable);
  28.  
  29.     nIDTable = 0;
  30. }
  31.  
  32. /**********************************************************************/
  33. /*                                                                    */
  34. /*    InitMenuItemIDTable()                                           */
  35. /*                                                                    */
  36. /**********************************************************************/
  37. void InitMenuItemIDTable()
  38. {
  39.     EndMenuItemIDTable();
  40.     lpdwIDTable = GlobalAlloc(GPTR, 100 * 2 * sizeof(DWORD));
  41. }
  42.  
  43. /**********************************************************************/
  44. /*                                                                    */
  45. /*    AddIDTableEntry()                                               */
  46. /*                                                                    */
  47. /**********************************************************************/
  48. void AddIDTableEntry(UINT wID, DWORD dwItemData)
  49. {
  50.     *(lpdwIDTable+(nIDTable*2)) = wID;
  51.     *(lpdwIDTable+(nIDTable*2)+1) = dwItemData;
  52.     nIDTable++;
  53. }
  54.  
  55. /**********************************************************************/
  56. /*                                                                    */
  57. /*    FindItemData()                                                  */
  58. /*                                                                    */
  59. /**********************************************************************/
  60. DWORD FindItemData(UINT wID)
  61. {
  62.     int i;
  63.     for (i = 0; i < nIDTable ; i++)
  64.     {
  65.         if (*(lpdwIDTable+(i*2)) == wID)
  66.             return *(lpdwIDTable+(i*2)+1);
  67.     }
  68. }
  69.  
  70.  
  71. /**********************************************************************/
  72. /*                                                                    */
  73. /*    FillMenuItemInfo()                                              */
  74. /*                                                                    */
  75. /**********************************************************************/
  76. void FillMenuItemInfo(HWND hWnd, HIMC hIMC, LPMENUITEMINFO lpmii, LPMYIMEMENUITEMINFO lpIme, BOOL fRight)
  77. {
  78.     FillMemory((PVOID)lpmii, sizeof(MENUITEMINFO), 0);
  79.     lpmii->cbSize = sizeof(MENUITEMINFO);
  80.     lpmii->fMask = 0;
  81.  
  82.     // Set fType;
  83.     if (lpIme->fType)
  84.     {
  85.         lpmii->fMask |= MIIM_TYPE;
  86.         lpmii->fType = 0;
  87.  
  88.         if (lpIme->fType & IMFT_RADIOCHECK)
  89.             lpmii->fType |= MFT_RADIOCHECK;
  90.  
  91.         if (lpIme->fType & IMFT_SEPARATOR)
  92.             lpmii->fType |= MFT_SEPARATOR;
  93.  
  94.     }
  95.  
  96.     lpmii->fMask |= MIIM_ID;
  97.     lpmii->wID = lpIme->wID + IDM_STARTIMEMENU;
  98.  
  99.     if (lpIme->fType & IMFT_SUBMENU)
  100.     {
  101.         lpmii->fMask |= MIIM_SUBMENU;
  102.         lpmii->hSubMenu = CreateImeMenu(hWnd, hIMC, lpIme, fRight);
  103.     }
  104.  
  105.     lpmii->fMask |= MIIM_STATE;
  106.     lpmii->fState = lpIme->fState;
  107.  
  108.     if (lpIme->hbmpChecked &&  lpIme->hbmpUnchecked)
  109.     {
  110.        lpmii->fMask |= MIIM_CHECKMARKS;
  111.        lpmii->hbmpChecked = lpIme->hbmpChecked;
  112.        lpmii->hbmpUnchecked = lpIme->hbmpUnchecked;
  113.     }
  114.     
  115.  
  116.     lpmii->fMask |= MIIM_DATA;
  117.     lpmii->dwItemData = lpIme->dwItemData;
  118.  
  119.     if (lpIme->hbmpItem)
  120.     {
  121.        lpmii->fMask |= MIIM_BITMAP;
  122.        lpmii->hbmpItem = lpIme->hbmpItem;
  123.     }
  124.  
  125.  
  126. #ifdef USEWAPI
  127.     {
  128.         BOOL bUDC;
  129.         int i;
  130.         char   szTemp[IMEMENUITEM_STRING_SIZE];
  131.  
  132.         i = WideCharToMultiByte(CP_ACP,
  133.                                 0,
  134.                                 lpIme->szString,
  135.                                 wcslen(lpIme->szString),
  136.                                 szTemp,
  137.                                 IMEMENUITEM_STRING_SIZE,
  138.                                 (LPSTR)NULL,
  139.                                 &bUDC);
  140.         szTemp[i] = '\0';
  141.  
  142.         if (lstrlen(szTemp))
  143.         {
  144.             lpmii->fMask |= MIIM_STRING;
  145.             lstrcpy((LPSTR)lpIme->szString, szTemp);
  146.             lpmii->dwTypeData = (LPSTR)lpIme->szString;
  147.             lpmii->cch = lstrlen((LPSTR)lpIme->szString);
  148.         }
  149.     }
  150. #else
  151.     if (lstrlen(lpIme->szString))
  152.     {
  153.         lpmii->fMask |= MIIM_STRING;
  154.         lpmii->dwTypeData = lpIme->szString;
  155.         lpmii->cch = lstrlen(lpIme->szString);
  156.     }
  157. #endif
  158.  
  159. }
  160.  
  161. /**********************************************************************/
  162. /*                                                                    */
  163. /*    CreateImeMenu()                                                 */
  164. /*                                                                    */
  165. /**********************************************************************/
  166. HMENU CreateImeMenu(HWND hWnd, HIMC hIMC, LPMYIMEMENUITEMINFO lpImeParentMenu, BOOL fRight)
  167. {
  168.     HMENU hMenu;
  169.     DWORD dwSize, dwNum, dwI;
  170.     MENUITEMINFO mii;
  171.     LPMYIMEMENUITEMINFO lpImeMenu;
  172.     
  173.  
  174.     dwNum = MyImmGetImeMenuItems(hIMC, fRight ? IGIMIF_RIGHTMENU : 0, 
  175.                                  IGIMII_CMODE |
  176.                                  IGIMII_SMODE |
  177.                                  IGIMII_CONFIGURE |
  178.                                  IGIMII_TOOLS |
  179.                                  IGIMII_HELP |
  180.                                  IGIMII_OTHER,
  181.                                  lpImeParentMenu, NULL, 0);
  182.  
  183.     if (!dwNum)
  184.         return 0;
  185.  
  186.  
  187.  
  188.     dwSize = dwNum * sizeof(MYIMEMENUITEMINFO);
  189.  
  190.     lpImeMenu = (LPMYIMEMENUITEMINFO)GlobalAlloc(GPTR, dwSize);
  191.  
  192.     dwNum = MyImmGetImeMenuItems(hIMC, fRight ? IGIMIF_RIGHTMENU : 0, 
  193.                                  IGIMII_CMODE |
  194.                                  IGIMII_SMODE |
  195.                                  IGIMII_CONFIGURE |
  196.                                  IGIMII_TOOLS |
  197.                                  IGIMII_HELP |
  198.                                  IGIMII_OTHER,
  199.                                  lpImeParentMenu, lpImeMenu, dwSize);
  200.  
  201.     
  202.     hMenu = CreatePopupMenu();
  203.  
  204.     for (dwI = 0 ; dwI < dwNum; dwI++)
  205.     {
  206.         AddIDTableEntry(lpImeMenu->wID, lpImeMenu->dwItemData);
  207.         FillMenuItemInfo(hWnd, hIMC, &mii, lpImeMenu + dwI, fRight);
  208.         InsertMenuItem(hMenu, dwI, TRUE, &mii);
  209.     }
  210.  
  211.     GlobalFree((HANDLE)lpImeMenu);
  212.  
  213.  
  214.     return hMenu;
  215. }
  216.  
  217.  
  218.  
  219.  
  220.