2011-05-10 79 views
13

我想知道是否有可能獲得我用C#加載webbrowser控件的特定HTML元素的絕對位置。獲取HTML元素在webbrowser控件中的絕對位置用C#

我嘗試了幾乎所有的.Net提供的選項.. 沒有一個給我正確的位置。所有他們給我0的Y座標..元素絕對不是在0 ..

有沒有人有任何解決方案或想法來解決這個問題?

+0

什麼是你想實現什麼?一旦真正的問題出現,提供迴應就會變得容易得多。 – agradl 2011-05-10 18:32:22

+0

我想截圖到特定的元素..我需要滾動到指定的元素,然後設置寬度+高度的webbrowser控件類似於該元素..最後採取截圖到該元素.. – SolidSnake 2011-05-10 18:35:18

回答

11

這裏是我到目前爲止的解決方案:

//設置我們的網絡瀏覽器的尺寸是尺寸圖像 INT寬度不變,高度; width = webBrowser1.Document.Images [0] .ClientRectangle.Width; height = webBrowser1.Document.Images [0] .ClientRectangle.Height;

webBrowser1.Width = width; 
webBrowser1.Height = height; 

//scroll vertically to that element 
webBrowser1.Document.Images[0].OffsetParent.ScrollIntoView(true); 

//calculate x, y offset of the element 
int x = webBrowser1.Document.Images[s].OffsetRectangle.Left + 
webBrowser1.Document.Images[s].OffsetParent.OffsetRectangle.Left + 
webBrowser1.Document.Images[s].OffsetParent.OffsetParent.OffsetRectangle.Left+ 
webBrowser1.Document.Images[s].OffsetParent.OffsetParent.OffsetParent.OffsetRectangle.Left+ 
webBrowser1.Document.Images[s].OffsetParent.OffsetParent.OffsetParent.OffsetParent.OffsetRectangle.Left; 

int y = webBrowser1.Document.GetElementsByTagName("HTML")[0].ScrollTop; 

//now scroll to that element 
webBrowser1.Document.Window.ScrollTo(x, y); 

現在這個代碼工作完美..但有一個問題與計算偏移。我需要計算元素的offsetparent,然後計算offsetparent的offsetparent等。我需要動態地不添加它一個接一個..我不知道該怎麼做。有任何想法嗎?

編輯: 這裏是我最後一次和最後的版本,它與任何HTML元素就會找到我想要的任何元素的絕對位置,工程..

public int getXoffset(HtmlElement el) 
    { 
     //get element pos 
     int xPos = el.OffsetRectangle.Left; 

     //get the parents pos 
     HtmlElement tempEl = el.OffsetParent; 
     while (tempEl != null) 
     { 
      xPos += tempEl.OffsetRectangle.Left; 
      tempEl = tempEl.OffsetParent; 
     } 

     return xPos; 
    } 

    public int getYoffset(HtmlElement el) 
    { 
     //get element pos 
     int yPos = el.OffsetRectangle.Top; 

     //get the parents pos 
     HtmlElement tempEl = el.OffsetParent; 
     while (tempEl != null) 
     { 
      yPos += tempEl.OffsetRectangle.Top; 
      tempEl = tempEl.OffsetParent; 
     } 

     return yPos; 
    } 

然後使用位置:

//now scroll to that element 
webBrowser1.Document.Window.ScrollTo(x, y); 

完成!

3

謝謝你,它像一個魅力。我不得不重寫它作爲VB,並想和大家分享的解決方案:

Function GetXOffSet(ByVal elem As HtmlElement) As Integer 
    Dim xPos As Integer = elem.OffsetRectangle.Left 
    Dim tElm As HtmlElement = elem.OffsetParent 
    Dim trig As Boolean = False 
    While Not trig 
     Try 
      xPos += tElm.OffsetRectangle.Left 
      tElm = tElm.OffsetParent 
     Catch ex As Exception 
      trig = True 
     End Try 
    End While 
    Return xPos 
End Function 

Function GetYOffSet(ByVal elem As HtmlElement) As Integer 
    Dim yPos As Integer = elem.OffsetRectangle.Top 
    Dim tElm As HtmlElement = elem.OffsetParent 
    Dim trig As Boolean = False 
    While Not trig 
     Try 
      yPos += tElm.OffsetRectangle.Top 
      tElm = tElm.OffsetParent 
     Catch ex As Exception 
      trig = True 
     End Try 
    End While 
    Return yPos 
End Function 
4

我喜歡以前的答案,而是通過父對象迭代兩次不是很有效。記住 - 你在這裏使用COM/ActiveX。這樣更快:

public Point GetOffset(HtmlElement el) 
{ 
    //get element pos 
    Point pos = new Point(el.OffsetRectangle.Left, el.OffsetRectangle.Top); 

    //get the parents pos 
    HtmlElement tempEl = el.OffsetParent; 
    while (tempEl != null) 
    { 
     pos.X += tempEl.OffsetRectangle.Left; 
     pos.Y += tempEl.OffsetRectangle.Top; 
     tempEl = tempEl.OffsetParent; 
    } 

    return pos; 
} 

然後

var point = GetOffset(element); 
var x = point.X; 
var y = point.Y; 
1

公正地分享基於我需要一個稍微不同的實現,以獲得絕對定位retangle:

public Rectangle GetAbsoluteRectangle(HtmlElement element) { 
    //get initial rectangle 
    Rectangle rect = element.OffsetRectangle; 

    //update with all parents' positions 
    HtmlElement currParent = element.OffsetParent; 
    while (currParent != null) { 
      rect.Offset(currParent.OffsetRectangle.Left, currParent.OffsetRectangle.Top); 
      currParent = currParent.OffsetParent; 
    } 

    return rect; 
} 
0

不知道爲什麼,但offsetparent是不是全部返回(IE11,地圖對象的情況下) 我不得不在parentOffset未提供時在循環中添加parentElement

While parent IsNot Nothing 
      y += parent.offsetTop 
      x += parent.offsetLeft 
      If parent.offsetParent IsNot Nothing Then 
       parent = parent.offsetParent 
      Else 
       parent = parent.parentElement 
      End If 
    End While 

而且你需要添加IE瀏覽器的位置,菜單的空間和邊界...

2

有一個直接的方式來獲得的座標。IHTMLElement2具有方法getBoundingClientRect,它給出了元素的座標。

IHTMLDocument3 doc = (IHTMLDocument3)this.webbrowser.Document; 
IHTMLElement2 element = (IHTMLElement2)doc.getElementById(idElement); 
IHTMLRect rect = element.getBoundingClientRect(); 

int x = rect.left; 
int y= rect.top; 
0

爲我的作品最徹底的方法是:

HtmlElement elem = webBrowser.Document.GetElementById(idElement); IHTMLRect rect = ((IHTMLElement2) elem.DomElement).getBoundingClientRect(); // rect.top and rect.left represent absolute coordinates.

相關問題