Код для создания элемента управления DHTMLEd, заменяющего прямые кавычки фигурными

StackOverflow https://stackoverflow.com/questions/61598

  •  09-06-2019
  •  | 
  •  

Вопрос

У меня есть старое, устаревшее приложение VB6, которое использует элемент управления редактированием DHTML в качестве HTML-редактора.Элемент управления редактированием Microsoft DHTML, он же.DHTMLEd, вероятно, является не чем иным, как элементом управления IE, использующим собственные возможности редактирования IE внутри.

Я бы хотел модифицировать приложение для реализации умных кавычек, таких как Word.В частности, " заменяется на или и ' заменяется на или настолько уместно, насколько это набрано;и если пользователь нажимает Ctrl + Z сразу после замены, это снова становится прямой цитатой.

У кого-нибудь есть код, который это делает?

Если у вас нет кода для DHTML / VB6, но есть код JavaScript, который работает в браузере с регионами, доступными для редактирования, я мог бы использовать и это

Это было полезно?

Решение

Вот версия VB6:

Private Sub DHTMLEdit1_onkeypress()
    Dim e As Object
    Set e = DHTMLEdit1.DOM.parentWindow.event
    'Perform smart-quote replacement'
    Select Case e.keyCode
    Case 34: 'Double-Quote'
        e.keyCode = 0
        If IsAtWordEnd Then
            InsertDoubleUndo ChrW$(8221), ChrW$(34)
        Else
            InsertDoubleUndo ChrW$(8220), ChrW$(34)
        End If
    Case 39: 'Single-Quote'
        e.keyCode = 0
        If IsAtWordEnd Then
            InsertDoubleUndo ChrW$(8217), ChrW$(39)
        Else
            InsertDoubleUndo ChrW$(8216), ChrW$(39)
        End If
    End Select
End Sub

Private Function IsLetter(ByVal character As String) As Boolean
    IsLetter = UCase$(character) <> LCase$(character)
End Function

Private Sub InsertDoubleUndo(VisibleText As String, HiddenText As String)
    Dim selection As Object
    Set selection = DHTMLEdit1.DOM.selection.createRange()
    selection.Text = HiddenText
    selection.moveStart "character", -Len(HiddenText)
    selection.Text = VisibleText
End Sub

Private Function IsAtWordEnd() As Boolean

    Dim ch As String
    ch = PreviousChar
    IsAtWordEnd = (ch <> " ") And (ch <> "")

End Function

Private Function PreviousChar() As String

    Dim selection As Object
    Set selection = m_dom.selection.createRange()
    selection.moveStart "character", -1
    PreviousChar = selection.Text

End Function

Примечание:это решение вставляет дополнительный уровень в цепочку отмены.Например, ввод "Это тест" дает цепочку “Это тест” -> “Это тест" -> “Это испытание -> “ -> " (дополнительный уровень выделен жирным шрифтом).Чтобы удалить этот дополнительный уровень, вам нужно было бы реализовать какой-то PostMessage+subclassing решение, которое не требует отмены собственного нажатия клавиши

Редактировать:Не забудьте включить Распространяемый элемент управления редактированием DHTML если вы ориентируетесь на Windows Vista.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top