2009-07-22 6 views
0

Dans mon extension IE, j'essaie d'obtenir les coordonnées de l'écran d'un élément en C++/MSHTML. De mon IHTMLDocument2, je fais ce qui suit:getBoundingClientRect IHTMLElement2 - Extension 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); 

puis

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

Pour chaque requête que je l'ai fait, je l'ai vérifié la valeur de retour assurant que son S_OK. L'appel à getBoundingClientRect réussit également, c'est-à-dire qu'il renvoie S_OK, mais tous les composants de childRect (c'est-à-dire top, bottom, left, right) renvoient 0. Je ne sais pas ce qui s'est mal passé. Des idées? Editer: J'ai converti les coordonnées que j'obtiens de getBoundingClientRect en coordonnées d'écran. Donc la coordonnée que je reçois pour le coin supérieur gauche correspond au coin en haut à gauche de ma fenêtre IE, et les coordonnées pour le coin inférieur droit sont les mêmes qu'en haut à gauche. Cela arrive pour n'importe quel élément DOM de la page. Par exemple, dans la page "Poser une question" de stackoverflow, si j'essaie d'obtenir des coordonnées de délimitation pour l'identifiant de textbox: wmd-input (la grosse boîte où vous décrivez la question), j'obtiens le même résultat que précédemment.

+0

Est-ce important quand vous l'appelez? Peut-être que le document n'a pas encore eu l'occasion d'être entièrement exposé? – EricLaw

+0

Non, je l'appelle après le chargement complet du document. c'est-à-dire que j'appelle ce morceau de code dans ma fonction OnDocumentComplete() – GotAmye

Répondre

0

fin de compte, la meilleure façon d'obtenir un élément par son id est d'utiliser IHTMLDocument3 :: getElementById ALL est bien!

0

Mise à jour: Si j'obtiens l'élément actif dans la page en appelant IHTMLDocument2 :: get_activeElement, puis appelez get_BoundingClientRect, les coordonnées que je reçois sont correctes. Donc la question est maintenant, comment aurais-je obtenir la coordonnée d'un élément non-actif (c.-à-d., Obtenir les coordonnées d'un élément par son id) dans une page - parce que, comme mentionné dans mon post précédent, le code I essayez seulement me renvoie les coordonnées du coin supérieur gauche de la fenêtre IE. Voici ce que je fais maintenant:

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