在我的IE扩展中,我试图获得C ++ / MSHTML中元素的屏幕坐标。从我的IHTMLDocument2,我执行以下操作:
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的所有组件(即top,bottom,left,right)都返回0.我不会出错。有什么想法吗?
编辑:我将从getBoundingClientRect得到的坐标转换为Screen坐标。因此,左上角的坐标对应于IE窗口的左上角,右下角的坐标与左上角的坐标相同。对于页面中的任何DOM元素都会发生这种情况。例如,在stackoverflow的“Ask Question”页面中,如果我尝试获取文本框id:wmd-input(您描述问题的大框)的边界坐标,我得到的结果与上面指定的相同。
答案 0 :(得分: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
答案 1 :(得分:0)
事实证明,通过id获取元素的最佳方法是使用IHTMLDocument3 :: getElementById 一切都很好!