2011-05-10 94 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.

相关问题