
Keyboard input [в COMBOBOX]
Модераторы: Duncon, Hawk, Romeo, Eugie
Да, с отправкой почты какие-то проблемы непонятного происхождения 

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

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

Даже самый дурацкий замысел можно воплотить мастерски
AiK, народ уже ответил на большую часть вопросов, так что я просто суммирую по пунктам:
1. Добавить обработку клавиатурных сообщений в оконную функцию.
Узнать, где фокус ввода: GetFocus()
2. Добавить обработчик - subclassing: пишешь свою процедуру, в которой обрабатываешь сообщения как тебе нужно, а все остальные посылаешь в старый обработчик через ф-цию CallWindowProc.
Дальше 2 варианта: либо регистрировать свой класс окна, либо подменять процедуру для конкретного окна.
Рекомендую 1-й:
- получить адрес старого обработчика: GetClassInfo(NULL, "COMBOBOX", &wndclass)
- установить новый:
- зарегистрить свой локальный комбобокс: RegisterClass(&wndclass).
Насчет того, что Up и Down работают как Esc - непонятно. Если фокус в поле связанном editbox - должны двигать каретку вперед-назад, если в списке - прокручивать вверх-вниз.
3. ??? - BackSpace в комбо (точнее, в связанном editbox) работает как обычно. Уж его точно перегружать не надо
4. Кракозябры - здесь комбо не при чем. Ищи другую причину...
1. Добавить обработку клавиатурных сообщений в оконную функцию.
Узнать, где фокус ввода: GetFocus()
2. Добавить обработчик - subclassing: пишешь свою процедуру, в которой обрабатываешь сообщения как тебе нужно, а все остальные посылаешь в старый обработчик через ф-цию CallWindowProc.
Дальше 2 варианта: либо регистрировать свой класс окна, либо подменять процедуру для конкретного окна.
Рекомендую 1-й:
- получить адрес старого обработчика: GetClassInfo(NULL, "COMBOBOX", &wndclass)
- установить новый:
Код: Выделить всё
wndclass.lpszClassName = "MYCOMBOBOX";
wndclass.lpfnWndProc = MyComboboxProc;
Насчет того, что Up и Down работают как Esc - непонятно. Если фокус в поле связанном editbox - должны двигать каретку вперед-назад, если в списке - прокручивать вверх-вниз.
3. ??? - BackSpace в комбо (точнее, в связанном editbox) работает как обычно. Уж его точно перегружать не надо

4. Кракозябры - здесь комбо не при чем. Ищи другую причину...
А как обычно?работает как обычно

Даже самый дурацкий замысел можно воплотить мастерски
Как обычно - при нажатии на BackSpace удаляется символ перед кареткой
Почему у тебя не работает - это есть биг квесчон.
Насчет Up/Down - на пустом списке не проверял, а на непустом - все правильно. А если фокус в поле ввода, что происходит?

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

Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Да, и задать среди прочих стиль WS_TABSTOP