我有一个旧的 VB6 应用程序,它使用 DHTML 编辑控件作为 HTML 编辑器。Microsoft DHTML 编辑控件,又名:DHTMLEd,可能只不过是一个内部使用 IE 自身原生编辑功能的 IE 控件。

我想修改应用程序以实现像 Word 一样的智能引号。具体来说, " 被替换为 或者 ' 被替换为 或者 与键入的内容一致;如果用户在替换后立即按 Ctrl+Z,则它将恢复为直引号。

有人有这样做的代码吗?

如果您没有 DHTML/VB6 代码,但有可在具有 contentEditable 区域的浏览器中运行的 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