Здравствуйте. У меня проблема. Я решил написать простенький редактор, который для ввода использует цифры(Т-9). Написал алгоритм преобразования словаря в hash таблицу(использовал std::map). А как теперь правильно ловить ввод и осуществить преобразование введенных цифр в слово. Я прикрепил к теме мой проект. PS: Заранее благодарю, и не бейте сильно за то что я коряво задаю вопросы
судя по всему можно где то и здеся Код (Text): BOOL CNotepad_mfcDlg::PreTranslateMessage(MSG* pMsg) { //то распахиваем окно на весь экран //AfxGetMainWnd()->ShowWindow(SW_SHOWMAXIMIZED); if (pMsg->message==WM_KEYDOWN) { if (pMsg->wParam == VK_SPACE) { isSpace = true; str = ""; } else isSpace = false; if (pMsg->wParam >= VK_NUMPAD1 && pMsg->wParam <= VK_NUMPAD9) { str += (pMsg->wParam - 0x60 + 0x30); pMsg->wParam = 70; } } return CDialog::PreTranslateMessage(pMsg); } ваще мне нравятся студии... оч позволяют не знать , нафига така структура MSG... например.
jhons А к чему вообще это? Я попросил помощи, потому что сам не пойму как сделать. Лучше бы что нибудь толковое сказали....
REASY задачу можно свести к регулярному поиску в векторе возможных слов, где каждая цифра добавляет новый диапазон в шаблон и поиск повторяется. Это простой метод, но не оптимальный.
вобще то это ответ на вопрос вот еще на всяк случай http://www.cyberguru.ru/programming/win32/win32-keyboard-page3.html зы: прозьба ... рассмотрите внимательно участок вашей программы , который привел выше.... сдеся http://www.cyberguru.ru/programming/win32/win32-keyboard-page14.html даже с примерчиком ... просто сравните... плиз.
Вот вкратце что делает программа. После запуска смотрит есть ли файл hashDic.txt, если есть, то он загружает из нее данные в map<string, string> hashTable, если отсутствует hashDic.txt, то просить выбрать файл-словарь и из этого словаря генерируется хеш-таблица. Хеш-таблица имеет вид: 435-hel:gel: 3327-dear: 374363-friend: 2-a:b:c: 3-d:e:f: .... т.е. допустим,hashTable["435"] = "hel:gel:". А теперь я прощу Вас помочь мне организовать ввод, то есть, когда мы набираем цифры под NumLock, то программа находит, какому слову (словам) соответствует введенная цифра(например, ввели 4, и получается hashTable["4"] ="g:h:i:" и в Edit'е появляется буква g[если пользователь ничего не нажимал в течении секунды, то появляется ListBox со всеми вариантами слов, где можно выбрать нужное]
REASY Недопонял, какой помощи вы хотите? как ловить нажатия на цифровые кнопки? Или как заполнить массив ссылок на строки (n=n*10+key_n)?
оффтоп: (С) кто-то "если бы все силы которые тратят прогамисты на написание ноутпадов пустить в нужное русло..." то дальше там не помню что произойдет
пардон может быть слишком сложно изъясняюсь, но ознакомтесь что есмь структура MSG, на кой она нужна и какие функции с оной работают. ... ну например - поймать клавишу - ловить вм_кейдаун, написать в едите - кинуть ему по хендлу ту же структуру. или вы ждете что напишуть за вас ... зы: не думаю , если бы писали код представленный вами вручную - у вас бы возникли подобные проблемы. пардон.
Видели как работает Т-9, допустим, на Sony Ericsson(W700). Щелкая на цифры, мы набираем слова. Сама "ловля" нажатия и помешение его в EditBox дело не сказать что из трудных, но я ПРОЩУ помочь именно вывод в Edit слова, набранного с помощью цифровых клавиш. jhons Проблема не в том что есть struct MSG и какие функции с ней работают, а как ГРАМОТНО СДЕЛАТЬ ЭТОТ ВВОД. Допустим мы вводим 564236 424 3342 и у нас в Edit"е выводится:"привет как дела". tylerdurden Очень умно, видно можете заниматься только пустословием?!?! Или я не правильно вопрос задаю ?
n0name Сообщение ON_EN_CHANGE уже передает в Edit символ, нужно обрабатывать перед передачей символа.
REASY Если я правильно понял: есть список слов, каждому слову соответствует строка из цифр. Пользователь вводит х (где х - одна или больше цифр), и нужно найти все слова, цифровое представление которых начинается с x (никогда не видел T9, поэтому возможно повторяюсь). Если так, то hash table тебе ничего не даст, слова нужно организовывать в дерево. По сути ты имеешь дело с частным случаем префиксного кода и работать с ним надо точно так же, как и с любым другим.
Stiver Набору цифр соответствует слово или несколько слов. Находить эти слова не нужно. У нас имеется map hashTable. Мы просто собираем нажатые цифры(от пробела до пробела) и получаем прямой доступ к словам через индекс.
REASY винАПИ. Умозрительно. сабкласируете Едит контрол. В вашем обработчике ловите WM_CHAR (WM_KEYDOWN?) вынимаете из wParam очередную цифру, получаете новый вариант слова (предыдущие цифры хранить надо тоже или делать дерево или другой поиск), выделяете уже введеное (EM_SETSEL, EM_EXSETSEL), посылаете новый вариант (EM_REPLACESEL). Посылать или не посылать WM_CHAR в оригинальный едит проц - решайте сами, только цифру на букву поменять не забудьте. Во всех остальных случаях - оригинальный обработчик. У вас таблица, но ни в коем случае не хеш. Хеш подходит тут очень мало.