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. Если Вас заинтересует данная тема, пишите, продолжим.