在richtextbox vb.net中获取段落的段落号(不是行号)

问题描述 投票:0回答:1

我有一个richtextbox,其中包含大量段落。 (仅供参考:所有段落将由vbCrlf分隔)

我需要知道光标位置的段落索引。

很容易找到行索引

    Dim line, index As Integer
    index = rtbScriptRTF.SelectionStart
    line = rtbScriptRTF.GetLineFromCharIndex(index)
    txtTestLINE.Text = line

这不是我要作为段落查找的内容,很容易占用很多行。

疯狂的事情是……我在这些页面上的某处看到了一段代码,只是那样,但我在任何地方都找不到!

[有人可以指出正确的方向,还是可以提供正确的语法帮助?谢谢!

编辑:我已经添加了使用的代码,但是现在不再可以使用键盘箭头导航文本-有解决方法吗?

Private Sub rtbScriptRTF_KeyDown(sender As Object, e As KeyEventArgs) Handles rtbScriptRTF.KeyDown
    Dim index As Integer
    Dim lineNum As Integer

    rtbScriptRTF.Focus()
    rtbScriptRTF.SuspendLayout()
    rtbScriptRTF.WordWrap = False


    Index = rtbScriptRTF.SelectionStart
    lineNum = rtbScriptRTF.GetLineFromCharIndex(index)
    txtTestLINE.Text = lineNum + 1

    rtbScriptRTF.WordWrap = True
    rtbScriptRTF.ResumeLayout()
End Sub
vb.net richtextbox paragraph
1个回答
0
投票

WinForm RichTextBox包装的本机RichEdit控件支持Text Object Model的子集。

TOM定义了大量的文本操作界面。文本解决方案(例如Microsoft Word和丰富的编辑控件)支持TOM功能集。

将项目COM引用添加到“ tom”以获得对.Net项目中接口定义的访问。然后,通过将ITextDocument interface发送到控件来获得对TOM EM_GETOLEINTERFACE message的引用。获得文档参考后,您可以像使用MS Word的对象模型一样浏览文档。

[在下面的示例中(在窗体上创建一个带有RichTextBox和标签的新WinForm项目),SelectionChanged事件用于显示标签中所选段落的编号。请注意,作为此COM,编号从索引一(1)开始而不是零(0)。创建RichTextBox句柄时,将获得存储在变量“ doc”中的文档参考。

' add project COM reference to "tom" 

Imports System.Runtime.InteropServices

Public Class Form1
  Private doc As tom.ITextDocument
  Private comCallCount As Int32 = 1 ' used to force GC to cleanup unreferenced COM object

  Public Sub New()
    InitializeComponent()
    PopulateRTB()
  End Sub

  Private Sub PopulateRTB()
    With RichTextBox1
      .AppendText("Paragraph 1: Lorem ipsum dolor sit amet, solum lobortis pri id, vocent volumus praesent nam ut. Impetus aliquip quo at. Eos nisl veniam fierent an, cu dictas veritus vivendo mea, ei sea eruditi prodesset percipitur. Duo in case eirmod adipiscing, qui habemus scriptorem id. Mei nihil facilisis cu, id sumo laboramus consectetuer vel. No nostrud aliquid quo. Nam doming melius scripta eu." & Environment.NewLine)
      .AppendText(Environment.NewLine)
      .AppendText("Paragraph 3: An pri consul adversarium, ea mel semper quaeque complectitur. Mea te solet concludaturque, ei mucius albucius sit. Per no lucilius detraxit adipisci, ut tamquam delenit cotidieque cum. Mea putent apeirian sapientem cu. Per saperet accumsan rationibus at." & Environment.NewLine)
      .AppendText(Environment.NewLine)
      .AppendText("Paragraph 5: Velit tollit voluptua pri ut. Convenire honestatis no nam, nulla legere salutatus at ius. Ea duo nisl everti aliquid, dolore aperiam tractatos te duo, quaeque veritus ad vim. At vim consul laoreet, inermis iudicabit et vim." & Environment.NewLine)
      .AppendText(Environment.NewLine)
      .AppendText("Paragraph 7: Altera efficiendi ad qui, ne quo viris moderatius. Idque singulis suavitate ea vix, vis at ancillae detraxit contentiones, has constituam sadipscing et. Eos et iudico corrumpit, augue nominavi ad mel. Impetus equidem eu duo. Ea sale legimus dignissim vix." & Environment.NewLine)
      .AppendText(Environment.NewLine)
      .AppendText("Paragraph 9: Et quodsi oblique iudicabit pro, an nam augue consulatu, ad cum graece malorum mediocritatem. Vivendo ullamcorper vim et, maiestatis accommodare sit cu. Duo vocent deleniti et, nec ei congue melius tamquam, modo phaedrum no sea. Ius at velit augue soleat." & Environment.NewLine)
    End With
  End Sub

  Private Sub RichTextBox1_HandleCreated(sender As Object, e As EventArgs) Handles RichTextBox1.HandleCreated
    Const WM_USER As Int32 = &H400
    Const EM_GETOLEINTERFACE As Int32 = WM_USER + 60
    If doc IsNot Nothing Then
      Marshal.FinalReleaseComObject(doc)
      doc = Nothing
    End If
    SendMessage(New HandleRef(Me, RichTextBox1.Handle), EM_GETOLEINTERFACE, IntPtr.Zero, doc)
  End Sub

  Private Sub RichTextBox1_HandleDestroyed(sender As Object, e As EventArgs) Handles RichTextBox1.HandleDestroyed
    If doc IsNot Nothing Then
      Marshal.FinalReleaseComObject(doc)
      doc = Nothing
    End If
  End Sub

  Private Sub RichTextBox1_SelectionChanged(sender As Object, e As EventArgs) Handles RichTextBox1.SelectionChanged
    Label1.Text = $"In paragraph number: {doc.Selection.GetIndex(tom.tomConstants.tomParagraph)}"
    comCallCount += 1
    If comCallCount = 10 Then
      CleanupUnreferencedCOM()
      comCallCount = 1
    End If
  End Sub

  Private Sub CleanupUnreferencedCOM()
    Do
      GC.Collect()
      GC.WaitForPendingFinalizers()
    Loop While Marshal.AreComObjectsAvailableForCleanup
  End Sub

  <DllImport("user32.dll", CharSet:=CharSet.Auto)>
  Public Shared Function SendMessage(ByVal hWnd As HandleRef, ByVal msg As Integer, ByVal wParam As IntPtr, ByRef lParam As tom.ITextDocument) As IntPtr
  End Function

End Class

[还有Bradley Smith的Managed Wrapper for the Text Object Model (TOM)库,使使用对象模型的工作更加轻松。如果选择使用此库,请注意作者通过托管代码添加了功能,并且库中同时存在基于零和一个的索引。因此,请确保您阅读了Intellisense文档或主要项目文档,以免出现意外。

© www.soinside.com 2019 - 2024. All rights reserved.