2009-07-22 2 views
0

В моем расширении IE я пытаюсь получить координаты экрана элемента в C++/MSHTML. С моей IHTMLDocument2, я следующее:getBoundingClientRect IHTMLElement2 - расширение IE

IHTMLDocument2:: pDoc->get_all(&pElemColl); 
IHTMLElementCollection::pElemColl->item(varID, varIdx, &pElemDisp); 

где

_variant_t varID = ("myID", VT_BSTR); 
//myID is the tag name of the element I'm trying to get. In this case it it an id of a input field 
//I've also tried getting bounded area of div's and textarea 
_variant_t varIdx = (0, VT_I4); 

затем

IDispatch::pElemDisp->QueryInterface(IID_IHTMLElement, (void**) &pElem); 
IHTMLElement::pElem->QueryInterface(IID_IHTMLElement2, (void**) &pElem2); 
IHTMLElement2::pElem2->getBoundingClientRect(&childRect);//Defined as IHTMLRect *childRect; 

Для каждого запроса, который я сделал, я проверил возвращаемое значение гарантии того, что его S_OK. Вызов getBoundingClientRect также успешный, т. Е. Возвращает S_OK, но все компоненты childRect (например, сверху, снизу, слева, справа) возвращают 0. Я не ошибаюсь. Есть идеи?

Редактировать: Я преобразовал координаты, которые я получаю из getBoundingClientRect, в координаты экрана. Таким образом, координата, которую я получаю для верхнего левого, соответствует верхнему левому углу моего окна IE, а координаты для нижнего правого то же самое, что и верхний левый. Это происходит для любого элемента DOM на странице. Например, на странице «Задать вопрос» stackoverflow, если я попытаюсь получить ограничивающие координаты для идентификатора текстового поля: wmd-input (большой квадрат, где вы описываете вопрос), я получаю тот же результат, что и выше.

+0

Имеет ли это значение, когда вы это называете? Возможно, у документа не было возможности полностью выложить? – EricLaw

+0

Нет, я вызываю его после того, как документ полностью загружен. т. е. я называю этот фрагмент кода своей функцией OnDocumentComplete() – GotAmye

ответ

0

Оказывается, лучший способ получить элемент по его идентификатору является использование IHTMLDocument3 :: getElementById все хорошо!

0

Обновление: если я получаю активный элемент на странице, вызывая IHTMLDocument2 :: get_activeElement, а затем вызываю get_BoundingClientRect, то полученные координаты верны. Итак, вопрос в том, как получить координату неактивного элемента (т. Е. Получить координаты элемента по его id) на странице - потому что, как упоминалось в моей предыдущей статье, код I попробуйте только вернуть мне координаты верхнего левого угла окна IE. Вот что я делаю сейчас:

IHTMLDocument2:: pDoc->get_activeElement(&pElement); 
IHTMLElement:: pElement->QueryInterface(IID_IHTMLElement2, (void**) &pElem2); 
IHTMLElement2::pElem2->getBoundingClientRect(&childRect);//Defined as IHTMLRect *childRect; 
//The co-ordinates that get's returned is absolutely correct 
Смежные вопросы