Вход/Регистрация
Программирование на Visual C++. Архив рассылки
вернуться

Jenter Алекс

Шрифт:

Рассмотрим еще раз прототип функции обработчика

OnEvent(DISPID id, VARIANT* pVarResult);

В качестве 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, то дальнейшая обработка отменяется.

void CMyHtmlView::OnKeyDown(DISPID id, VARIANT* pVarResult) {

 HRESULT hr;

 LPDISPATCH pDispatch = GetHtmlDocument;

 if (pDispatch != NULL) {

IHTMLDocument2* pHtmlDoc;

hr = pDispatch->;

QueryInterface(__uuidof( IHTMLDocument2), (void**)&pHtmlDoc);

IHTMLWindow2* pWindow;

IHTMLEventObj* pEvent;

hr = pHtmlDoc->get_parentWindow(&pWindow);

ASSERT(SUCCEEDED(hr));

hr = pWindow->get_event(&pEvent);

ASSERT(SUCCEEDED(hr));

// Определяем нажатую клавишу

long nKey;

hr = pEvent->get_keyCode(&nKey);

ASSERT(SUCCEEDED(hr));

// Если Enter не хотим обрабатывать дальше

if (nKey == VK_RETURN) {

V_VT(pVarResult) = VT_BOOL;

V_BOOL(pVarResult) = FALSE;

}

pDispatch->Release;

pWindow->Release;

pEvent->Release;

pHtmlDoc->Release;

CString sMes;

sMes.Format("CEventView::OnKeyDown(DISPID = %d)\nKeyCode: %d", id, nKey);

AfxMessageBox(sMes);

 }

}

В заключение

Чтобы собрать воедино все фрагменты приведу небольшой пример (event.zip). Запустите его и выберите команду меню Event\OnKeydown. Теперь понажимайте клавиши внутри страницы. И посмотрите, что из этого получится. В этом примере регистрируется только один обработчик, но я думаю дочитав эту статью вы без труда сможете реализовать любой другой.

В заключение хочется заметить, что в этой статье я затронул только один небольшой аспект использования элемента WebBrowser. Если Вас заинтересует данная тема, пишите, продолжим.

  • Читать дальше
  • 1
  • ...
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: