Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > вставить или добавить символ в wstring


Автор: ksili 28.10.2008, 11:45
Есть код символа типа int. Надо вставить его между конкретными символами в строке типа wstring (т.е. insert, а не поверх другого символа).
Ну или хотя бы разобраться как его добавить в конец.

Добавлено через 6 минут и 15 секунд
у типа wstring есть методы _Insert и insert, но что-то я не врубаюсь в их параметры

Автор: mrbrooks 28.10.2008, 11:58
ksili, ну дык там есть параметры в методе - позиция и сам символ. собственно этого и должно быть достаточно.

Добавлено через 10 минут и 12 секунд
Цитата(ksili @  28.10.2008,  11:45 Найти цитируемый пост)
Ну или хотя бы разобраться как его добавить в конец.

через знак +

Автор: ksili 28.10.2008, 12:16
Цитата(mrbrooks @  28.10.2008,  15:58 Найти цитируемый пост)
через знак +

через знак + не добавляются ни int, ни char
Цитата(mrbrooks @  28.10.2008,  15:58 Найти цитируемый пост)
ну дык там есть параметры в методе - позиция и сам символ

Кроме них там, есть другие непонятные параметры с именами _Off, _Where, _Int_iterator_tag и др. вот их и не осилил. 

insert'ом вообще символ вставить можно? или только строку?

Автор: Dmi3ev 28.10.2008, 12:52
а если append попробовать или:
Код

p.insert (p.size()/2, "середина");


Автор: mrbrooks 28.10.2008, 13:08
Цитата(ksili @  28.10.2008,  12:16 Найти цитируемый пост)
ни char

разумеется - правильно wchar_t. ты же с юникодом работаешь.
Цитата(ksili @  28.10.2008,  12:16 Найти цитируемый пост)
insert'ом вообще символ вставить можно? или только строку? 


Код

wchar_t wch[] = L"f";
std::wstring str = L"Hello!";
str.insert(2,wch);
str += wch;


Добавлено через 2 минуты и 6 секунд
Цитата(ksili @  28.10.2008,  12:16 Найти цитируемый пост)

Кроме них там, есть другие непонятные параметры с именами _Off, _Where, _Int_iterator_tag и др. вот их и не осилил. 


Здесь надо читать книги по STL. smile 

Автор: ksili 28.10.2008, 13:29
Вот так прокатило:
Код

void TextBoxEditor::OnAddSymbol(int key)
{
    wstring     tempstr;
    wstring wch;

    wch = key;

    tempstr = GetAllText();
    tempstr.insert(GetCurPos(),wch);    
..............................
}

Но почему-то добавляемые буквы приводятся к верхнему регистру. 

Если использовать не wstring wch; а wchar_t wch[1];, то почему-то добавляет по два символа, один нормальный а один глючный, как будто wchar_t занимает 4 байта.

Автор: ИванМ 28.10.2008, 13:35
Ну просто int обычно занимает 4 байта. А wchar_t 2.

Автор: ksili 28.10.2008, 14:03
Как победить приведение к верхнему регистру?

Автор: ksili 28.10.2008, 15:46
Продолжаю разбираться с приведением к верхнему регистру. Оказывается такой код символа уже приходит в параметрах сообщения WM_KEYDOWN. Странно как-то.

Вот помню в Билдере есть две функции соответствующие - OnKeyDown и OnKeyPress. И кажется OnKeyPress поинтеллектуальнее. Но вот сообщения WM_KEYPRESS нету, а жаль.

Вообще приложение пишется под Windows Mobile. И когда я запускаю эмулятор девайса, там можно как в настоящем устройстве открывать и пользоваться виртуальной клавиатурой. Так вот даже там, нажимай хоть маленькие буквы, хоть большие - печатаются большие.

Автор: mrbrooks 28.10.2008, 16:30
ksili, Дык обожди. Ты что делаешь то вообще? Может решение совсем другое нужно. Раз пишешь под Mobile - если с гуем - то чисто на WinAPI или при промощи MFC?

Автор: 586 28.10.2008, 18:11
Цитата(ksili @  28.10.2008,  16:46 Найти цитируемый пост)
Но вот сообщения WM_KEYPRESS нету, а жаль.

Есть сообщение WM_CHAR.

Добавлено через 4 минуты и 53 секунды
и WM_UNICHAR

Автор: J0ker 28.10.2008, 19:03
Цитата(ksili @  28.10.2008,  13:29 Найти цитируемый пост)
Если использовать не wstring wch; а wchar_t wch[1];, то почему-то добавляет по два символа, один нормальный а один глючный, как будто wchar_t занимает 4 байта. 

потому, что форма insert'a которую вы используете, вставляет СТРОКУ а не символ
правильное использование:
Код

tempstr.insert(GetCurPos(), 1, wch);


Автор: ksili 28.10.2008, 19:22
чисто на WinAPI

Попробую WM_CHAR и WM_UNICHAR

Автор: J0ker 28.10.2008, 19:32
Цитата(ksili @  28.10.2008,  15:46 Найти цитируемый пост)
Продолжаю разбираться с приведением к верхнему регистру. Оказывается такой код символа уже приходит в параметрах сообщения WM_KEYDOWN. Странно как-то.

вы путаете виртуальный код и код символа
вам определенно надо ловить WM_CHAR
объясняю как происходит процесс
когда вы нажимаете клавишу, клавиатура выбрасывает код - т.н. скэн-код, его ловит драйвер и затем пересылает окну с фокусом ввода в виде WM_KEYDOWN - в нем присутствует скэн-код в lParam (который может различаться для одной и той-же клавиши - все зависит от производителя), и виртуальный код в wParam - который уже от производителя не зависит - это внутренний код ОС - это просто трансляция скэн-кодов в универсальный внутренний код ОС. Т.к. клавиша для строчной и заглавной буквы одна, то и виртуальный код (и скэн-код) тоже ОДИН и тот-же - эти коды просто определяют конкретную клавишу, а то, что виртуальный код совпадает с кодом СИМВОЛА заглавной буквы - просто СОВПАДЕНИЕ (намеренное конечно - так проще).
Далее...
Когда WM_KEYDOWN ловится обработчиком очереди сообщений (если вы конечно его не перекрыли ручками smile, то он (обработчик) вызывает функцию TranslateMessage и передает туда это сообщение. Внутря этой функции происходит обработка - т.е. определяется символ-ли это, определяются уже нажатые системные клавиши и и флаги (в том числе и CapsLock) - и если все условия благоприятственны, эта функция запихивает в очередь сообщений WM_CHAR сообщение с кодом символа в wParam - что вам собственно и нужно.

Автор: ksili 29.10.2008, 05:01
Цитата(J0ker @  28.10.2008,  23:32 Найти цитируемый пост)
Когда WM_KEYDOWN ловится обработчиком очереди сообщений (если вы конечно его не перекрыли ручками , то он (обработчик) вызывает функцию TranslateMessage и передает туда это сообщение. Внутря этой функции происходит обработка - т.е. определяется символ-ли это, определяются уже нажатые системные клавиши и и флаги (в том числе и CapsLock) - и если все условия благоприятственны, эта функция запихивает в очередь сообщений WM_CHAR сообщение с кодом символа в wParam - что вам собственно и нужно.

Т.е. WM_KEYDOWN перекрывать нежелательно? Оно у меня уже используется для обработки нажатий стрелок курсора, home, end и др непечатных клавиш. Они будут в WM_CHAR попадать?
И ещё мне надо будет делать обработку одновременного нажатия Shift и стрелок.

Автор: J0ker 29.10.2008, 06:48
Цитата(ksili @ 29.10.2008,  05:01)
Цитата(J0ker @  28.10.2008,  23:32 Найти цитируемый пост)
Когда WM_KEYDOWN ловится обработчиком очереди сообщений (если вы конечно его не перекрыли ручками , то он (обработчик) вызывает функцию TranslateMessage и передает туда это сообщение. Внутря этой функции происходит обработка - т.е. определяется символ-ли это, определяются уже нажатые системные клавиши и и флаги (в том числе и CapsLock) - и если все условия благоприятственны, эта функция запихивает в очередь сообщений WM_CHAR сообщение с кодом символа в wParam - что вам собственно и нужно.

Т.е. WM_KEYDOWN перекрывать нежелательно? Оно у меня уже используется для обработки нажатий стрелок курсора, home, end и др непечатных клавиш. Они будут в WM_CHAR попадать?
И ещё мне надо будет делать обработку одновременного нажатия Shift и стрелок.

если вы не перехватили обработчик очереди сообщений то вы ничего не перекрываете - OnKeyDown вызывает обработчик
в WM_CHAR попадают только печатаемые символы
для обработки стрелок + shift надо обрабатывать WM_KEYDOWN или/и WM_KEYUP и проверять состояние shift через GetKeyState(VK_LSHIFT) & (unsigned short)0x8000 и GetKeyState(VK_RSHIFT) & (unsigned short)0x8000

Добавлено через 5 минут и 46 секунд
если вам нужно проверить оба шифта - (GetKeyState(VK_LSHIFT) | GetKeyState(VK_RSHIFT)) & (unsigned short)0x8000 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)