вторник, 7 сентября 2010 г.

Японские символы

Ввод иероглифов на на японском происходит либо через специальную клавиатуру (виртуальную), либо сочетанием из нескольких символов c обычной клавиатуры. Тут возникает вопрос, а как все это безобразие правильно отработать (при условии что у вас свой ввод данных идет, а не через стандартные контролы EditBox etc, в них по умолчанию с вводом все хорошо). Часть символов приходят от виртуальной клавиатуры. Ниже код для получения строки символов со специального окна ввода иероглифов.


  1. pragma once   
  2.        
  3. // - For East Asian languages such as Chinese, Japanese, Korean, and other languages with complex characters.    
  4. // - Input Method Editors (IME)    
  5.    
  6. // http://msdn.microsoft.com/en-us/library/ee419002(VS.85).aspx   
  7. // http://msdn.microsoft.com/en-us/library/dd318641(VS.85).aspx   
  8.    
  9. #include <Imm.h>   
  10.    
  11. #pragma comment ( lib, "imm32.lib" )   
  12.    
  13. class CIMEUIController   
  14. {   
  15. public:   
  16.        
  17.     CIMEUIController ()   
  18.     {   
  19.         m_bInitialized = false;   
  20.     }   
  21.    
  22.     ~CIMEUIController ()   
  23.     {   
  24.         Uninitialize ();   
  25.     }   
  26.    
  27.        
  28.     bool Initialize( HWND hWND )   
  29.     {   
  30.         if ( m_bInitialized )   
  31.             return true;   
  32.    
  33.         m_hWND = hWND;   
  34.        
  35.         return true;   
  36.     }   
  37.    
  38.     void Uninitialize()   
  39.     {   
  40.         if ( false == m_bInitialized )   
  41.             return;   
  42.            
  43.         m_bInitialized = false;   
  44.     }   
  45.    
  46.        
  47.     LPARAM ProcessMessage ( UINT uMsg, WPARAM wParam, LPARAM& lParam, WCHAR** ppIMEStr, LONG& IMEBytes )   
  48.     {   
  49.         switch ( uMsg )   
  50.         {   
  51.         case WM_IME_STARTCOMPOSITION:   
  52.             {   
  53.                
  54.             }   
  55.             break;   
  56.            
  57.         //    
  58.         case WM_IME_ENDCOMPOSITION:   
  59.             {   
  60.                 *ppIMEStr   =   NULL;   
  61.                 IMEBytes    =   0;   
  62.    
  63.                 HIMC hIMC = ImmGetContext ( m_hWND );   
  64.                 if ( hIMC )   
  65.                 {   
  66.                     LONG IMECursorBytes = ::ImmGetCompositionStringW ( hIMC,    
  67.                         GCS_RESULTSTR,   
  68.                         //GCS_RESULTREADSTR   
  69.                         NULL, 0 );   
  70.    
  71.                     DWORD Bytes = 0;   
  72.                     WCHAR* pIMEStr = new WCHAR [ IMECursorBytes + 1 ];   
  73.                     ::ZeroMemory ( pIMEStr, sizeof ( WCHAR ) * IMECursorBytes + 1 );   
  74.                        
  75.                     if ( pIMEStr )   
  76.                     {   
  77.                         if ( 0 != ::ImmGetCompositionStringW ( hIMC,    
  78.                             GCS_RESULTSTR,   
  79.                             //GCS_RESULTREADSTR,   
  80.                             pIMEStr, IMECursorBytes + 1 ) )    
  81.                         {   
  82.                             *ppIMEStr   =   pIMEStr;   
  83.                             IMEBytes    =   IMECursorBytes + 1;   
  84.                        
  85.                             ImmReleaseContext ( m_hWND, hIMC );   
  86.    
  87.                             return TRUE;   
  88.    
  89.                         }   
  90.                     }   
  91.    
  92.                     ImmReleaseContext ( m_hWND, hIMC );   
  93.                 }   
  94.             }   
  95.             break;   
  96.    
  97.         case WM_IME_NOTIFY:   
  98.             {   
  99.                 switch ( wParam )   
  100.                 {   
  101.                 case IMN_SETCONVERSIONMODE:   
  102.                 case IMN_SETOPENSTATUS:   
  103.                     break;   
  104.    
  105.                 case IMN_OPENCANDIDATE:   
  106.                 case IMN_CHANGECANDIDATE:   
  107.                     break;   
  108.                 }   
  109.             }   
  110.             break;   
  111.         }   
  112.    
  113.         return FALSE;   
  114.     }   
  115.    
  116.    
  117. private:   
  118.    
  119.     bool    m_bInitialized;   
  120.    
  121.     HWND    m_hWND;   
  122. };  


Free 3D Screen Saver

Комментариев нет: