Код для создания элемента управления DHTMLEd заменяет прямые кавычки на фигурные кавычки - PullRequest
10 голосов
/ 14 сентября 2008

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

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

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

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

1 Ответ

15 голосов
/ 15 сентября 2008

Вот версия 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, которое не включает отмену собственного нажатия клавиши

edit: не забудьте включить распространяемый DHTML Editing Control , если вы нацелены на Windows Vista.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...