Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: VC 6, MFC Webbrowser отлов событий элементов  (Прочитано 10890 раз)
0 Пользователей и 1 Гость смотрят эту тему.
mihailo
Интересующийся

ru
Offline Offline

« : 01-08-2016 19:48 » 

Здравствуйте. сразу скажу что опыта крохи. У меня проблема в следующем..Диалоговая форма, на ней АктивХ компонент веббраузера. В браузер загружается страничка с двумя селектами(списками). Мне необходимо отловить события при выборе значения в одном из них. Что я сделал... Как положено, я создал класс порожденный от CCmdTarget. В карту диспетчиризации добавил макрос и добавил функцию обработки void OnSelectClick()
Код:
DISP_FUNCTION_ID(my_Ctarget, 
    "HTMLSELECTELEMENTEVENTS_ONCHANGE",
    DISPID_HTMLSELECTELEMENTEVENTS_ONCHANGE,
    OnSelectClick,
    VT_EMPTY,
    VTS_NONE)
Дальше в основной программе в методе ::OnDocumentComplete создаю экземпляр объекта my_Ctarget,
и через функцию AfxConnectionAdvise() устанавливаю точку соединения для интерфейса DIID_HTMLSelectElementEvents.
Отлов события по выбору в select происходит, отрабатывает моя пользовательская функция OnSelectClick,но вопрос, а как же мне узнать с каким select пользователь работает(например получить идентификатор у тега select).?
p/s: Я так понимаю у моей функции должны быть какие то параметры, но при перечислении параметров в макросе событие перестает ловиться..

« Последнее редактирование: 01-08-2016 21:41 от Вад » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 01-08-2016 21:37 » 

mihailo, MSDN-справочник к VS2008 говорит, что onChange не имеет аргументов, а подробности о событии можно узнать так:
Цитата
The IHTMLEventObj interface contains additional information about the current event. When the onchange event is fired, you can use the IHTMLWindow2::event property to retrieve an IHTMLEventObj interface.
- то есть, надо вызывать
Код:
HRESULT IHTMLWindow2::get_event(IHTMLEventObj **p)
, чтобы получить интерфейс последнего события со всеми подробностями.

Гугление даёт другое, в онлайновом MSDN-e значится, что у onchange уже есть параметр IHTMLEventObj. Если так, в макросе параметр вписывать не следует, а вот к определению функции тогда его добавить надо.
Записан
mihailo
Интересующийся

ru
Offline Offline

« Ответ #2 : 02-08-2016 07:22 » 

Вад, а вот вопрос тогда возник, список передаваемых параметров(в моем случае VTS_NONE) он должен соответствовать параметрам в событии onchange event? то-есть я должен принять указатель на интерфейс pEvtObj [Тип: IHTMLEventObj], и только потом обработать в функции OnSelectClick?
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 02-08-2016 08:52 » 

mihailo, вообще, присмотрелся - да, список параметров должен соответствовать. Если таки прав старый MSDN, и параметров нет, то VTS_NONE и всё нормально. Если там IHTMLEventObj - не знаю точно, что там должно быть. Может, VTS_DISPATCH, или VTS_UNKNOWN, например.
« Последнее редактирование: 02-08-2016 08:54 от Вад » Записан
mihailo
Интересующийся

ru
Offline Offline

« Ответ #4 : 04-08-2016 18:49 » new

в общем, почитав немного делаю вывод что: в функцию обработчик, никакой дополнительной информации о событии  не передается(VTS_NONE). Чтобы узнать, что произошло, необходимо воспользоваться объектом event (тот самый интерфейс IHTMLEventObj), доступный через объект window (IHTMLWindow2) текущего документа. Осталось разобраться как получить выход на этот интерфейс из моей функции OnSelectClick.......

Добавлено через 5 дней, 35 минут и 27 секунд:
Подведу итог своих изысканий. Через объект класса производного от CCmdTarget я получаю событие(в моем случае HTMLSELECTELEMENTEVENTS_ONCHANGE). После чего вызывается функция обработчик. Чтобы получить всевозможные данные об источнике событий необходим интерфейс IHTMLEventObj. Его я получил используя полученный в конструкторе класса указатель на мой веббраузер. Ну а дальше по цепочке IHTMLDocument2->IHTMLWindow2->IHTMLEventObj. Вад! спасибо за помощь.
« Последнее редактирование: 09-08-2016 19:24 от mihailo » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines