C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
wchar_t, работа с unicode символами
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);
}

Скорее всего есть более простой способ, но я его пока не нашел. smile.gif
Еще можно поковырять LCMapString


Отредактировано AVC — 03/06/2005, 10:40
VovaN
Отправлено: 03.06.2005, 11:48


Дежурный стрелочник

Группа: Участник
Сообщений: 72



Огромное спасибо AVC! Работает!

Вернуться в Вопросы программирования в C++Builder