Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вставить или добавить символ в wstring 
:(
    Опции темы
ksili
Дата 28.10.2008, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



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

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


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
mrbrooks
Дата 28.10.2008, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



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

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

через знак +
PM MAIL   Вверх
ksili
Дата 28.10.2008, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



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

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

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

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


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Dmi3ev
Дата 28.10.2008, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 13
Всего: 41



а если append попробовать или:
Код

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




--------------------

PM MAIL   Вверх
mrbrooks
Дата 28.10.2008, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



Цитата(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 

PM MAIL   Вверх
ksili
Дата 28.10.2008, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Вот так прокатило:
Код

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 байта.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
ИванМ
Дата 28.10.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Ну просто int обычно занимает 4 байта. А wchar_t 2.
PM MAIL   Вверх
ksili
Дата 28.10.2008, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Как победить приведение к верхнему регистру?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
ksili
Дата 28.10.2008, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



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

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

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


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
mrbrooks
Дата 28.10.2008, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



ksili, Дык обожди. Ты что делаешь то вообще? Может решение совсем другое нужно. Раз пишешь под Mobile - если с гуем - то чисто на WinAPI или при промощи MFC?
PM MAIL   Вверх
586
Дата 28.10.2008, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



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

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

Добавлено через 4 минуты и 53 секунды
и WM_UNICHAR
PM   Вверх
J0ker
Дата 28.10.2008, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



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

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

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




--------------------
user posted image
PM MAIL   Вверх
ksili
Дата 28.10.2008, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



чисто на WinAPI

Попробую WM_CHAR и WM_UNICHAR


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
J0ker
Дата 28.10.2008, 19:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



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

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


--------------------
user posted image
PM MAIL   Вверх
ksili
Дата 29.10.2008, 05:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



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

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


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
J0ker
Дата 29.10.2008, 06:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(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 


--------------------
user posted image
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0578 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.