VovaN |
Отправлено: 03.06.2005, 09:51 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 72
|
Как в обработчике KeyPress преобразовать Key в unicode символ?
Я пробую:
CODE |
AnsiString str;
char* unicode_symbol;
wctomb(unicode_symbol,wchar_t(Key));
str=AnsiString(unicode_symbol);
|
что -то не выходит
Отредактировано VovaN — 03/06/2005, 09:54 |
|
Guest |
Отправлено: 03.06.2005, 10:21 |
|
Не зарегистрирован
|
Label1->Caption = AnsiString(WideString(wchar_t(Key)));
|
|
VovaN |
Отправлено: 03.06.2005, 10:28 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 72
|
не работает.
для тестировки выложил два эдита, в первом написал обработчик
CODE |
void __fastcall TForm1::Edit1KeyUp(TObject *Sender, WORD &Key,
TShiftState Shift)
{
Edit2->Text=AnsiString(WideString(wchar_t(Key)));
}
|
В результате при нажатии клавиши "ж"
во втором эдите текст:"?"
Отредактировано VovaN — 03/06/2005, 10:29 |
|
Guest |
Отправлено: 03.06.2005, 10:42 |
|
Не зарегистрирован
|
Естественно. Это же код (рабочий) для KeyPress (как было написано в первом посте).
Переведите VKey к char. |
|
VovaN |
Отправлено: 03.06.2005, 10:47 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 72
|
Если можно, Guest (?Admin?), покажите пожалуйста как сделать это преобразование для примера с эдитами. |
|
Guest |
Отправлено: 03.06.2005, 11:09 |
|
Не зарегистрирован
|
(?Admin?) — нет
CODE |
//---------------------------------------------------------------------------
// Преобразовать VK_??? (из OnKeyDown) в char или 0
//---------------------------------------------------------------------------
PACKAGE char __fastcall VKey_ToChar (WORD Key)
{
static unsigned char kbdstate [300];
WORD wkey;
GetKeyboardState (kbdstate);
if (ToAscii (Key, 0, kbdstate, &wkey, 0) != 1) wkey = 0;
return (char) (wkey & 0xFF);
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Edit1KeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{
Edit2->Text = Edit2->Text + AnsiString(WideString(wchar_t(VKey_ToChar(Key))));
}
//---------------------------------------------------------------------------
|
Но для русского ввода работает не правильно, так как нехватает корректного перевода char в wchar_t
|
|
VovaN |
Отправлено: 03.06.2005, 11:26 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 72
|
русский язык — это то что как раз и надо... |
|
AVC |
Отправлено: 03.06.2005, 11:35 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Так работает правильно
CODE |
void __fastcall TForm2::Edit1KeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{
AnsiString str(VKey_ToChar(Key));
wchar_t wstr[2];
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str.c_str(), -1, wstr, 1);
wstr[1] = '\0';
Edit2->Text = Edit2->Text + AnsiString(wstr);
}
|
Скорее всего есть более простой способ, но я его пока не нашел.
Еще можно поковырять LCMapString
Отредактировано AVC — 03/06/2005, 10:40 |
|
VovaN |
Отправлено: 03.06.2005, 11:48 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 72
|
Огромное спасибо AVC! Работает! |
|