У меня есть старое, устаревшее приложение VB6, которое использует элемент управления редактированием DHTML в качестве редактора HTML. Элемент управления редактированием Microsoft DHTML, также известный как DHTMLEd, вероятно, представляет собой не что иное, как элемент управления IE, использующий собственные собственные возможности редактирования IE внутри.
Я хотел бы изменить приложение, чтобы реализовать умные кавычки, такие как Word. В частности, " заменяется на « или ”, а ' заменяется на ‘ или ’, в зависимости от того, что вводится; и если пользователь нажимает Ctrl + Z сразу после замены, это снова становится прямой цитатой.
У кого-нибудь есть код, который это делает?
Если у вас нет кода для DHTML / VB6, но есть код JavaScript, который работает в браузере с областями contentEditable, я мог бы использовать и его.
Вот версия 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, если вы ориентируетесь на Windows Vista.
Кстати, мне нравится реализация IsLetter () ... настоящая жемчужина программирования!
Спасибо за похвалу; никогда не думал, что услышу что-то подобное от легенды программирования :) Что касается IsLetter: используйте IsCharAlphaW или другой метод, поддерживающий Unicode. Моя реализация была быстрой и грязной, чтобы не отвлекать от сути моего ответа :)
Ух ты! Спасибо! Отличная работа! Сработало с первого раза. Я все еще немного подправлю его, чтобы справиться с несколькими странными случаями, но это потрясающе.