Jenter Алекс
Шрифт:
Рассмотрим еще раз прототип функции обработчика
В качестве id передается значение которое мы указали при регистрации обработчика. Это может пригодиться если мы захотим реализовать обработку нескольких событий в одной функции. Для этого нужно зарегистрировать одну и ту же функцию с разными DISPID, тогда по приходу событий мы сможет их различать.
pVarResult нужно, если не требуется обработки по умолчанию. При этом достаточно в pVarResult вернуть VARIANT_FALSE.
Итак, когда вызывается наш обработчик никакой дополнительной информации о событии в функцию не передается. А как же тогда поподробнее узнать, что произошло? Для этого необходимо воспользоваться интерфейсом IHTMLEventObj, доступным через объект window текущего документа. Посредством этого интерфейса можно получить подробную информацию о произошедшем событии, например, элемент, послуживший источником событий, состояние клавиш, местоположение курсора мыши и состояние ее кнопок.
Вот его краткое описание из MSDN:
Методы IHTMLEventObj
get_altKey | Состояние клавиши Alt |
get_button | Возвращает информацию о нажатых кнопках мыши |
get_cancelBubble | Возвращает будет ли продолжена обработка события вверх по иерархии обработчиков |
get_clientX | Возвращает горизонтальную позицию курсора мыши относительно клиентской области окна |
get_clientY | Возвращает вертикальную позицию курсора мыши относительно клиентской области окна |
get_ctrlKey | Состояние клавиши Ctrl |
get_fromElement | Возвращает указатель на интерфейс IHTMLElement позволяющий получить доступ к элементу с которого "ушел" курсор мыши при событиях onmouseover или onmouseout. |
get_keyCode | Возвращает код нажатой клавиши |
get_offsetX | Возвращает горизонтальную позицию курсора относительно контейнера элемента |
get_offsetY | Возвращает позицию курсора относительно контейнера элемента |
get_qualifier | Возвращает идентификатор события |
get_reason | Возвращает состояние передачи данных для объекта источника данных |
get_returnValue | Возвращаемое значение события или диалога |
get_screenX | Горизонтальная координата относительно координат экрана |
get_screenY | Вертикальная координата относительно координат экрана |
get_shiftKey | Состояние клавиши Shift |
get_srcElement | Возвращает указатель на интерфейс IHTMLElement послуживший источником событий |
get_srcFilter | Возвращает объект фильтр возбудивший событие onfilterchange |
get_toElement | Возвращает указатель на интерфейс IHTMLElement позволяющий получить доступ к элементу с на который "пришел" курсор мыши при событиях onmouseover или onmouseout |
get_type | Возвращает строковое название события |
get_x | Возвращает горизонтальную позицию мыши относительно родительского объекта в иерархии, позиционированного с помощью атрибутов CSS |
get_y | Возвращает вертикальную позицию мыши относительно родительского объекта в иерархии, позиционированного с помощью атрибутов CSS |
put_cancelBubble | Задать будет ли продолжена обработка события вверх по иерархии обработчиков |
put_keyCode | Задать код нажатой клавиши |
put_returnValue | Задать возвращаемое событием значение |
Стоит заметить, что интерфейс IHTMLEventObj доступен только на время обработки конкретного события. При этом не все свойства в контексте определенного события имеют смысл. Например, значения возвращаемые функциями get_fromElement и get_toElement доступны только при обработке событий мыши onmouseover и onmouseout.
В следующем примере в обработчике обределяется нажатая клавиша и выводится соответствующее диалоговое окно. Если была нажата клавиша Enter, то дальнейшая обработка отменяется.
Чтобы собрать воедино все фрагменты приведу небольшой пример (event.zip). Запустите его и выберите команду меню Event\OnKeydown. Теперь понажимайте клавиши внутри страницы. И посмотрите, что из этого получится. В этом примере регистрируется только один обработчик, но я думаю дочитав эту статью вы без труда сможете реализовать любой другой.
В заключение хочется заметить, что в этой статье я затронул только один небольшой аспект использования элемента WebBrowser. Если Вас заинтересует данная тема, пишите, продолжим.