Страница 1 из 3
Keyboard input [в COMBOBOX]
Добавлено: 18 апр 2004, 14:50
AiK
Да, вспоминаю старые добрые времена и истошный крик в комнте клиентского отдела: кто реализовывал этот грёбаный 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.
Добавлено: 18 апр 2004, 17:07
Romeo
1 и 2: Для этого нужно использоваться subclassing (например CContainedWindow::SubclassWindow)
3: Я тоже так думаю. Но это можно сделаться только с помощью всё того же сабклассинга.
Добавлено: 19 апр 2004, 01:26
AiK
Romeo, один маленкий деталь: раздел у нас отвлечённый от языка реализации. Т.е. мне твой пример ровным счётом ничего не говорит.
Добавлено: 19 апр 2004, 13:13
Romeo
Подожди-ка, ты написал: "Как переопределить обработчик сообщений?". Значит речь всё-таки едёт о программном вмешательстве в COMBOBOX, а не о наборе тех хитростей, которыми может воспользоваться программер не закапываясь глубже редактора ресурсов и стилей окна

А если у нас есть язык программирования - значит в любом случае есть понятие сабклассинга (не важно воспользуешься ты стандартными средствами готовых библиотек (MFC, ALT) или реализуешься всё ручками на Win32 API). если речь идёт о чистом Win32 API, то делается это так:
1. Получаем hWnd комбобокса.
2. Получаем с помощью GetWindowLong указатель на процедуру-обработчик и запоминаем её в переменной.
3. С помощью SetWindowLong устанавливаем новый обработчик, который должен выполнять некие специализированные действия, а потом вызывать старый обработчик заблаговременно сохранённый в промежуточной переменной.
Вот и всё.
Добавлено: 19 апр 2004, 13:45
AiK
Romeo, уже ближе к телу, спасибо

Но, если я правильно понимаю, твоё решение даёт две возможности: либо добавить обработку нажатия ещё каких-то клавиш (т.е. "потом вызывать старый обработчик заблаговременно сохранённый в промежуточной переменной"), либо переписывать обработку всех клавиш (т.е. старый обработчик не вызывать).
А мне как-то не улыбается реализовывать всё то, что уже итак реализовано. Типа ctrl+v, shift+insert и всякие другие комбинации, которые я даже не все и знаю

Т.е. другими словами я хочу изменить обработку
одного единственного уведомления и то не целиком, а с конкретным параметром. Например: "нажата клавиша VK_UP". Выхода не может не быть

Добавлено: 19 апр 2004, 14:20
Andy
добавить обработку нажатия ещё каких-то клавиш (т.е. "потом вызывать старый обработчик заблаговременно сохранённый в промежуточной переменной")
Чем не вариант? В MSDN на эту тему и пример хорший есть (на С++).
как узнать какой конкретно контрол в данный момент имеет фокус
GetFocus()
ЗЫ. Вообще можно назначить Up горячей клавишей и в обратотчике проверять какре окно имеет фокус - а там по обстоятельствам.
Добавлено: 19 апр 2004, 14:27
AiK
Чем не вариант?
Да тем, что старый обработчик выполнит то самое действие, которое я хочу заменить. Или я не прав?
Добавлено: 19 апр 2004, 15:08
Andy
Для действия, которое заменяешь просто не вызывай старую WindowProc. А для всего остального вызывай по умолчанию.
Но тут по-моему и без субклассинга можно обойтись.
Добавлено: 19 апр 2004, 15:10
Andy
ЗЫ.
Вот что мне только что форум показал.
Failed sending email :: PHP ::
DEBUG MODE
Line : 234
File : /home/developingru/www/forum/includes/emailer.php
ЗЫЗЫ. Кстати, как только мыло сменил уведомления стали опять приходить. Дело точно было в мыле

Добавлено: 19 апр 2004, 15:12
AiK
Для действия, которое заменяешь просто не вызывай старую WindowProc.
М-да. Понедельник день тяжёлый

. Тормозю со страшной силой. Кстати, а почему это всё субклассингом называется? Причём тут классы вообще?