我有一个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
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文档或主要项目文档,以免出现意外。