Код для создания элемента управления DHTMLEd, заменяющего прямые кавычки фигурными
Вопрос
У меня есть старое, устаревшее приложение 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.