在包含超链接的richtext框v5中选择文本时发生奇怪的移位

当我使用RichTextBox.Select(int start,int length)函数在包含超链接的富文本框中选择文本时,当我尝试选择超链接之后的任何文本时,选择中会有一些变化。

当我删除超链接时,选择正常。

编辑:我使用RichTextBox 5(Visual Studio中的默认值是版本4)

public class RichText50W : RichTextBox { [DllImport("kernel32.dll", CharSet = CharSet.Auto)] static extern IntPtr LoadLibrary(string lpFileName); protected override CreateParams CreateParams { get { CreateParams prams = base.CreateParams; if (LoadLibrary("msftedit.dll") != IntPtr.Zero) { prams.ClassName = "RICHEDIT50W"; } return prams; } } } 

只有richtextbox 5+才会出现此问题。

这些图像显示了问题和行为的差异。

如果您尝试这样做,请确保将richtextboxes的HideSelection属性设置为“false”。

选择function显示在按钮上。

选择(10,1)

对于RTB5,应在上图中选择“文本”中的“e”。

选择(40,1)

选择(46,1)

显然,RTB5会选择一些隐藏文字。

我需要它只根据可见文本进行选择。

RTB 4在使用表时有问题,所以我不想使用它。

我使用.NET 2.0

编辑:要在Visual Studio中尝试此操作,请从默认的richtextbox开始,并将其声明更改为RichText50W而不是RichTextBox

RichEdit 6也有同样的问题。

谢谢

根据我自己的经验,当使用嵌入式超链接或隐藏文本(使用rtf代码\ v \ v0)时,版本“RICHEDIT50W”会被严重破坏。

在v5框中, Text.Length属性报告14个字符 – 它显示的内容。 TextLength属性报告51个字符。 SelectionStartSelectionLength属性都报告“隐藏文本”数字,但控件不再为您提供获取隐藏文本的方法。 这意味着当您的富文本具有隐藏字符时,“文本”和相关的“文本选择”信息将变得不可用。

我认为唯一的解决方案是不使用“RICHEDIT50W”版本,如果有隐藏的字符或浏览市场以获得更好的富文本控制。

只有一点点晚了。 这可能有所帮助,也可能没用,我还没有使用过这种控制。 以下代码复制自http://www.codeproject.com/Messages/3401956/NET-Richedit-Control.aspx 。 注意// Check Unicode or ANSI system and set appropriate ClassName.

 using System; using System.Windows.Forms; using System.Runtime.InteropServices; namespace RichEditor { public class RichTextBoxEx : RichTextBox { private IntPtr mHandle = IntPtr.Zero; protected override CreateParams CreateParams { get { //Prevent module being loaded multiple times. if (this.mHandle == IntPtr.Zero) { //load the library to obtain an instance of the RichEdit50 class. this.mHandle = LoadLibrary("msftedit.dll"); } //If module loaded, reset ClassName. if (this.mHandle != IntPtr.Zero) { CreateParams cParams = base.CreateParams; // Check Unicode or ANSI system and set appropriate ClassName. if (Marshal.SystemDefaultCharSize == 1) { cParams.ClassName = "RichEdit50A"; } else { cParams.ClassName = "RichEdit50W"; } return cParams; } else // Module wasnt loaded, return default .NET RichEdit20 CreateParams. { return base.CreateParams; } } } ~RichTextBoxEx() { //Free loaded Library. if (mHandle != IntPtr.Zero) { FreeLibrary(mHandle); } } [DllImport("kernel32.dll", SetLastError = true)] private static extern IntPtr LoadLibrary(String lpFileName); [DllImport("kernel32.dll", SetLastError = true)] private static extern bool FreeLibrary(IntPtr hModule); } }