Word对象模型:如何检测断字范围并获取各部分的边界框
解决Word断字单词的边界框获取问题
针对VB.NET开发拼写检查器时,使用GetPoint()获取断字错误单词边界框出现跨行大框的问题,可通过以下方案解决:
核心思路
- 判断单词是否断字跨行:通过Range的
Information属性检查单词首尾字符是否在同一行 - 拆分断字范围:将跨两行的单词拆分为两个独立子范围,分别对应行尾部分和新行部分
- 分别获取边界框:对两个子范围单独调用
GetPoint()获取各自的坐标框
具体实现代码
修改后的范围边界框获取函数
Public Function getRangeRectangle(w As Word.Window, r As Word.Range) As List(Of System.Drawing.Rectangle) Dim rectangles As New List(Of System.Drawing.Rectangle) Dim left As Integer, top As Integer, width As Integer, height As Integer Try ' 检查单词是否跨多行(断字) Dim firstLine As Integer = r.Information(Word.WdInformation.wdFirstCharacterLineNumber) Dim lastLine As Integer = r.Information(Word.WdInformation.wdLastCharacterLineNumber) If firstLine = lastLine Then ' 非断字单词,直接获取边界框 w.GetPoint(left, top, width, height, r) rectangles.Add(New System.Drawing.Rectangle(left, top, width, height)) gfrm_Drawing.DrawRectangle(rectangles(0), System.Drawing.Color.Orange) Else ' 断字单词,拆分为两个子范围 ' 第一个子范围:原单词在第一行的部分 Dim part1 As Word.Range = r.Duplicate part1.End = part1.EndOf(Word.WdUnits.wdLine, Word.WdMovementType.wdMove) ' 第二个子范围:原单词在第二行的部分 Dim part2 As Word.Range = r.Duplicate part2.Start = part1.End ' 分别获取两个子范围的边界框 w.GetPoint(left, top, width, height, part1) rectangles.Add(New System.Drawing.Rectangle(left, top, width, height)) gfrm_Drawing.DrawRectangle(rectangles(0), System.Drawing.Color.Orange) w.GetPoint(left, top, width, height, part2) rectangles.Add(New System.Drawing.Rectangle(left, top, width, height)) gfrm_Drawing.DrawRectangle(rectangles(1), System.Drawing.Color.Orange) End If Catch ex As Exception ' 异常处理 rectangles.Add(New System.Drawing.Rectangle()) End Try Return rectangles End Function
关键说明
- 用
wdFirstCharacterLineNumber和wdLastCharacterLineNumber判断单词是否跨行,无需依赖隐藏字符即可检测断字 - 拆分范围时通过
EndOf(wdLine)精准定位第一行结束位置,确保断字部分分割准确 - 返回值改为
List(Of Rectangle),适配断字场景下的多边界框返回需求
内容的提问来源于stack exchange,提问作者MirrorMirror
相关产品推荐
相关产品推荐

