65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Microsoft Office Word 进行拼写检查和下划线错误单词

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.03/5 (20投票s)

2007年5月15日

CPOL

4分钟阅读

viewsIcon

129052

downloadIcon

2871

如何使用 Microsoft Office Word 为错误单词添加下划线

Screenshot - 1.jpg

引言

当我们在为一个项目编写代码,并且需要实现每个部分的特定功能时,如果尝试将它们组合在一起,就会发现很难在逻辑上进行安排。

写这篇文章的主要想法是,我当时正在为一个项目编写代码,我们需要一个可以进行拼写检查并划出错误单词的文本框。但是,主要要求是必须使用 Microsoft 的 Word Interop 来实现。

本文将向您展示如何使用 Word 的拼写检查功能并在文本框中划出错误单词。

当用户开始在文本框中输入并按下空格键时,我们的功能将根据 Word 的拼写检查功能来验证最后一个输入的单词。如果单词错误,则会划出该单词。当用户右键单击划出的错误单词时,用户将看到一个菜单,其中包含该错误单词的可选更正方案。一旦用户从菜单中选择了一个选项,该选项将替换错误的单词。

代码探索

要实现拼写检查功能,您可以直接在窗体上编写代码,也可以创建用户控件。如果您想创建一个用户控件来整合此功能,您必须使用 Richtextbox 作为基类,因为我们将在 Richtextbox 中实现拼写检查功能。

步骤 1:在解决方案下添加新类文件

我们将创建一个包含此功能的控件。因此,在解决方案下添加一个类(.vb)文件。如上所述,使用 RichTextBox 作为基类。

Public Class SpellCheckTextBox
Inherits RichTextBox 

步骤 2:添加引用

现在我们的类已经准备好了,但是我们将需要 Microsoft Word 的 DLL 引用。因此,我们需要添加 Microsoft Word Object library 的引用。要添加引用,请右键单击解决方案 -> 添加引用 -> COM 选项卡,然后选择 Microsoft Word Object library。

Screenshot - 1.jpg

现在已经向项目添加了引用,我们可以使用 Office 的命名空间。

Imports Microsoft.Office 

步骤 3:开始编写事件

您需要添加的第一个事件是 Textbox KeyUp 事件。这是因为,当用户开始输入时,我们将识别空格,当用户按下空格键时,意味着他/她已经输入了一个完整的单词,我们将需要对其进行验证。

Textbox KeyUp 事件下编写此代码。

If (Me.Text.Length = 0) Then
Me.SelectionFont = New Font(Me.SelectionFont.FontFamily, _
                Me.SelectionFont.Size, FontStyle.Regular)
Me.Refresh()

End If

If (e.KeyValue = 32) Then
    Dim m_strRecentWord As String = String.Empty
    Dim m_intLastIndex As Integer = Me.Text.Substring_
                (0, Me.SelectionStart - 1).LastIndexOf(" ")
    Dim m_intLength As Integer = Me.SelectionStart - m_intLastIndex - 2
    m_strRecentWord = Me.Text.Substring(m_intLastIndex + 1, m_intLength)
    m_strRecentWord = m_strRecentWord.Trim()
    If (m_strRecentWord.Length > 0 And IsWrongWord_
                            (m_strRecentWord) = True) Then
        Me.SelectionStart = m_intLastIndex + 1
        Me.SelectionLength = m_intLength
        Me.SelectionFont = New Font(Me.SelectionFont.FontFamily, _
                        Me.SelectionFont.Size, FontStyle.Underline)
        Me.SelectionStart = Me.SelectionStart + Me.SelectionLength + 1
        Me.Refresh()
    End If
End If 

一旦单词根据 Word 的拼写检查功能进行了验证,如果它是错误的,则将其划出为错误单词。在 RichTextBox 中,如果我们想更改特定区域的格式,我们只需要更改选定的文本。

现在,我们的错误单词已在 RichTextBox 中被划出。我们的下一步将是通过右键单击该错误单词,从菜单中进行选择来替换它。

我们将通过 RichTextbox MouseDown 事件来实现这一点。当我们右键单击一个错误单词时,我们的任务是获取那个被右键单击的单词。要选择被右键单击的单词,我们使用 GetCharIndexFromPosition 函数来获取 RichTextBox 中被右键单击字符的索引。一旦获得该字符的索引,我们将从此索引向右和向左查找空格。为此,我们将把 RichTextBox 的内容分成三部分。以下代码将解释一切。只需将此代码粘贴到 RichTextBox MouseDown 事件中。

If (Me.SpellCheck = False) Then
    If (e.Button = Windows.Forms.MouseButtons.Right) Then
        Dim m_objContextMenuStrip As New ContextMenuStrip
        'get string from starting to clicked position
        Dim m_intClickIndex As Int16 = _
           Me.GetCharIndexFromPosition(New Point(e.X, e.Y))
        'index of clicked char
        Dim m_strInitialString As String = Me.Text.Substring_
                        (0, m_intClickIndex)
        'initialise index upto total length in case 
    'we are clicking on last word
        Dim m_intStartIndex As Int16 = Me.Text.Length - 1
        'if clicked word is not last word
        If (Me.Text.IndexOf(" ", m_intClickIndex) <> -1) Then
           m_intStartIndex = Me.Text.IndexOf(" ", m_intClickIndex)
        End If
        'moving towards starting of string from clicked position
        Dim m_intLastIndex As Int16 = m_strInitialString.LastIndexOf(" ")
        'original clicked word
        Dim m_strWord As String = Me.Text.Substring_
        (m_intLastIndex + 1, m_intStartIndex - m_intLastIndex)
        If (m_strWord.Length > 0) Then
            Dim m_doc As Word.Document = m_app.Documents.Add()
            Dim m_listOfAlternateWords As Word.SpellingSuggestions = _
                m_app.GetSpellingSuggestions(m_strWord)
            If m_listOfAlternateWords.Count > 0 Then
               m_objContextMenuStrip.Items.Clear()
               Dim m_word As Integer
                For m_word = 1 To m_listOfAlternateWords.Count
                   Dim Item As New ToolStripMenuItem()
                   Item.Name = m_listOfAlternateWords.Item(m_word).Name
                   Item.Text = Item.Name
                   Item.Tag = New Int16() {m_intLastIndex, m_intStartIndex}
                   AddHandler Item.Click, AddressOf ToolStripMenuItem_Click
                   m_objContextMenuStrip.Items.Add(Item)
                   Next
                   If (m_objContextMenuStrip.Items.Count > 0) Then
                       m_objContextMenuStrip.Show(Me, New Point(e.X, e.Y))
                   End If
            End If
         End If
         m_objContextMenuStrip = Nothing
     End If
End If

这样,我们现在就有了被右键单击的单词。将其发送到 Word 的拼写检查功能以获取选项。如果有多个结果,则意味着该单词有建议。因此,创建一个菜单,并将所有建议作为菜单项。我们正在使用每个菜单项的 Tag 属性来存储被右键单击单词的起始和结束索引。因此,这两个索引将用于用菜单中选择的选项替换被右键单击的单词。

以下是一些我在编码过程中使用的函数。

Private Function IsWrongWord(ByVal m_strWord As String) As Boolean
        Dim m_listOfAlternateWords As Word.SpellingSuggestions = _
                m_app.GetSpellingSuggestions(m_strWord)
        If (m_listOfAlternateWords.Count > 0) Then
            Return True
        Else
            Return False
        End If
End Function

Private Sub UnderLineWrongWords()
       Me.SelectionStart = 0
        'Dim app As Word.Application = New Word.Application()
        Dim m_range As Word.Range
        'm_app.Documents.Add()
       m_range = m_app.ActiveDocument.Range
        m_range.InsertAfter(Me.Text)
        Dim m_spellCollection As Word.ProofreadingErrors = _
                    m_range.SpellingErrors
        Dim m_intWord As Integer
        Dim m_font As Font = Me.SelectionFont
        Dim m_strIndex As Int16 = 0
        For m_intWord = 1 To m_spellCollection.Count
            Me.Find(m_spellCollection.Item(m_intWord).Text, _
            m_strIndex, RichTextBoxFinds.WholeWord) ', _
        RichTextBoxFinds.WholeWord, RichTextBoxFinds.WholeWord)
            m_strIndex = Me.Text.IndexOf(m_spellCollection.Item_
                    (m_intWord).Text, m_strIndex)
            Me.SelectionFont = New Font(m_font.FontFamily, m_font.Size, _
                            FontStyle.Underline)
        Next
        Me.SelectionStart = Me.SelectionStart + Me.SelectionLength + 1
        Me.Refresh()
End Sub

Private Sub SpellChecking()
        If (Me.Text.Length > 0) Then
            m_app.Visible = False
            m_app.WindowState = 0
            Dim m_template As Object = Missing.Value
            Dim m_newTemplate As Object = Missing.Value
            Dim m_documentType As Object = Missing.Value
            Dim m_visible As Object = False
            Dim m_optional As Object = Missing.Value
            Dim m_doc As Word.Document = m_app.Documents.Add_
        (m_template, m_newTemplate, m_documentType, m_visible)
            m_doc.Words.First.InsertBefore(Me.Text)
            Dim m_we As Word.ProofreadingErrors = m_doc.SpellingErrors _
        m_doc.CheckSpelling(m_optional, m_optional, m_optional, _
        m_optional, m_optional, m_optional, m_optional, m_optional, _
        m_optional, m_optional, m_optional, m_optional)
            Dim m_first As Object = 0
            Dim m_last As Object = m_doc.Characters.Count - 1
            Me.Text = m_doc.Range(m_first, m_last).Text
            Dim m_saveChanges As Object = False
            Dim m_originalFormat As Object = Missing.Value
            Dim m_routeDocument As Object = Missing.Value
            m_app.Quit(m_saveChanges, m_originalFormat, m_routeDocument)
            Me.SelectionStart = 0
            Me.SelectionLength = Me.Text.Length
            Me.SelectionFont = New Font(Me.SelectionFont.FontFamily, _
                Me.SelectionFont.Size, FontStyle.Regular)
            Me.Refresh()
            Me.SelectionStart = Me.Text.Length
            m_app = New Word.Application()
            m_doc = m_app.Documents.Add()
        End If
End Sub

当我们在菜单中选择任何选项时,我们将使用菜单项的 Tag 属性将错误单词替换为选定的选项。这是代码。将其粘贴到菜单项单击事件中。

Dim m_item As ToolStripMenuItem = CType(sender, ToolStripMenuItem)
Dim m_pointArray As Int16() = CType(m_item.Tag, Int16())
Dim m_strFirstPart As String = String.Empty
If (m_pointArray(0) > 0) Then
    m_strFirstPart = Me.Text.Substring(0, m_pointArray(0)) + " "
End If
Dim m_strMiddlePart As String = Me.Text.Substring(m_pointArray(0) + 1, _
                    m_pointArray(1) - m_pointArray(0))
Dim m_strLastPart As String = Me.Text.Substring(m_pointArray(1) + 1)
Me.SelectionStart = m_pointArray(0) + 1
Me.SelectionLength = m_strMiddlePart.Length
Me.SelectionFont = New Font(Me.SelectionFont.FontFamily, _
            Me.SelectionFont.Size, FontStyle.Regular)
Me.SelectedText = m_item.Text + " "
Me.Refresh() 

也有可能有人在 RichTextBox 中粘贴文本,在这种情况下,我们的划线功能将不会被使用。因此,我们必须在 RichTextBox Leave 事件中调用相同的函数。因此,将此代码写入 RichTextBox Leave 事件中。

UnderLineWrongWords()
Call SpellChecking() 

请注意,当我们划出错误单词时,我们正在调用 Word 的拼写检查对话框。我们已经在上面涵盖了此函数。

最后,重写 Dispose 方法。

Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
    If disposing Then
        If Not (m_app Is Nothing) Then
            Dim m_saveChanges As Object = False
            Dim m_originalFormat As Object = Missing.Value
            Dim m_routeDocument As Object = Missing.Value
            'm_app.Documents.Close(False)
            m_app.Quit(m_saveChanges, m_originalFormat, m_routeDocument)
            m_app = Nothing
        End If
    End If
    MyBase.Dispose(disposing)
End Sub

因此,这是将 Word 的拼写检查整合到我们的应用程序中的方法。

© . All rights reserved.