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

Dead Keys

«Мёртвые клавиши» (англ. dead keys) — клавиши на компьютерных клавиатурах или пишущих машинках, позволяющие изменить вид следующего вводимого символа. На печатных машинках нажатие на «мёртвую» клавишу ставит надстрочный символ, но не сдвигает каретку на следующий символ. На компьютерах нажатие «мёртвой» клавиши изменяет код следующего вводимого символа.

С вводом обычных символом все отлично для английского или русского языков. Пока вам не понадобится самому написать отработку ввода с клавиатуры для разнообразных языков (французский, языки Африки etc ).
á, é, í, ó, ú - примеры таких символов, которые вводятся из соотвествующих комбинаций на клавиатуре. Для стандартных контролов ввод таких символов сделан на уровне OS. Для самописных текстовых контролов, разумеется требуется свой обработчик сообщений.

Код для обработки таких символов ( проверено для французского языка ).

  1. WCHAR       DEAD_KEY;   
  2.    
  3. VOID OnKeyDown ( UINT Key )   
  4. {   
  5.     if (( Key >= 'A'     && Key <= 'Z'        ) ||    
  6.         ( Key >= '0'     && Key <= '9'        ) ||    
  7.         ( Key >= VK_OEM_1    && Key <= VK_OEM_3   ) ||    
  8.         ( Key >= VK_OEM_4    && Key <= VK_OEM_8   ) ||   
  9.         ( Key >= VK_NUMPAD0 && Key <= VK_DIVIDE ) )   
  10.     {   
  11.         WCHAR wKEY [ 3 ]    =   { L'\0', L'\0', L'\0' };   
  12.    
  13.         BYTE kbdState[256];   
  14.         ZeroMemory( kbdState, 256 );   
  15.    
  16.         GetKeyboardState ( kbdState );   
  17.    
  18.         WCHAR KeyboardState =   wKEY [ 0 ];   
  19.    
  20.         if ( 1 == ToUnicode ( Key, 0, kbdState, wKEY, 3, 0 ) )   
  21.         {   
  22.             if ( DEAD_KEY != L'\0' )    
  23.             {   
  24.                 WCHAR WCS_IN[3];   
  25.                 WCHAR WCS_OUT[3];   
  26.    
  27.                 WCS_IN[0] = wKEY[0];   
  28.                 WCS_IN[1] = DEAD_KEY;   
  29.                 WCS_IN[2] = L'\0';   
  30.    
  31.                 /* from accent char to unicode */   
  32.                 if ( FoldStringW ( MAP_PRECOMPOSED, WCS_IN, 3, WCS_OUT, 3 ) )   
  33.                 {   
  34.                     wKEY[0] = WCS_OUT[0];   
  35.                     wKEY[1] = WCS_OUT[1];   
  36.                     wKEY[2] = WCS_OUT[2];   
  37.                 }   
  38.             }   
  39.             else   
  40.             {   
  41.    
  42.             }   
  43.    
  44.             DEAD_KEY = L'\0';   
  45.         }   
  46.         else   
  47.         {   
  48.             DEAD_KEY            =   L'\0';   
  49.    
  50.             switch ( wKEY[0] )    
  51.             {   
  52.             case 0x5e:          /* circumflex */   
  53.                 DEAD_KEY = 0x302;  break;   
  54.             case 0x60:          /* grave accent */   
  55.                 DEAD_KEY = 0x300;  break;   
  56.             case 0xa8:          /* diaeresis */   
  57.                 DEAD_KEY = 0x308;  break;   
  58.             case 0xb4:          /* acute accent */   
  59.                 DEAD_KEY = 0x301;  break;   
  60.             case 0xb8:          /* cedilla */   
  61.                 DEAD_KEY = 0x327;  break;   
  62.             default:   
  63.                 DEAD_KEY    =   wKEY[0];   
  64.                 break;   
  65.             }   
  66.    
  67.             return;   
  68.         }                      
  69.    
  70.         wKEY [ 1 ]  =   L'\0';   
  71.    
  72.         CString String  =   CStringW ( wKEY );  //  нужная нам буква   
  73.     }   
  74. }  


Free 3d Screen Saver

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