Keyboard input [в COMBOBOX]

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

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

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

22 апр 2004, 15:45

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

22 апр 2004, 16:48

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

26 апр 2004, 16:16

Rebar ты имел в виду, наверное
Да нет, если я вызываю CreateWindowEx c именем класса TOOLBARCLASSNAME aka ToolbarWindow32, то вряд ли тулбар ребаром становится.

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

27 апр 2004, 12:29

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

27 апр 2004, 12:38

Romeo, См. MSDN. В статье про тулбары есть раздел: Embedding Nonbutton Controls in Toolbars. В двух словах - под окно резервируется место тулбаровым сепаратором, и поверх него кладётся это окно.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

27 апр 2004, 12:40

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

15 авг 2004, 03:10

Опять возвращаюсь к своим баранам :(

Казалось бы нашёл решение, которое, увы, полечило не совсем все проблемы.

К сожалению, всё кухню понимаю о-о-чень приблизительно, поэтому объясняю на пальцах:
мой комбик живёт внутри IE. Т.е. моё приложение - это COM объект, реализующий несколько обязательных интерфейсов.
В данном случае, интерес представляет метод TranslateAcceleratorIO интерфейса IInputObject. Соответственно у меня нет привычного цикла

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

while (GetMessage()) do
begin
    TranslateMessage();
    DispatchMessage();
end;
Зато IE вызывает мой метод TranslateAcceleratorIO в своём подобном цикле.

Опытным путём я установил, что я должен транслировать и диспетчеризовать нажатие клавиш типа VK_DELETE, VK_INSERT и т.п. чтобы мой комбик нормально обрабатывал стандартные сочетания вроде shift-insert, ctrl-insert, ctrl-c, ctrl-v, ctrl-x и т.д.

Итого, у меня есть такая имплементация TranslateAcceleratorIO :

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

if (lpMsg.WParam in [VK_BACK,
                      VK_ESCAPE,
                      VK_LEFT,
                      VK_RIGHT,
                      VK_HOME,
                      VK_END,
                      VK_UP,
                      VK_DOWN,
                      VK_DELETE,
                      VK_INSERT,
                      VK_RETURN,
                      VK_CONTROL])  then begin
    TranslateMessage(lpMSg);
    DispatchMessage(lpMsg);
    Result := S_OK;
  end
  else
  begin
  Result := S_FALSE;
  end;
end;
Всё вроде бы работает как надо. За исключением единственного сочетания ctrl-c.
Это меня просто убивает: ctrl-x работает, ctrl-insert тоже, а ctrl-c - не желает.
Как бы это печальное событие отрихтовать?

Да, вот ещё нашли такое сочетание: ctrl+back. Должно удалять последнее введённое слово... Тоже не пашет :(
И где бы полный список глянуть всех этих сочетаний?

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

15 авг 2004, 14:19

Нашёл затычку: ловлю конструкцию CTRL+C и отправляю комбику WM_COPY. Чую, что бесовщина, а обосновать не могу © :(
Даже самый дурацкий замысел можно воплотить мастерски
Ответить