С вводом обычных символом все отлично для английского или русского языков. Пока вам не понадобится самому написать отработку ввода с клавиатуры для разнообразных языков (французский, языки Африки etc ).
á, é, í, ó, ú - примеры таких символов, которые вводятся из соотвествующих комбинаций на клавиатуре. Для стандартных контролов ввод таких символов сделан на уровне OS. Для самописных текстовых контролов, разумеется требуется свой обработчик сообщений.
Код для обработки таких символов ( проверено для французского языка ).
- WCHAR DEAD_KEY;
- VOID OnKeyDown ( UINT Key )
- {
- if (( Key >= 'A' && Key <= 'Z' ) ||
- ( Key >= '0' && Key <= '9' ) ||
- ( Key >= VK_OEM_1 && Key <= VK_OEM_3 ) ||
- ( Key >= VK_OEM_4 && Key <= VK_OEM_8 ) ||
- ( Key >= VK_NUMPAD0 && Key <= VK_DIVIDE ) )
- {
- WCHAR wKEY [ 3 ] = { L'\0', L'\0', L'\0' };
- BYTE kbdState[256];
- ZeroMemory( kbdState, 256 );
- GetKeyboardState ( kbdState );
- WCHAR KeyboardState = wKEY [ 0 ];
- if ( 1 == ToUnicode ( Key, 0, kbdState, wKEY, 3, 0 ) )
- {
- if ( DEAD_KEY != L'\0' )
- {
- WCHAR WCS_IN[3];
- WCHAR WCS_OUT[3];
- WCS_IN[0] = wKEY[0];
- WCS_IN[1] = DEAD_KEY;
- WCS_IN[2] = L'\0';
- /* from accent char to unicode */
- if ( FoldStringW ( MAP_PRECOMPOSED, WCS_IN, 3, WCS_OUT, 3 ) )
- {
- wKEY[0] = WCS_OUT[0];
- wKEY[1] = WCS_OUT[1];
- wKEY[2] = WCS_OUT[2];
- }
- }
- else
- {
- }
- DEAD_KEY = L'\0';
- }
- else
- {
- DEAD_KEY = L'\0';
- switch ( wKEY[0] )
- {
- case 0x5e: /* circumflex */
- DEAD_KEY = 0x302; break;
- case 0x60: /* grave accent */
- DEAD_KEY = 0x300; break;
- case 0xa8: /* diaeresis */
- DEAD_KEY = 0x308; break;
- case 0xb4: /* acute accent */
- DEAD_KEY = 0x301; break;
- case 0xb8: /* cedilla */
- DEAD_KEY = 0x327; break;
- default:
- DEAD_KEY = wKEY[0];
- break;
- }
- return;
- }
- wKEY [ 1 ] = L'\0';
- CString String = CStringW ( wKEY ); // нужная нам буква
- }
- }
Free 3d Screen Saver
Комментариев нет:
Отправить комментарий