Координаты tab элемента (IHTMLLIElement)
От: Alexxx  
Дата: 29.10.07 07:40
Оценка:
Народ, подскажите плз.

Есть таб элемент (например на www.microsoft.com: Highlights, Latest releases, Using your computer, ..)
Задача получить координаты элементов (Highlights, Latest releases, Using your computer, .. и координаты вложынных элементов в закладках)
Функция для получения координат:



pDoc2 - указатель на документ фрейма, содержащего элемент
pElement - указатель на искомый  элемент
Text - текст ссылки

void CExplorerWindow::GetLinkRect(CComPtr<IHTMLDocument2> pDoc2, CComQIPtr<IHTMLElement,&IID_IHTMLElement> pElement, BSTR Text, LPRECT Rect)
{
    long Top = 0;
    long Hight = 0;
    long Left = 0;
    long Width = 0;
    
    CComPtr<IDispatch> pDisp = NULL;    
    
    if (pWebBrowser2)
    {
        pWebBrowser2->get_Document (&pDisp);
        if (pDisp)
        {
            CComPtr<IHTMLDocument2> pDoc = NULL;
            pDisp->QueryInterface (IID_IHTMLDocument2, (void **) &pDoc);    
            
            if (pDoc)
            {
                CComPtr<IHTMLFramesCollection2> m_frame = NULL;
                pDoc->get_frames(&m_frame);
                
                if (m_frame)
                {
                    long len = 0;
                    m_frame->get_length (&len);
                    if (len)
                    {    
                        CComQIPtr<IHTMLElement> pEl ;
                        if (SUCCEEDED(pDoc2->get_body(&pEl)))
                        {    
                            CComQIPtr<IHTMLBodyElement> pBodyElement ;
                            pBodyElement = pEl;    
                            if (pBodyElement)
                            {
                                CComQIPtr<IHTMLTxtRange> pTxtRange;
                                pBodyElement->createTextRange(&pTxtRange);
                                if (pTxtRange)
                                {
                                    if (pTxtRange->moveToElementText(pElement) == S_OK)
                                    {
                                        VARIANT_BOOL ok; 
                                        if (pTxtRange->findText(Text,wcslen(Text),0,&ok) == S_OK)
                                        {
                                            CComQIPtr<IHTMLTextRangeMetrics2> pTextRangeMetrics2;
                                            pTextRangeMetrics2 = pTxtRange;
                                            
                                            CComQIPtr<IHTMLRectCollection> ptrRectColl;
                                            CComQIPtr<IHTMLRect> ptrHTMLRect;
                                            
                                            if (pTextRangeMetrics2->getClientRects(&ptrRectColl) == S_OK)
                                            {
                                                long Len;
                                                ptrRectColl->get_length(&Len);
                                                
                                                if (Len)
                                                {
                                                    VARIANT VarInd, VarDisp;
                                                    VarInd.vt = VT_I4;
                                                    
                                                    
                                                    
                                                    for(int i = 0; i < Len;i++)
                                                    {
                                                        VarInd.lVal = i;
                                                        
                                                        ptrRectColl->item (&VarInd, &VarDisp);
                                                        ptrHTMLRect = VarDisp.pdispVal;
                                                        
                                                        long Top = 0;
                                                        long Right = 0;
                                                        long Left = 0;
                                                        long Bottom = 0;
                                                        
                                                        if (ptrHTMLRect)
                                                        {
                                                        ptrHTMLRect->get_left  (&Left);
                                                        ptrHTMLRect->get_top   (&Top);
                                                        ptrHTMLRect->get_right (&Right);
                                                        ptrHTMLRect->get_bottom(&Bottom);

//!!! Left, Top, Right,  Bottom    - всегда 0                                                 
                                                        }
                                                        
                                                    SetRect(Rect, Left, Top, Right, Bottom);
                                                        
                                                    }
                                                }
                                                else
                                                {
                                                    pElement->get_offsetHeight(&Hight);
                                                    pElement->get_offsetWidth(&Width);
                                                    
                                                    pElement->get_offsetTop(&Top);
                                                    pElement->get_offsetLeft(&Left);
                                                    IHTMLElement* pParentElement = NULL;
                                                    
                                            while (SUCCEEDED(pElement->get_offsetParent(&pParentElement)))
                                                    {
                                                        if (!pParentElement) break;
                                                        long ParentLeft, ParentTop;
                                                    pParentElement->get_offsetTop(&ParentTop);
                                                    pParentElement->get_offsetLeft(&ParentLeft);
                                                        Top += ParentTop;
                                                        Left +=ParentLeft;                        
                                                        pElement = pParentElement;
                                                        pParentElement->Release();
                                                    }
                                                }
                                                
                                                ptrRectColl.Detach();
                                                
                                            }
                                        }
                                    }
                                    
                                }
                            }
                        }
                        
                    }  
                    else // no frames
                    {
                        
                        CComQIPtr<IHTMLElement2> pElement2(pElement);
                        CComPtr<IHTMLRect> BoundingRect;
                        if (pElement2)
                        {
                            if (SUCCEEDED(pElement2->getBoundingClientRect(&BoundingRect)) && BoundingRect)
                            {
                                BoundingRect->get_top(&Top);
                                BoundingRect->get_left(&Left);                                
                            }
                            else
                            {
                                Top = 0; Left = 0;
                            }
                        }
                        pElement->get_offsetHeight(&Hight);
                        pElement->get_offsetWidth(&Width);
                        
                        SetRect(Rect, Left, Top, Left + Width, Top + Hight);    
                    }
                }
                else //m_frame == 0
                {
                    CComQIPtr<IHTMLElement2> pElement2(pElement);
                    CComPtr<IHTMLRect> BoundingRect;
                    if (pElement2)
                    {
                        if (SUCCEEDED(pElement2->getBoundingClientRect(&BoundingRect)) && BoundingRect)
                        {
                            BoundingRect->get_top(&Top);
                            BoundingRect->get_left(&Left);                                
                        }
                        else
                        {
                            Top = 0; Left = 0;
                        }
                    }
                    pElement->get_offsetHeight(&Hight);
                    pElement->get_offsetWidth(&Width);

                    SetRect(Rect, Left, Top, Left + Width, Top + Hight);    
                }
            }
            
        }
        
    }    


    if (IsRectEmpty(Rect)) Beep(200,100); - срабатывает на этих таб элементах
}




Функция работает везде кроме как на этих элементах. Как получить эти координаты то? уже голову сломал.
Заранее спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.