Keyboard input [в COMBOBOX]

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

19 апр 2004, 15:30

Да, с отправкой почты какие-то проблемы непонятного происхождения :(
Даже самый дурацкий замысел можно воплотить мастерски
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

19 апр 2004, 17:13

Кстати, а почему это всё субклассингом называется? Причём тут классы вообще?
В том смысле, что ты модифицируешь зарегистрированные классы окон типа "combobox".

Тут, думаю, можно сделать и попроще - через акселераторы например.
Хотя субклассинг - здесь "хороший тон" (видимо).
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

20 апр 2004, 11:30

Да именно "хороший тон". Тем более в Винде предусмотрена специальная функция для вызова старого обработчика, значит это - "классический" приём.

P.S. А при ответе на форуме действительно вылазят какие-то лаги. Aik - разберись :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

20 апр 2004, 12:03

А при ответе на форуме действительно вылазят какие-то лаги
Эт вчера было. А сегодня ты ещё и не отвечал :)
Даже самый дурацкий замысел можно воплотить мастерски
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

20 апр 2004, 18:37

AiK, народ уже ответил на большую часть вопросов, так что я просто суммирую по пунктам:

1. Добавить обработку клавиатурных сообщений в оконную функцию.

Узнать, где фокус ввода: GetFocus()

2. Добавить обработчик - subclassing: пишешь свою процедуру, в которой обрабатываешь сообщения как тебе нужно, а все остальные посылаешь в старый обработчик через ф-цию CallWindowProc.

Дальше 2 варианта: либо регистрировать свой класс окна, либо подменять процедуру для конкретного окна.

Рекомендую 1-й:
- получить адрес старого обработчика: GetClassInfo(NULL, "COMBOBOX", &wndclass)
- установить новый:

Код: Выделить всё

     wndclass.lpszClassName = "MYCOMBOBOX";
     wndclass.lpfnWndProc = MyComboboxProc; 
- зарегистрить свой локальный комбобокс: RegisterClass(&wndclass).

Насчет того, что Up и Down работают как Esc - непонятно. Если фокус в поле связанном editbox - должны двигать каретку вперед-назад, если в списке - прокручивать вверх-вниз.

3. ??? - BackSpace в комбо (точнее, в связанном editbox) работает как обычно. Уж его точно перегружать не надо :)

4. Кракозябры - здесь комбо не при чем. Ищи другую причину...
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

20 апр 2004, 18:51

работает как обычно
А как обычно? :) У меня он просто не работает. UP и Down работают как ESC, если в списке ничего нет, и начинают переходить на предыдущий/следующий элементы списка, если он не пуст.
Даже самый дурацкий замысел можно воплотить мастерски
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

20 апр 2004, 19:06

Как обычно - при нажатии на BackSpace удаляется символ перед кареткой :) Почему у тебя не работает - это есть биг квесчон.
Насчет Up/Down - на пустом списке не проверял, а на непустом - все правильно. А если фокус в поле ввода, что происходит?
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

21 апр 2004, 12:46

Кстати, ещё вопрос: как заставить этот COMBOBOX получить фокус при перемещении TAB'ом? Типа TABSTOP ему выставить. И, раз уж пошла такая пьянка, заодно как порядок обхода задаётся?
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

21 апр 2004, 16:24

Порядком расположения элементов диалога в rc файле :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

21 апр 2004, 16:46

Да, и задать среди прочих стиль WS_TABSTOP
Ответить