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






3.03/5 (20投票s)
如何使用 Microsoft Office Word 为错误单词添加下划线

引言
当我们在为一个项目编写代码,并且需要实现每个部分的特定功能时,如果尝试将它们组合在一起,就会发现很难在逻辑上进行安排。
写这篇文章的主要想法是,我当时正在为一个项目编写代码,我们需要一个可以进行拼写检查并划出错误单词的文本框。但是,主要要求是必须使用 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。

现在已经向项目添加了引用,我们可以使用 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 的拼写检查整合到我们的应用程序中的方法。