Да, вспоминаю старые добрые времена и истошный крик в комнте клиентского отдела: кто реализовывал этот грёбаный 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.
Keyboard input [в COMBOBOX]
Модераторы: Duncon, Hawk, Romeo, Eugie
- Romeo
- Сообщения: 3091
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
1 и 2: Для этого нужно использоваться subclassing (например CContainedWindow::SubclassWindow)
3: Я тоже так думаю. Но это можно сделаться только с помощью всё того же сабклассинга.
3: Я тоже так думаю. Но это можно сделаться только с помощью всё того же сабклассинга.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Romeo, один маленкий деталь: раздел у нас отвлечённый от языка реализации. Т.е. мне твой пример ровным счётом ничего не говорит.
Даже самый дурацкий замысел можно воплотить мастерски
- Romeo
- Сообщения: 3091
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Подожди-ка, ты написал: "Как переопределить обработчик сообщений?". Значит речь всё-таки едёт о программном вмешательстве в COMBOBOX, а не о наборе тех хитростей, которыми может воспользоваться программер не закапываясь глубже редактора ресурсов и стилей окна А если у нас есть язык программирования - значит в любом случае есть понятие сабклассинга (не важно воспользуешься ты стандартными средствами готовых библиотек (MFC, ALT) или реализуешься всё ручками на Win32 API). если речь идёт о чистом Win32 API, то делается это так:
1. Получаем hWnd комбобокса.
2. Получаем с помощью GetWindowLong указатель на процедуру-обработчик и запоминаем её в переменной.
3. С помощью SetWindowLong устанавливаем новый обработчик, который должен выполнять некие специализированные действия, а потом вызывать старый обработчик заблаговременно сохранённый в промежуточной переменной.
Вот и всё.
1. Получаем hWnd комбобокса.
2. Получаем с помощью GetWindowLong указатель на процедуру-обработчик и запоминаем её в переменной.
3. С помощью SetWindowLong устанавливаем новый обработчик, который должен выполнять некие специализированные действия, а потом вызывать старый обработчик заблаговременно сохранённый в промежуточной переменной.
Вот и всё.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Romeo, уже ближе к телу, спасибо Но, если я правильно понимаю, твоё решение даёт две возможности: либо добавить обработку нажатия ещё каких-то клавиш (т.е. "потом вызывать старый обработчик заблаговременно сохранённый в промежуточной переменной"), либо переписывать обработку всех клавиш (т.е. старый обработчик не вызывать).
А мне как-то не улыбается реализовывать всё то, что уже итак реализовано. Типа ctrl+v, shift+insert и всякие другие комбинации, которые я даже не все и знаю Т.е. другими словами я хочу изменить обработку одного единственного уведомления и то не целиком, а с конкретным параметром. Например: "нажата клавиша VK_UP". Выхода не может не быть
А мне как-то не улыбается реализовывать всё то, что уже итак реализовано. Типа ctrl+v, shift+insert и всякие другие комбинации, которые я даже не все и знаю Т.е. другими словами я хочу изменить обработку одного единственного уведомления и то не целиком, а с конкретным параметром. Например: "нажата клавиша VK_UP". Выхода не может не быть
Даже самый дурацкий замысел можно воплотить мастерски
Чем не вариант? В MSDN на эту тему и пример хорший есть (на С++).добавить обработку нажатия ещё каких-то клавиш (т.е. "потом вызывать старый обработчик заблаговременно сохранённый в промежуточной переменной")
GetFocus()как узнать какой конкретно контрол в данный момент имеет фокус
ЗЫ. Вообще можно назначить Up горячей клавишей и в обратотчике проверять какре окно имеет фокус - а там по обстоятельствам.
Да тем, что старый обработчик выполнит то самое действие, которое я хочу заменить. Или я не прав?Чем не вариант?
Даже самый дурацкий замысел можно воплотить мастерски
Для действия, которое заменяешь просто не вызывай старую WindowProc. А для всего остального вызывай по умолчанию.
Но тут по-моему и без субклассинга можно обойтись.
Но тут по-моему и без субклассинга можно обойтись.
ЗЫ.
Вот что мне только что форум показал.
Failed sending email :: PHP ::
DEBUG MODE
Line : 234
File : /home/developingru/www/forum/includes/emailer.php
ЗЫЗЫ. Кстати, как только мыло сменил уведомления стали опять приходить. Дело точно было в мыле
Вот что мне только что форум показал.
Failed sending email :: PHP ::
DEBUG MODE
Line : 234
File : /home/developingru/www/forum/includes/emailer.php
ЗЫЗЫ. Кстати, как только мыло сменил уведомления стали опять приходить. Дело точно было в мыле
М-да. Понедельник день тяжёлый . Тормозю со страшной силой. Кстати, а почему это всё субклассингом называется? Причём тут классы вообще?Для действия, которое заменяешь просто не вызывай старую WindowProc.
Даже самый дурацкий замысел можно воплотить мастерски