Keyboard input [в COMBOBOX]

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

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

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

18 апр 2004, 14:50

Да, вспоминаю старые добрые времена и истошный крик в комнте клиентского отдела: кто реализовывал этот грёбаный COMBOBOX?
Хотя я тоже задавюсь подобным вопросом, но больше меня интересуют ответы на несколько другие вопросы :) , а именно:

1. Как добавить обработчик нажатий клавиш? WM_KEYDOWN это конечно здорово, но если родительское окно, которое получает это сообщение, содержит несколько контролов способных получать keyboard input, то как узнать какой конкретно контрол в данный момент имеет фокус?

2. Как переопределить обработчик? В частности клавиши up и down ведут себя как ESC в нормальных контролах, что не радует

3. Обработка BackSpace - нужно откусывать по одному последнему символу или есть варианты? Вообще непонятно почему Del по умолчанию реализована, а BackSpace - нет...

4. Возможно с не совсем к keyboard input относится, но всё же: иногда самое первое значение, вводимое в COMBOBOX кириллицей отображается гречкой различной...

Спасибо за наставления на путь истинный.

З.Ы: комбик создаю при помощи CreateWindow со стилями
WS_CHILD WS_VISIBLE CBS_DROPDOWN CBS_AUTOHSCROLL и WS_VSCROLL.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

18 апр 2004, 17:07

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

19 апр 2004, 01:26

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

19 апр 2004, 13:13

Подожди-ка, ты написал: "Как переопределить обработчик сообщений?". Значит речь всё-таки едёт о программном вмешательстве в COMBOBOX, а не о наборе тех хитростей, которыми может воспользоваться программер не закапываясь глубже редактора ресурсов и стилей окна :) А если у нас есть язык программирования - значит в любом случае есть понятие сабклассинга (не важно воспользуешься ты стандартными средствами готовых библиотек (MFC, ALT) или реализуешься всё ручками на Win32 API). если речь идёт о чистом Win32 API, то делается это так:
1. Получаем hWnd комбобокса.
2. Получаем с помощью GetWindowLong указатель на процедуру-обработчик и запоминаем её в переменной.
3. С помощью SetWindowLong устанавливаем новый обработчик, который должен выполнять некие специализированные действия, а потом вызывать старый обработчик заблаговременно сохранённый в промежуточной переменной.

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

19 апр 2004, 13:45

Romeo, уже ближе к телу, спасибо :) Но, если я правильно понимаю, твоё решение даёт две возможности: либо добавить обработку нажатия ещё каких-то клавиш (т.е. "потом вызывать старый обработчик заблаговременно сохранённый в промежуточной переменной"), либо переписывать обработку всех клавиш (т.е. старый обработчик не вызывать).
А мне как-то не улыбается реализовывать всё то, что уже итак реализовано. Типа ctrl+v, shift+insert и всякие другие комбинации, которые я даже не все и знаю :) Т.е. другими словами я хочу изменить обработку одного единственного уведомления и то не целиком, а с конкретным параметром. Например: "нажата клавиша VK_UP". Выхода не может не быть :)
Даже самый дурацкий замысел можно воплотить мастерски
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

19 апр 2004, 14:20

добавить обработку нажатия ещё каких-то клавиш (т.е. "потом вызывать старый обработчик заблаговременно сохранённый в промежуточной переменной")
Чем не вариант? В MSDN на эту тему и пример хорший есть (на С++).
как узнать какой конкретно контрол в данный момент имеет фокус
GetFocus()

ЗЫ. Вообще можно назначить Up горячей клавишей и в обратотчике проверять какре окно имеет фокус - а там по обстоятельствам.
Аватара пользователя
AiK
Сообщения: 2271
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

19 апр 2004, 14:27

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

19 апр 2004, 15:08

Для действия, которое заменяешь просто не вызывай старую WindowProc. А для всего остального вызывай по умолчанию.

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

19 апр 2004, 15:10

ЗЫ.

Вот что мне только что форум показал.

Failed sending email :: PHP ::

DEBUG MODE

Line : 234
File : /home/developingru/www/forum/includes/emailer.php

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

19 апр 2004, 15:12

Для действия, которое заменяешь просто не вызывай старую WindowProc.
М-да. Понедельник день тяжёлый :) . Тормозю со страшной силой. Кстати, а почему это всё субклассингом называется? Причём тут классы вообще?
Даже самый дурацкий замысел можно воплотить мастерски
Ответить