2008-09-14 8 views
9

У меня есть старое, унаследованное приложение VB6, которое использует редактор редактирования DHTML как HTML-редактор. Элемент управления DHTML Microsoft, a.k.a. DHTMLEd, вероятно, не что иное, как элемент управления IE, который использует внутреннюю возможность редактирования собственного IE.Код для управления DHTMLEd заменяет прямые кавычки с фигурными цитатами

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

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

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

ответ

14

Вот версия 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 Editing Control redistributable, если вы ориентируетесь на Windows Vista.

+1

Вау! Благодаря! Отлично сработано! Работал в первый раз. Я по-прежнему подкорректирую его немного, чтобы справиться с несколькими странными случаями, но это потрясающе. – 2008-09-15 15:03:31