Можно ли получить индекс (начальную позицию) для выделенного текста в элементе управления WebBrowser? - PullRequest
1 голос
/ 03 декабря 2009

Я хотел бы получить индекс (начальную позицию) для выделенного текста в элементе управления WebBrowser. Аналогично индексу, который вы получите при поиске по регулярному выражению.

Я хочу получить "номер строки и столбца" выделенного текста. Они могут быть определены на основе индекса выбора.

Я пытался использовать IHTMLTxtRange в сочетании с IDisplayServices / IHTMLCaret, но лучшее, что я могу получить, - это расположение точек.

Если "точечные местоположения" можно преобразовать в положение символа, которое также будет работать.

Какой самый простой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 16 декабря 2009

Вы можете попробовать MoveMarkupPointerToCaret и IMarkupPointer :: Left или IMarkupPointer2 :: GetMarkupPosition для проверки расположения каретки.

0 голосов
/ 18 декабря 2009

В качестве быстрого исправления я использовал событие MouseUp расширенного элемента управления WebBrowser для получения позиции курсора. Я использовал это, чтобы получить элемент в текущем выбранном / выделенном тексте в элементе управления WebBrowser.

Dim ScreenCoord As New Point(MousePosition.X, MousePosition.Y)
Dim BrowserCoord As Point = webBrowser1.PointToClient(ScreenCoord)
Dim elem As HtmlElement = webbrowser1.Document.GetElementFromPoint(BrowserCoord)

Я использовал вспомогательную функцию, чтобы получить индекс элемента в позиции курсора.

Function getIndexforElement(elem As htmlElement, browser As webbrowser) As Integer
    Dim page as mshtml.HTMLdocument
    Dim Elements as mshtml.IHTMLElementCollection
    Dim elemCount As Integer = 0
    page = browser.document.Domdocument
    elements = page.getElementsByTagName(elem.TagName)
    For Each element As mshtml.IHTMLElement In elements
        elemCount = elemCount + 1
        If (elem.OffsetRectangle.Top = element.offsetTop) And (elem.OffsetRectangle.Left = element.offsetLeft) Then
            Exit For
        End If
    Next
    If elemCount > 0 Then
        Dim matches as MatchCollection = regex.Matches(browser.DocumentText,"<" & elem.TagName,regexoptions.IgnoreCase Or regexoptions.Multiline)
        Return matches(elemCount-1).Index + 1
    Else
        Return 0
    End If  
End Function

Имея индекс элемента, можно использовать простое регулярное выражение для поиска номера строки в исходном html-файле.

Function getLineNumber(textIn As String, index As Integer) As Integer
    textIn = textIn.Replace(VbCrLf,VbLf)
    Dim line as Integer = regex.Matches(textIn.Substring(0,index),"\n",RegexOptions.Multiline).Count + 1                                                                                 
    If line < 1 Then line = 1
    Return line
End Function
...