Может кто-нибудь объяснить пункт "Creating the Find Control":
http://msdn.microsoft.com/en-us/library/bb983718.aspx
В частности проблема в том, что не вызываются PreTranslateMessage для CFindComboBox. Вообще никакие события не вызываются. Лучше всего было бы, если бы кто-то смог набросать весь код по этому гайду. При необходимости могу выдать свою версию. Заранее спасибо.
Здравствуйте, Kernel0, Вы писали:
K>Может кто-нибудь объяснить пункт "Creating the Find Control":
K>http://msdn.microsoft.com/en-us/library/bb983718.aspx
K>В частности проблема в том, что не вызываются PreTranslateMessage для CFindComboBox. Вообще никакие события не вызываются. Лучше всего было бы, если бы кто-то смог набросать весь код по этому гайду. При необходимости могу выдать свою версию. Заранее спасибо.
Столкнулся я с этой проблемой.
ИМХО — тут баги M$
Решил ее таким образом:
Сделал (в моем проекте) класс-наследник от CMFCToolBar, в нем я создал таймер, по которому опрашивается этот самый ComboBox. Если были изменения, то посылается сообщение головному окну.
З.Ы. Согласен, с критикой, что решение некрасивое. Зато — работоспособное
Никакими другими способами решить проблему, к сожалению, не удалось.
Здравствуйте, Carc, Вы писали:
C>Здравствуйте, Kernel0, Вы писали:
K>>Может кто-нибудь объяснить пункт "Creating the Find Control":
K>>http://msdn.microsoft.com/en-us/library/bb983718.aspx
K>>В частности проблема в том, что не вызываются PreTranslateMessage для CFindComboBox. Вообще никакие события не вызываются. Лучше всего было бы, если бы кто-то смог набросать весь код по этому гайду. При необходимости могу выдать свою версию. Заранее спасибо.
C>Курить статью Блуждания по лабиринту маршрутизации сообщений и команд в MFCАвтор(ы): Поль ДиЛашиа (Paul DiLascia)
В статье даётся исчерпывающее описание механизмов маршрутизации сообщений и команд в MFC. Автор прослеживает путь сообщения с момента получения и до попадания в соответствующий обработчик, объясняет механизм работы карт сообщений, обработку команд и уведомлений, а также обновление объектов пользовательского интерфейса при помощи сообщений CN_UPDATE_COMMAND_UI. Прочитав статью, вы сможете решить практически любую проблему, связанную с обработкой сообщений в MFC.
и все заработает. Проверено.
Курить статью? Значит гайд написан неправильно? Вы проверяли данную статью конкретно под эту задачу?
Здравствуйте, Kernel0, Вы писали:
K>Здравствуйте, Carc, Вы писали:
C>>Здравствуйте, Kernel0, Вы писали:
K>>>Может кто-нибудь объяснить пункт "Creating the Find Control":
K>>>http://msdn.microsoft.com/en-us/library/bb983718.aspx
K>>>В частности проблема в том, что не вызываются PreTranslateMessage для CFindComboBox. Вообще никакие события не вызываются. Лучше всего было бы, если бы кто-то смог набросать весь код по этому гайду. При необходимости могу выдать свою версию. Заранее спасибо.
C>>Курить статью Блуждания по лабиринту маршрутизации сообщений и команд в MFCАвтор(ы): Поль ДиЛашиа (Paul DiLascia)
В статье даётся исчерпывающее описание механизмов маршрутизации сообщений и команд в MFC. Автор прослеживает путь сообщения с момента получения и до попадания в соответствующий обработчик, объясняет механизм работы карт сообщений, обработку команд и уведомлений, а также обновление объектов пользовательского интерфейса при помощи сообщений CN_UPDATE_COMMAND_UI. Прочитав статью, вы сможете решить практически любую проблему, связанную с обработкой сообщений в MFC.
и все заработает. Проверено.
K>Курить статью? Значит гайд написан неправильно? Вы проверяли данную статью конкретно под эту задачу?
Я новым мфсями сори, не пользовался. Возможно я поторопился и упустил из виду новый CMFCToolBar — он же реально другой. Но по этой статье я много раз лично приделывал маршрутизацию к собственным левым наследникам от CControlBar, и именно по этой статье, но для старой MFC (без этого нового, прикупленого микрософтом codepack`а с модными контролами). Так что думаю статья в любом случае полезна будет.
Внимательно бы надо посмотреть следующее: переопределить где то у себя OnCmdMsg (либо в своем CMFCToolBar-наследнике, либо если возможно в наследнике CFindComboBox) и посмотреть придирчиво вызывается ли она вообще, и или иногда (ну к примеру когда фокус на этом списке). Обычно такое копание в нужном направлении приводит.
Здравствуйте, Carc, Вы писали:
C>Я новым мфсями сори, не пользовался. Возможно я поторопился и упустил из виду новый CMFCToolBar — он же реально другой. Но по этой статье я много раз лично приделывал маршрутизацию к собственным левым наследникам от CControlBar, и именно по этой статье, но для старой MFC (без этого нового, прикупленого микрософтом codepack`а с модными контролами). Так что думаю статья в любом случае полезна будет.
Я пользуюсь новыми мфсями уже более двух лет. Проблема, которую описал ТС, имеется. Именно тут авторы что-то недосмотрели. Мой вариант workaround-а я указывал выше. Пробовал по-разному, однако удалось только то брутальное решение, которое я применил.
Буду рад, если ты предложишь что-то более удачное. Отсылка к "букварям" по MFC и WinAPI не в счет
Кстати, насчет CControlBar — не в тему, так как он остался за бортом MFC Feature Pack (новый пакет контролов, который ты называешь "новым мфсями"). Этот MFC Feature Pack, ИМХО, сделан по принципу и подобию BCGControlBar Library.
C>Внимательно бы надо посмотреть следующее: переопределить где то у себя OnCmdMsg (либо в своем CMFCToolBar-наследнике, либо если возможно в наследнике CFindComboBox) и посмотреть придирчиво вызывается ли она вообще, и или иногда (ну к примеру когда фокус на этом списке). Обычно такое копание в нужном направлении приводит.
Так как OnCmdMsg имеется в потомках CCmdTarget, а здесь идет речь о CMFCToolBarComboBoxButton (или его потомках), которые не являются потомками от CCmdTarget, то тут, к сожалению, переопределение виртуального метода OnCmdMsg нам ничем не поможет.
В общем, я воспользовался PreTranslateMessage для тулбара (наследника CMFCToolBar), на который ставится кнопка — через него проходят нажатия клавиш комбо-бокса. Сделал через него горячие клавиши Копировать-Вставить и т.п. с клавиатуры. Заодно отпала необходимость в CFindComboBox — используется встроенный в CMFCToolBarComboBoxButton комбо-бокс.
Здравствуйте, Kernel0, Вы писали:
K>Может кто-нибудь объяснить пункт "Creating the Find Control":
K>http://msdn.microsoft.com/en-us/library/bb983718.aspx
K>В частности проблема в том, что не вызываются PreTranslateMessage для CFindComboBox. Вообще никакие события не вызываются. Лучше всего было бы, если бы кто-то смог набросать весь код по этому гайду. При необходимости могу выдать свою версию. Заранее спасибо.
Там в описании ошибка.
Метод CreateCombo класса CFindComboButton должен вернуть инстанс класса CFindComboBox.
Сам класс CMFCToolBarComboBoxButton не является UI-ным, он просто содержит параметры для создания и управления комбиком.
После того, как объект этого класса будет "уложен" на тулбар (ReplaceButton), тулбар создаст инстанс CFindComboBox через вызов CreateCombo, и далее этот объект начнет получать PreTranslateMessage.